WhaTapの通知が提供するwebhook機能は、ただ別のメッセンジャーで通知を受け取るだけでなく、さまざまなプログラムと連携して自動化に使用することもできます。
A社のサーバーは、ディスクにzfsが構成されています。
最近このサーバーでは、突然i/o wait指標が急増してサーバーに遅延が発生する現象が、一日に何度も確認されています。サーバー担当者は、この現象がzfsのモジュールのひとつであるzedによって発生する現象で、zedプロセスを再起動するとサーバーが正常に戻るのを確認しました。その後、担当者はi/o waitが発生するたびにどのサーバーなのかを探してサーバー接続、再起動を繰り返す過程で、この反復作業を自動化できないか悩み始めました。
シナリオの状況で、どうすれば簡単に自動化できるか考えた末、Jenkinsでwebhookを受信後、Jenkinsサーバーが通知が発生したサーバーでコマンドを実行する方法を思いつきました。
まず、メトリックス通知で上限値を指定して、通知を設定します。今回の例では、ServerBaseカテゴリのcpu_iowait指標を利用したいと思います。
次に、通知を受信する3rd Party Pluginを設定します。通知の受信は、受信タグを通じて他の通知を受け取らないよう設定し、Jenkinsにwebhookを送信する通知受信設定は、webhook jsonタイプに設定しました。
{"pcode":1234,"projectName":"Sample project","time":1577840400000,"oid":1234567890,"oname":"WAS-01"//Optional,"title":"Alert Title","message":"Sample warning message"//Optional,"level":"Warning","status":"on","metricName":"cpu"//Optional,"metricValue":"99.99"//Optional,"metricThreshold":"90"//Optional}
webhook jsonの場合、上記のとおりを設定したアドレスに送信します。作業を実行中に一つの悩みが頭に浮かびました。
“どうやって通知が発生したサーバーに送ろうか?”
webhookで送信される値を確認すると、どのサーバーなのか区分できる区分者がないことが分かりました。このような場合、イベントメッセージを使用できます。
webhookで送信される値を確認すると、どのサーバーなのか区分できる区分者がないことが分かりました。このような場合、イベントメッセージを使用できます。
メトリックス通知設定では、通知メッセージにメトリックスデータのタグ情報を含めることができます。これを利用して、次のように${host_ip}に設定すると、メトリックス指標にあるタグのひとつであるhost_ipをメッセージとして送信できるようになります。このように設定すると、上記で設定したwebhook jsonの"message"キーの値でipが送られます。
その後、設定した通知と登録されたwebhookにイベントタグをつけて、他のモニタリング通知には通知を送信しないよう設定します。
Jenkinsに接続してジョブを作成します。その後、Jenkinsでwebhook triggerを通じて次のような設定を実行します。
このように設定すると、webhookを通じて受け取ったmessageをJenkinsで使用可能な変数であるMESSAGEとして使用できます。
設定した変数を利用すると、再起動スクリプトは次のように簡単に作成できます。
ssh $MESSAGE sudo systemctl restart zed
こうして、自動化のための準備が整いました。
Jenkinsのwebhook triggerについての説明を見ると、token値を指定後、http://JENKINS_URL/generic-webhook-trigger/invokeでwebhookを設定すると値を受け取ると記されています。
上図のようにZED_RESTARTに指定して、Jenkinsアドレスの場合はjenkins.example.comと仮定します。このときのコールjenkins webhook urlは、以下のとおりです。
https://jenkins.example.com/generic-webhook-trigger/invoke?token=ZED_RESTART
このアドレスを3rd Party PluginのWebhook JSONに入力します。
登録後、下図のように受信タグ登録、受信タグ未設定通知受信offに設定すると、i/o wait通知のみ受信してJenkinsに送信します。
webhookは、さまざまなプログラムと連携することができます。
webhook bodyの値を使用するサーバーと連携すると、通知発生時にイシュートラッカーによる自動イシュー登録、上記のシナリオのような運営自動化などに使用できる機能は限りなく多いです。