1. Примеры скриптов вебхуков

Обзор

Хотя Zabbix предлагает большое количество готовых интеграций через вебхуки, вы можете захотеть создать собственные вебхуки. В этом разделе приведены примеры пользовательских скриптов вебхуков (используемых в параметре Script). Описание других параметров вебхука см. в разделе webhook.

Не используйте не объявленные присваивания в JavaScript предварительной обработки. Используйте var для объявления локальных переменных.

События восстановления (независимо от того, сгенерированы ли они автоматически или после ручного закрытия) включают теги восстановленного события (в том числе теги, унаследованные от шаблонов, узлов сети и триггеров). Скрипты вебхуков выполняются после создания оповещения; поэтому теги, возвращаемые скриптом вебхука, применяются уже после первоначального создания оповещения и могут отсутствовать в оповещении, которое вызвало вебхук. Если для интеграции требуется, чтобы теги, созданные вебхуком, присутствовали в первоначальном уведомлении, получите теги события с сервера (например, с помощью API Event) или сохраняйте теги, созданные вебхуком, во внешнем постоянном хранилище и выполняйте сопоставление там.

Jira вебхук (пользовательский)

Этот скрипт создаст проблему (issue) в JIRA и вернёт некоторую информацию о созданной проблеме.

try {
    Zabbix.log(4, '[ Jira webhook ] Started with params: ' + value);

    var result = {
            'tags': {
                'endpoint': 'jira'
            }
        },
        params = JSON.parse(value),
        req = new HttpRequest(),
        fields = {},
        resp;

    if (params.HTTPProxy) {
        req.setProxy(params.HTTPProxy);
    }

    req.addHeader('Content-Type: application/json');
    req.addHeader('Authorization: Basic ' + params.authentication);

    fields.summary = params.summary;
    fields.description = params.description;
    fields.project = {key: params.project_key};
    fields.issuetype = {id: params.issue_id};

    resp = req.post('https://jira.example.com/rest/api/2/issue/',
        JSON.stringify({"fields": fields})
    );

    if (req.getStatus() != 201) {
        throw 'Response code: ' + req.getStatus();
    }

    resp = JSON.parse(resp);
    result.tags.issue_id = resp.id;
    result.tags.issue_key = resp.key;

    return JSON.stringify(result);
}
catch (error) {
    Zabbix.log(4, '[ Jira webhook ] Issue creation failed json : ' + JSON.stringify({"fields": fields}));
    Zabbix.log(3, '[ Jira webhook ] issue creation failed : ' + error);

    throw 'Failed with error: ' + error;
}

Slack вебхук (пользовательский)

Этот вебхук будет пересылать оповещения из Zabbix в канал Slack.

try {
    var params = JSON.parse(value),
        req = new HttpRequest(),
        response;

    if (params.HTTPProxy) {
        req.setProxy(params.HTTPProxy);
    }

    req.addHeader('Content-Type: application/x-www-form-urlencoded');

    Zabbix.log(4, '[ Slack webhook ] Webhook request with value=' + value);

    response = req.post(params.hook_url, 'payload=' + encodeURIComponent(value));
    Zabbix.log(4, '[ Slack webhook ] Responded with code: ' + req.getStatus() + '. Response: ' + response);

    try {
        response = JSON.parse(response);
    }
    catch (error) {
        if (req.getStatus() < 200 || req.getStatus() >= 300) {
            throw 'Request failed with status code ' + req.getStatus();
        }
        else {
            throw 'Request success, but response parsing failed.';
        }
    }

    if (req.getStatus() !== 200 || !response.ok || response.ok === 'false') {
        throw response.error;
    }

    return 'OK';
}
catch (error) {
    Zabbix.log(3, '[ Slack webhook ] Sending failed. Error: ' + error);

    throw 'Failed with error: ' + error;
}