@@ -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