AlertHub ハンズオンガイド

本記事の目的

AlertHubでアラートメッセージを集約するにあたって、 集約する要件を決定する流れと、その設定方法を具体例に沿って紹介しています。

本記事に記載されている設定と動作確認を行うことで、 AlertHubの設定の基本的な流れを理解することを目的としています。

アラート集約要件の決定例

本記事では、とあるWebサーバを担うホストに対して、HTTPリクエスト応答の有無の監視を行っている状況で、 監視によって通知されるアラートをAlertHubで集約することを考えます。

監視状況の確認もしくは決定

監視から通知されるアラートメッセージが、どのような仕様で送信されているかを確認、または送信するかを決定します。

ここでは、以下の仕様でアラートメッセージが送信されているものとします。

・異常が発生した場合にアラート通知が行われ、以降は復旧するまで異常は通知されない
・異常から復旧した場合にアラート通知が行われる

また、アラートメッセージはWebhookによって以下のJSONが送信されるものとします。

{
    "text": "http {TRIGGER.STATUS}",
    "host": "{HOST.NAME1}",
    "trigger": "{TRIGGER.NAME}",
    "severity": "{TRIGGER.SEVERITY}",
    "datetime": "{EVENT.DATE} {EVENT.TIME}"
}

AlertHubにおいてのスコープの決定

AlertHubの「スコープ」は 正常 / 警戒 / 障害 などの状態を管理する観点です。 単位については規定していないため、プロセス / サーバなどのホスト / ネットワーク機器 / サービス / データセンター など、 様々な粒度の要素をスコープとすることが可能です。

ここでは、ホストのWebサーバとしての状態をスコープとして設定することとします。

監視アラートの集約方法の決定

AlertHubは大量のアラートメッセージを集約することと、後続処理を自動化することが目的であるため、 アラートの集約方法と後続処理を決定します。

ここでは、以下の様な集約を行うものとします。

・異常が発生してアラートを受信し、1分間以内に復旧アラートを受信しなかった場合に障害発生としてWebhookを送信する
・異常のアラートを受信して1分間以上経過した後に復旧した場合に回復としてWebhookを送信する

Webhookでは以下のJSONを送信するものとします。

{
    "text": "[{{message.content.data.text}}]\n
        HOST:{{message.content.data.host}}\n
        SEVERITY:{{message.content.data.severity}}\n
        TRIGGER:{{message.content.data.trigger}}\n
        EVENT.DATETIME:{{message.content.data.datetime}}"
}

設定例

上記で決定した集約要件に従って、それを実現するための設定をAlertHubの各要素に対して行います。

受信スロット

f:id:ueno-fixpoint:20200930210428p:plain:w600

アラートメッセージを受信する受信スロットを作成します。

f:id:ueno-fixpoint:20200930200404p:plain:w300 f:id:ueno-fixpoint:20200930200439p:plain:w600

「表示名」を入力して「保存」することで受信スロットが作成されます。 f:id:ueno-fixpoint:20200930200604p:plain

作成後に受信スロットの表示名をクリックすることで、メッセージ受信の「エンドポイント」が確認できます。 監視から通知するアラートの送信先をエンドポイントのいずれかに設定するか、 動作確認時に使用するためにメモしておいてください。 f:id:ueno-fixpoint:20200930200651p:plain

アクション

f:id:ueno-fixpoint:20200930210509p:plain:w600

アラートメッセージの集約後に実行する処理を設定するためにアクションを作成します。 f:id:ueno-fixpoint:20200930200818p:plain:w300 f:id:ueno-fixpoint:20200930200846p:plain:w600

「表示名」「Webhook URL」「HTTPメソッド」「リクエスト本文」「HTTPヘッダ」を入力して「保存」することで アクションが作成されます。

「リクエスト本文」は、 {{message.content.data.[プロパティ名]}} と記述することで受信したアラートメッセージのJSONのフィールド値を含めることが出来ます。 ここではWebhookの送信先をSlackのIncoming Webhookとして「Webhook URL」に指定し、 「リクエスト本文」には以下を指定しています。

{
    "text": "[{{message.content.data.text}}]\n
        HOST:{{message.content.data.host}}\n
        SEVERITY:{{message.content.data.severity}}\n
        TRIGGER:{{message.content.data.trigger}}\n
        EVENT.DATETIME:{{message.content.data.datetime}}"
}

f:id:ueno-fixpoint:20200930201008p:plain

スコープ

f:id:ueno-fixpoint:20200930210600p:plain:w600

監視を行い、ステータスを管理する観点としてスコープを作成します。

f:id:ueno-fixpoint:20200930201123p:plain:w300 f:id:ueno-fixpoint:20200930201148p:plain:w600

「表示名」「障害判定閾値」「警戒判定閾値」を入力して「保存」することでスコープが作成されます。

「表示名」は後の検索性などを考慮して、観点の種別、ホスト名、監視の種別を含めています。 「障害判定閾値」「警戒判定閾値」はスコープのステータスを変化させる深刻度の閾値です。 深刻度が指定した値に達した場合にそのステータスとなります。 f:id:ueno-fixpoint:20200930201224p:plain

ルール

f:id:ueno-fixpoint:20200930210632p:plain:w600

受信したアラートメッセージの内容を判断して、どのようにスコープの深刻度を変化させるかを設定するために、 ルールを作成します。

f:id:ueno-fixpoint:20200930201351p:plain:w300 f:id:ueno-fixpoint:20200930201420p:plain:w600

「表示名」「受信スロット」「処理フロー」「イベント」を入力して「保存」することでルールが作成されます。

「処理フロー」はアラートメッセージのJSONのフィールド値に対して判定する条件を設定します。 JSONのフィールド値は message.content.data.[プロパティ名] で指定することが出来ます。 ここでは、障害アラートを処理するために以下の様なフローを設定しています。

[ホストの該当判定]
アラートメッセージ内のhostの値が現在設定しているスコープと一致していること
「フィールド(message.content.data.host)が文字列(vo-demo-wp2)とオペレータ(と等しい)で一致したメッセージを許可する」

[監視種別の該当判定]
アラートメッセージ内のtriggerの値に「HTTP」の文字列が含まれていること
「フィールド(message.content.data.trigger)が文字列(HTTP)を含むメッセージを許可する」

[アラート種別の判定]
アラートメッセージ内のtextの値に「PROBLEM」の文字列が含まれていること
「フィールド(message.content.data.text)が文字列(PROBLEM)を含むメッセージを許可する」

「イベント」ではスコープの深刻度の変化を設定するために、スコープを選択した上で深刻度の変化量を指定します。

「[host][vo-demo-wp2][HTTP] の深刻度を「1」「増やす」」

f:id:ueno-fixpoint:20200930201517p:plain

同様に回復アラートを処理するためのルールを以下の様に設定します。 f:id:ueno-fixpoint:20200930201559p:plain

トリガー

f:id:ueno-fixpoint:20200930210709p:plain:w600

スコープの深刻度が変化した際に、アクションを実行するか判断する条件を設定するために、トリガーを作成します。 f:id:ueno-fixpoint:20201001190631p:plain:w600 f:id:ueno-fixpoint:20201001185606p:plain:w600 f:id:ueno-fixpoint:20200930201803p:plain:w600

「表示名」「実行条件」「アクション」を入力して「保存」することでトリガーが作成されます。

ここでは、異常を検知してから1分間回復しなかった場合に障害通知を送信するために、 以下の様な条件を設定しています。

[ステータスが「正常」ではないことの判定]
「スコープステータスが文字列(正常)と等しい/等しくない(等しくない)ことを必要とする」

[1分後にもステータスが「正常」となっていないことの判定]
「(60)秒経過後、スコープステータスが文字列(正常)と等しい/等しくない(等しくない)ことを必要とする」

f:id:ueno-fixpoint:20200930201839p:plain:w600

同様に1分間異常が継続した後に回復通知を送信するために、トリガーを以下の様に設定します。 f:id:ueno-fixpoint:20200930201907p:plain:w600

動作確認

上記の設定が全て完了したら、アラートメッセージを実際に送信して動作を確認します。

受信スロットのエンドポイントに対してHTTPリクエストを送信します。 以下はcurlコマンドで障害アラートを送信する例です。

curl -X POST -H 'Content-Type: application/json' -d "{ \"text\": \"HTTP PROBLEM\", \"host\": \"vo-demo-wp2\", \"trigger\": \"HTTP\", \"severity\": \"warning\", \"datetime\": \"9999/99/99 99:99:99\" }" https://receiver.cloud.kompira.jp/webhook/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

回復アラートの場合は以下の例の様に送信します。

curl -X POST -H 'Content-Type: application/json' -d "{ \"text\": \"HTTP OK\", \"host\": \"vo-demo-wp2\", \"trigger\": \"HTTP\", \"severity\": \"warning\", \"datetime\": \"9999/99/99 99:99:99\" }" https://receiver.cloud.kompira.jp/webhook/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

※HTTPリクエストの送信には、talendなどのChrome拡張機能なども有効活用できます。


ここで、送信したHTTPリクエストによって以下の様な結果になれば動作確認は完了となります。

HTTPリクエスト 結果 スコープ
障害アラートを送信し、
1分以上経過した後に回復アラートを送信
障害アラート送信の1分後にSlackへ障害通知が送られ、
その後回復通知が送られる
深刻度が「0」→「1」、
「1」→「0」へ推移している
障害アラートを送信し、
1分以内に回復アラートを送信
Slackへは何も通知されない 深刻度が「0」→「1」、
「1」→「0」へ推移している