Skip to content

Commit 1363521

Browse files
authored
fix(provider): Zabbix enhancements (#1773)
1 parent 4d0c891 commit 1363521

File tree

4 files changed

+68
-36
lines changed

4 files changed

+68
-36
lines changed

keep-ui/app/alerts/alert-menu.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ export default function AlertMenu({
260260
active ? "bg-slate-200" : "text-gray-900"
261261
} ${
262262
!methodEnabled ? "text-slate-300 cursor-not-allowed" : ""
263-
} group flex items-center rounded-md px-2 py-2 text-xs`}
263+
} group flex w-full items-center rounded-md px-2 py-2 text-xs`}
264264
disabled={!methodEnabled}
265265
title={!methodEnabled ? "Missing required scopes" : ""}
266266
onClick={() => {

keep/api/logging.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ def dump(self):
143143
"level": "CRITICAL",
144144
"propagate": False,
145145
},
146+
"Environment": {
147+
"handlers": [],
148+
"level": "CRITICAL",
149+
"propagate": False,
150+
},
146151
},
147152
}
148153

keep/providers/zabbix_provider/zabbix_provider.py

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ class ZabbixProvider(BaseProvider):
170170
STATUS_MAP = {
171171
"problem": AlertStatus.FIRING,
172172
"ok": AlertStatus.RESOLVED,
173+
"resolved": AlertStatus.RESOLVED,
173174
"acknowledged": AlertStatus.ACKNOWLEDGED,
174175
"suppressed": AlertStatus.SUPPRESSED,
175176
}
@@ -427,12 +428,11 @@ def setup_webhook(
427428
{"name": "message", "value": "{ALERT.MESSAGE}"},
428429
{"name": "name", "value": "{EVENT.NAME}"},
429430
{"name": "service", "value": "{HOST.HOST}"},
430-
{"name": "severity", "value": "{TRIGGER.SEVERITY}"},
431-
{"name": "status", "value": "{TRIGGER.STATUS}"},
431+
{"name": "severity", "value": "{EVENT.SEVERITY}"},
432+
{"name": "status", "value": "{EVENT.STATUS}"},
432433
{"name": "tags", "value": "{EVENT.TAGSJSON}"},
433434
{"name": "description", "value": "{TRIGGER.DESCRIPTION}"},
434435
{"name": "ALERT.SUBJECT", "value": "{ALERT.SUBJECT}"},
435-
{"name": "EVENT.SEVERITY", "value": "{EVENT.SEVERITY}"},
436436
{"name": "EVENT.TIME", "value": "{EVENT.TIME}"},
437437
{"name": "EVENT.VALUE", "value": "{EVENT.VALUE}"},
438438
{"name": "HOST.IP", "value": "{HOST.IP}"},
@@ -577,18 +577,40 @@ def _format_alert(
577577
event_id = event.get("id")
578578
trigger_id = event.get("triggerId")
579579
zabbix_url = event.pop("ZABBIX.URL", None)
580+
581+
if zabbix_url == "{$ZABBIX.URL}":
582+
# This means user did not configure $ZABBIX.URL in Zabbix probably
583+
zabbix_url = None
584+
580585
url = None
581586
if event_id and trigger_id and zabbix_url:
582587
url = (
583588
f"{zabbix_url}/tr_events.php?triggerid={trigger_id}&eventid={event_id}"
584589
)
585590

586-
severity = ZabbixProvider.SEVERITIES_MAP.get(
587-
event.pop("severity", "").lower(), AlertSeverity.INFO
588-
)
589-
status = ZabbixProvider.STATUS_MAP.get(
590-
event.pop("status", "").lower(), AlertStatus.FIRING
591+
severity = event.pop("severity", "").lower()
592+
severity = ZabbixProvider.SEVERITIES_MAP.get(severity, AlertSeverity.INFO)
593+
594+
status = event.pop("status", "").lower()
595+
status = ZabbixProvider.STATUS_MAP.get(status, AlertStatus.FIRING)
596+
597+
last_received = event.pop(
598+
"lastReceived", datetime.datetime.now(tz=datetime.timezone.utc).isoformat()
591599
)
600+
if last_received == "{DATE} {TIME}":
601+
# This means it's a test message, just override.
602+
last_received = datetime.datetime.now(tz=datetime.timezone.utc).isoformat()
603+
else:
604+
last_received = datetime.datetime.strptime(
605+
last_received, "%Y.%m.%d %H:%M:%S"
606+
).isoformat()
607+
608+
message = event.pop("message", "")
609+
if "acknowledged problem" in message:
610+
status = AlertStatus.ACKNOWLEDGED
611+
elif "suppressed problem" in message:
612+
status = AlertStatus.SUPPRESSED
613+
592614
return AlertDto(
593615
**event,
594616
environment=environment,
@@ -597,6 +619,7 @@ def _format_alert(
597619
severity=severity,
598620
status=status,
599621
url=url,
622+
lastReceived=last_received,
600623
tags=tags,
601624
)
602625

keep/providers/zabbix_provider/zabbix_provider_script.js

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,51 @@ try {
22
var result = { tags: {} },
33
params = JSON.parse(value),
44
req = new HttpRequest(),
5-
resp = '';
5+
resp = "";
66

7-
if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {
8-
req.setProxy(params.HTTPProxy);
7+
if (typeof params.HTTPProxy === "string" && params.HTTPProxy.trim() !== "") {
8+
req.setProxy(params.HTTPProxy);
99
}
1010

11-
keepApiUrl = params['keepApiUrl'];
12-
if (!keepApiUrl || (typeof keepApiUrl === 'string' && keepApiUrl.trim() === '')) {
13-
throw 'incorrect value for variable "keepApiUrl". The value must be a non-empty URL.';
11+
keepApiUrl = params["keepApiUrl"];
12+
if (
13+
!keepApiUrl ||
14+
(typeof keepApiUrl === "string" && keepApiUrl.trim() === "")
15+
) {
16+
throw 'incorrect value for variable "keepApiUrl". The value must be a non-empty URL.';
1417
}
1518

16-
keepApiKey = params['keepApiKey'];
17-
if (!keepApiKey || (typeof keepApiKey === 'string' && keepApiKey.trim() === '')) {
18-
throw 'incorrect value for variable "keepApiKey". The value must be a non-empty API key.';
19+
keepApiKey = params["keepApiKey"];
20+
if (
21+
!keepApiKey ||
22+
(typeof keepApiKey === "string" && keepApiKey.trim() === "")
23+
) {
24+
throw 'incorrect value for variable "keepApiKey". The value must be a non-empty API key.';
1925
}
2026

21-
delete params['keepApiUrl'];
22-
delete params['keepApiKey'];
23-
delete params['HTTPProxy'];
27+
delete params["keepApiUrl"];
28+
delete params["keepApiKey"];
29+
delete params["HTTPProxy"];
2430

25-
var incidentKey = "zabbix-" + params['EVENT.ID'];
31+
var incidentKey = "zabbix-" + params["EVENT.ID"];
2632

27-
req.addHeader('Accept: application/json');
28-
req.addHeader('Content-Type: application/json');
29-
req.addHeader('X-API-KEY: ' + keepApiKey);
33+
req.addHeader("Accept: application/json");
34+
req.addHeader("Content-Type: application/json");
35+
req.addHeader("X-API-KEY: " + keepApiKey);
3036

31-
Zabbix.log(4, '[Keep Webhook] keepApiUrl:' + keepApiUrl);
32-
Zabbix.log(4, '[Keep Webhook] keepApiKey:' + keepApiKey);
33-
Zabbix.log(4, '[Keep Webhook] Sending request:' + JSON.stringify(params));
37+
Zabbix.log(4, "[Keep Webhook] keepApiUrl:" + keepApiUrl);
38+
Zabbix.log(4, "[Keep Webhook] keepApiKey:" + keepApiKey);
39+
Zabbix.log(4, "[Keep Webhook] Sending request:" + JSON.stringify(params));
3440

3541
resp = req.post(keepApiUrl, JSON.stringify(params));
36-
Zabbix.log(4, '[Keep Webhook] Received response: HTTP ' + req.getStatus() + ': ' + resp);
42+
Zabbix.log(4, "[Keep Webhook] Received response: HTTP " + req.getStatus());
3743

3844
if (req.getStatus() != 202) {
39-
throw 'Response code not 202';
40-
}
41-
else {
45+
throw "Response code not 202";
46+
} else {
4247
return resp;
4348
}
44-
}
45-
catch (error) {
46-
Zabbix.log(3, '[Keep Webhook] Notification failed : ' + error);
47-
throw 'Keep notification failed : ' + error;
49+
} catch (error) {
50+
Zabbix.log(3, "[Keep Webhook] Notification failed : " + error);
51+
throw "Keep notification failed : " + error;
4852
}

0 commit comments

Comments
 (0)