Skip to content

Commit ce8edce

Browse files
authored
Merge pull request #1 from gapitio/heartbeats
refactor: heartbeats only sends in new event/status
2 parents 2e37dcf + 0e703ae commit ce8edce

1 file changed

Lines changed: 51 additions & 43 deletions

File tree

alertaclient/commands/cmd_heartbeats.py

Lines changed: 51 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -54,60 +54,68 @@ def cli(obj, alert, severity, timeout, purge):
5454

5555
if alert:
5656
with click.progressbar(heartbeats, label=f'Alerting {len(heartbeats)} heartbeats') as bar:
57+
alerts = client.get_alerts(query=[('environment', 'Heartbeats')], page_size=len(heartbeats))
5758
for b in bar:
58-
59-
want_environment = b.attributes.pop('environment', 'Production')
59+
want_environment = b.attributes.pop('environment', 'Heartbeats')
6060
want_severity = b.attributes.pop('severity', severity)
6161
want_service = b.attributes.pop('service', ['Alerta'])
6262
want_group = b.attributes.pop('group', 'System')
63+
state_map = {
64+
'expired': {
65+
'event': 'HeartbeatFail',
66+
'value': f'{b.since}',
67+
'text': f'Heartbeat not received in {b.timeout} seconds',
68+
'severity': want_severity
69+
},
70+
'slow': {
71+
'event': 'HeartbeatSlow',
72+
'value': f'{b.latency}ms',
73+
'text': f'Heartbeat took more than {b.max_latency}ms to be processed',
74+
'severity': want_severity
75+
},
76+
'ok': {
77+
'event': 'HeartbeatOK',
78+
'value': '',
79+
'text': 'Heartbeat OK',
80+
'severity': default_normal_severity
81+
}
82+
}
6383

64-
if b.status == 'expired': # aka. "stale"
65-
client.send_alert(
66-
resource=b.origin,
67-
event='HeartbeatFail',
68-
environment=want_environment,
69-
severity=want_severity,
70-
correlate=['HeartbeatFail', 'HeartbeatSlow', 'HeartbeatOK'],
71-
service=want_service,
72-
group=want_group,
73-
value=f'{b.since}',
74-
text=f'Heartbeat not received in {b.timeout} seconds',
75-
tags=b.tags,
76-
attributes=b.attributes,
77-
origin=origin(),
78-
type='heartbeatAlert',
79-
timeout=timeout,
80-
customer=b.customer
81-
)
82-
elif b.status == 'slow':
83-
client.send_alert(
84-
resource=b.origin,
85-
event='HeartbeatSlow',
86-
environment=want_environment,
87-
severity=want_severity,
88-
correlate=['HeartbeatFail', 'HeartbeatSlow', 'HeartbeatOK'],
89-
service=want_service,
90-
group=want_group,
91-
value=f'{b.latency}ms',
92-
text=f'Heartbeat took more than {b.max_latency}ms to be processed',
93-
tags=b.tags,
94-
attributes=b.attributes,
95-
origin=origin(),
96-
type='heartbeatAlert',
97-
timeout=timeout,
98-
customer=b.customer
99-
)
100-
else:
84+
state = state_map[b.status]
85+
alert_exists = False
86+
for alert in alerts:
87+
if alert.environment == want_environment and alert.resource == b.origin:
88+
alert_exists = True
89+
if state['event'] != alert.event:
90+
client.send_alert(
91+
resource=b.origin,
92+
event=state['event'],
93+
environment=want_environment,
94+
severity=state['severity'],
95+
correlate=['HeartbeatFail', 'HeartbeatSlow', 'HeartbeatOK'],
96+
service=want_service,
97+
group=want_group,
98+
value=state['value'],
99+
text=state['text'],
100+
tags=b.tags,
101+
attributes=b.attributes,
102+
origin=origin(),
103+
type='heartbeatAlert',
104+
timeout=timeout,
105+
customer=b.customer
106+
)
107+
break
108+
if not alert_exists:
101109
client.send_alert(
102110
resource=b.origin,
103-
event='HeartbeatOK',
111+
event=state['event'],
104112
environment=want_environment,
105-
severity=default_normal_severity,
113+
severity=state['severity'],
106114
correlate=['HeartbeatFail', 'HeartbeatSlow', 'HeartbeatOK'],
107115
service=want_service,
108116
group=want_group,
109-
value='',
110-
text='Heartbeat OK',
117+
value=state['value'],
118+
text=state['text'],
111119
tags=b.tags,
112120
attributes=b.attributes,
113121
origin=origin(),

0 commit comments

Comments
 (0)