1 Webhookスクリプトの例

概要

Zabbix にはすぐに使える多くの Webhook 統合機能が用意されていますが、独自の Webhook を作成したい場合もあるでしょう。 このセクションでは、カスタム Webhook スクリプト(Script パラメータで使用) の例を示します。 他の Webhook パラメータの説明については、webhook セクションを参照してください。

JavaScript の前処理で宣言されていない代入を使用しないでください。 ローカル変数を宣言するには var を使用してください。

リカバリーイベント(自動的に生成される場合や、手動クローズ に従う場合)は、解決済みイベントタグ(テンプレート、ホスト、トリガーから継承されたタグを含む)を含みます。 Webhook スクリプトはアラートが作成された後に実行されるため、Webhook スクリプトによって返されたタグは初期アラート作成後に適用され、Webhook をトリガーしたアラートには存在しない場合があります。 Webhook で生成されたタグが初期通知に存在する必要がある場合は、サーバーからイベントタグを取得する(たとえば、Event API を使用)か、Webhook で生成されたタグを外部の永続ストアに保存してそこで関連付けてください。

Jira webhook(カスタム)

このスクリプトは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 webhook (カスタム)

このWebhookは、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;
}