You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
7.7 KiB
245 lines
7.7 KiB
1 year ago
|
zabbix_export:
|
||
|
version: '7.0'
|
||
|
media_types:
|
||
|
-
|
||
|
name: iLert
|
||
|
type: WEBHOOK
|
||
|
parameters:
|
||
|
-
|
||
|
name: .ILERT.ALERT.SOURCE.KEY
|
||
|
value: '{ALERT.SENDTO}'
|
||
|
-
|
||
|
name: .ILERT.INCIDENT.SUMMARY
|
||
|
value: ''
|
||
|
-
|
||
|
name: ALERT.MESSAGE
|
||
|
value: '{ALERT.MESSAGE}'
|
||
|
-
|
||
|
name: ALERT.SUBJECT
|
||
|
value: '{ALERT.SUBJECT}'
|
||
|
-
|
||
|
name: EVENT.ACK.STATUS
|
||
|
value: '{EVENT.ACK.STATUS}'
|
||
|
-
|
||
|
name: EVENT.DATE
|
||
|
value: '{EVENT.DATE}'
|
||
|
-
|
||
|
name: EVENT.ID
|
||
|
value: '{EVENT.ID}'
|
||
|
-
|
||
|
name: EVENT.NAME
|
||
|
value: '{EVENT.NAME}'
|
||
|
-
|
||
|
name: EVENT.NSEVERITY
|
||
|
value: '{EVENT.NSEVERITY}'
|
||
|
-
|
||
|
name: EVENT.OPDATA
|
||
|
value: '{EVENT.OPDATA}'
|
||
|
-
|
||
|
name: EVENT.RECOVERY.DATE
|
||
|
value: '{EVENT.RECOVERY.DATE}'
|
||
|
-
|
||
|
name: EVENT.RECOVERY.TIME
|
||
|
value: '{EVENT.RECOVERY.TIME}'
|
||
|
-
|
||
|
name: EVENT.RECOVERY.VALUE
|
||
|
value: '{EVENT.RECOVERY.VALUE}'
|
||
|
-
|
||
|
name: EVENT.SEVERITY
|
||
|
value: '{EVENT.SEVERITY}'
|
||
|
-
|
||
|
name: EVENT.TAGS
|
||
|
value: '{EVENT.TAGS}'
|
||
|
-
|
||
|
name: EVENT.TIME
|
||
|
value: '{EVENT.TIME}'
|
||
|
-
|
||
|
name: EVENT.UPDATE.ACTION
|
||
|
value: '{EVENT.UPDATE.ACTION}'
|
||
|
-
|
||
|
name: EVENT.UPDATE.DATE
|
||
|
value: '{EVENT.UPDATE.DATE}'
|
||
|
-
|
||
|
name: EVENT.UPDATE.MESSAGE
|
||
|
value: '{EVENT.UPDATE.MESSAGE}'
|
||
|
-
|
||
|
name: EVENT.UPDATE.STATUS
|
||
|
value: '{EVENT.UPDATE.STATUS}'
|
||
|
-
|
||
|
name: EVENT.UPDATE.TIME
|
||
|
value: '{EVENT.UPDATE.TIME}'
|
||
|
-
|
||
|
name: EVENT.VALUE
|
||
|
value: '{EVENT.VALUE}'
|
||
|
-
|
||
|
name: HOST.HOST
|
||
|
value: '{HOST.HOST}'
|
||
|
-
|
||
|
name: HOST.IP
|
||
|
value: '{HOST.IP}'
|
||
|
-
|
||
|
name: HOST.NAME
|
||
|
value: '{HOST.NAME}'
|
||
|
-
|
||
|
name: ITEM.ID1
|
||
|
value: '{ITEM.ID1}'
|
||
|
-
|
||
|
name: ITEM.ID2
|
||
|
value: '{ITEM.ID2}'
|
||
|
-
|
||
|
name: ITEM.ID3
|
||
|
value: '{ITEM.ID3}'
|
||
|
-
|
||
|
name: ITEM.ID4
|
||
|
value: '{ITEM.ID4}'
|
||
|
-
|
||
|
name: ITEM.ID5
|
||
|
value: '{ITEM.ID5}'
|
||
|
-
|
||
|
name: ITEM.NAME1
|
||
|
value: '{ITEM.NAME1}'
|
||
|
-
|
||
|
name: ITEM.NAME2
|
||
|
value: '{ITEM.NAME2}'
|
||
|
-
|
||
|
name: ITEM.NAME3
|
||
|
value: '{ITEM.NAME3}'
|
||
|
-
|
||
|
name: ITEM.NAME4
|
||
|
value: '{ITEM.NAME4}'
|
||
|
-
|
||
|
name: ITEM.NAME5
|
||
|
value: '{ITEM.NAME5}'
|
||
|
-
|
||
|
name: TRIGGER.DESCRIPTION
|
||
|
value: '{TRIGGER.DESCRIPTION}'
|
||
|
-
|
||
|
name: TRIGGER.ID
|
||
|
value: '{TRIGGER.ID}'
|
||
|
-
|
||
|
name: TRIGGER.NAME
|
||
|
value: '{TRIGGER.NAME}'
|
||
|
-
|
||
|
name: TRIGGER.SEVERITY
|
||
|
value: '{TRIGGER.SEVERITY}'
|
||
|
-
|
||
|
name: TRIGGER.STATUS
|
||
|
value: '{TRIGGER.STATUS}'
|
||
|
-
|
||
|
name: TRIGGER.URL
|
||
|
value: '{TRIGGER.URL}'
|
||
|
-
|
||
|
name: TRIGGER.VALUE
|
||
|
value: '{TRIGGER.VALUE}'
|
||
|
-
|
||
|
name: USER.FULLNAME
|
||
|
value: '{USER.FULLNAME}'
|
||
|
-
|
||
|
name: ZABBIX.URL
|
||
|
value: '{$ZABBIX.URL}'
|
||
|
script: |
|
||
|
try {
|
||
|
var result = { tags: {} },
|
||
|
params = JSON.parse(value),
|
||
|
req = new HttpRequest(),
|
||
|
resp = '';
|
||
|
|
||
|
if (typeof params.HTTPProxy === 'string' && params.HTTPProxy.trim() !== '') {
|
||
|
req.setProxy(params.HTTPProxy);
|
||
|
}
|
||
|
var alertSourceKey = params['.ILERT.ALERT.SOURCE.KEY'];
|
||
|
if (!alertSourceKey || (typeof alertSourceKey === 'string' && alertSourceKey.trim() === '')) {
|
||
|
throw 'incorrect value for variable "ILERT.ALERT.SOURCE.KEY". The value must be a non-empty string.';
|
||
|
}
|
||
|
delete params['.ILERT.ALERT.SOURCE.KEY'];
|
||
|
|
||
|
var ilertApiBaseURL = "https://api.ilert.com";
|
||
|
var reqURL = encodeURI(ilertApiBaseURL + "/api/v1/events/zabbix-mt/" + alertSourceKey)
|
||
|
|
||
|
var incidentKey = "zabbix-" + params['EVENT.ID'];
|
||
|
var incidentViewURL = ilertApiBaseURL + "/api/v1/incidents/resolve-ik/" + alertSourceKey + "/" + incidentKey;
|
||
|
|
||
|
req.addHeader('Accept: application/json');
|
||
|
req.addHeader('Content-Type: application/json');
|
||
|
|
||
|
Zabbix.log(4, '[iLert Webhook] Sending request:' + JSON.stringify(params));
|
||
|
resp = req.post(reqURL, JSON.stringify(params));
|
||
|
Zabbix.log(4, '[iLert Webhook] Receiving response:' + resp);
|
||
|
|
||
|
try {
|
||
|
resp = JSON.parse(resp);
|
||
|
}
|
||
|
catch (error) {
|
||
|
throw 'incorrect response. iLert returned a non-JSON object.';
|
||
|
}
|
||
|
|
||
|
if (req.getStatus() == 200) {
|
||
|
result.tags.__ilert_incident_url = incidentViewURL;
|
||
|
return JSON.stringify(result);
|
||
|
}
|
||
|
|
||
|
if (req.getStatus() == 400 && typeof resp === 'object' && typeof resp.code === 'string') {
|
||
|
if (resp.code === 'NO_OPEN_INCIDENT_WITH_KEY') {
|
||
|
return JSON.stringify(result);
|
||
|
}
|
||
|
if (resp.code === 'INCIDENT_ALREADY_ACCEPTED') {
|
||
|
result.tags.__ilert_incident_url = incidentViewURL;
|
||
|
return JSON.stringify(result);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (typeof resp === 'object' && typeof resp.message === 'string') {
|
||
|
throw resp.message;
|
||
|
}
|
||
|
else {
|
||
|
throw 'Unknown error.';
|
||
|
}
|
||
|
}
|
||
|
catch (error) {
|
||
|
Zabbix.log(3, '[iLert Webhook] Notification failed : ' + error);
|
||
|
throw 'iLert notification failed : ' + error;
|
||
|
}
|
||
|
process_tags: 'YES'
|
||
|
show_event_menu: 'YES'
|
||
|
event_menu_url: '{EVENT.TAGS.__ilert_incident_url}'
|
||
|
event_menu_name: 'iLert incident'
|
||
|
description: |
|
||
|
Please refer to https://docs.ilert.com/integrations/zabbix/native
|
||
|
|
||
|
Set global macro {$ZABBIX.URL} with your Zabbix server URL.
|
||
|
Add a dedicated user with the media type "iLert". You can also rewrite the incident summary via ".ILERT.INCIDENT.SUMMARY" parameter or leave it empty to use the standard pattern.
|
||
|
message_templates:
|
||
|
-
|
||
|
event_source: TRIGGERS
|
||
|
operation_mode: PROBLEM
|
||
|
subject: 'Problem: {EVENT.NAME}'
|
||
|
message: |
|
||
|
Problem started at {EVENT.TIME} on {EVENT.DATE}
|
||
|
Problem name: {EVENT.NAME}
|
||
|
Host: {HOST.NAME}
|
||
|
Severity: {EVENT.SEVERITY}
|
||
|
Operational data: {EVENT.OPDATA}
|
||
|
Original problem ID: {EVENT.ID}
|
||
|
{TRIGGER.URL}
|
||
|
-
|
||
|
event_source: TRIGGERS
|
||
|
operation_mode: UPDATE
|
||
|
subject: 'Updated problem in {EVENT.AGE}: {EVENT.NAME}'
|
||
|
message: |
|
||
|
{USER.FULLNAME} {EVENT.UPDATE.ACTION} problem at {EVENT.UPDATE.DATE} {EVENT.UPDATE.TIME}.
|
||
|
{EVENT.UPDATE.MESSAGE}
|
||
|
|
||
|
Current problem status is {EVENT.STATUS}, age is {EVENT.AGE}, acknowledged: {EVENT.ACK.STATUS}.
|
||
|
-
|
||
|
event_source: TRIGGERS
|
||
|
operation_mode: RECOVERY
|
||
|
subject: 'Resolved in {EVENT.DURATION}: {EVENT.NAME}'
|
||
|
message: |
|
||
|
Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
|
||
|
Problem name: {EVENT.NAME}
|
||
|
Problem duration: {EVENT.DURATION}
|
||
|
Host: {HOST.NAME}
|
||
|
Severity: {EVENT.SEVERITY}
|
||
|
Original problem ID: {EVENT.ID}
|
||
|
{TRIGGER.URL}
|