zabbixに複雑な条件で障害検知させる(webシナリオによるトリガーの作成方法)

本記事はサーバー監視ツール**zabbix**を使って、「**複雑な条件で障害検知させる**」方法について書いています。
私も勉強中の身ですので、間違いなどあればコメントにて教えてください！

##本記事の目的
特定のurl(**http://hogehoge.com**)において、statusが**503(server error)**で返ってきた場合、それを障害として検知して、slackに通知させる。

<img width="776" alt="スクリーンショット 2019-03-10 0.23.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/223014/8de0bad0-bdf7-f68f-185d-928f89751c32.png">

つまりwebサービスの画面にこんな画面が出る状況を通知させたい！という試みです。
今回は意図的に503エラーを返すwebページを作成し、このページをzabbixに監視させてみます。

## そもそもzabbixって？
最初に述べたとおり,　zabbixとは、「**サーバー監視ツール**」の一つです。
webサービスを運営する上で、「いきなりページが見られなくなった」「サーバーが予期しないエラーを返す」と言ったようなトラブルはつきものです。zabbixのようなサーバー監視ツールを用いると、このような予期しないエラーを早期に発見することができます。

## zabbixの使い方
zabbixの簡単な使い方については、多くの方がわかりやすい記事を書いてくださっています。
例えば以下記事では「zabbixのなんたるか」から「具体的な使い方」までを学ぶことができます。

[統合監視ツールzabbixによるサーバー監視](https://knowledge.sakura.ad.jp/585/)

また本記事ではSlackでの通知をさせますが、zabbixを用いたSlack通知の設定に関しては以下の記事を参考にしました

[zabbixで障害時にSlack通知させる](https://qiita.com/wapa5pow/items/2327561493015a833c97)


しかしながら、上の記事で述べられている方法ではあくまで「サーバーが落ちている場合(connection errorが起きた場合)」の通知しか実現できません。今回のようにより詳細な条件を設定して通知をさせるにはさらなる工夫が必要です。

今回はzabbixの機能の一つである**webシナリオ**を用いてこれを実現していきます


## webシナリオを作ってみる

### webシナリオとは
webシナリオは端的に言えば「『**このサービス**』に対して、『**こういうアクセス**』をした時に、『**こういう反応が帰ってきたら**』教えてね」というものを決められる仕組みです。
文字通り、サービスを訪れた人になりきってシナリオを設定できるわけですね（便利！！）

今回に置き換えて考えてみると
「『**http://hogehoge.com**』」に『**getメソッドでアクセス**』した時に、『**status 503**』 で帰ってきたら教えてね」
という風になります。

### 実際の手順
#### webシナリオの作成
1. zabbix管理画面から, 「設定」 > 「ホスト」 と進み、該当するサーバーを選択する
<img width="629" alt="スクリーンショット 2019-03-09 23.59.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/223014/159bc128-3a12-3326-a0a4-55ac967a061b.png">

2. 該当サーバーの設定項目の中から「webシナリオ」を選択
<img width="948" alt="スクリーンショット 2019-03-10 0.02.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/223014/d1cac942-57af-47e7-87b9-2686ae2dc50b.png">

3. webシナリオの設定を行う
ここからが本番です。それぞれの項目について以下のように設定していきます

【シナリオ】
シナリオに関する基本的な設定を記入していきます。

| 設定項目 | 詳細 |
| --- | --- |
|名前|任意のシナリオ名。今回は「**internal server error**」としました（安直）|
|アプリケーション名|シナリオが属するアプリケーション名。今回は**Http service**を選択します|
|アプリケーションの作成|自分でアプリケーションを作成することもできるようです。**今回は既存のものを使うので触りません**|
|更新間隔|文字通り、判定を行う頻度です。今回は**60秒**に設定します。|
|試行回数|判定を行う回数です。1~10の間で設定ができそう。今回は**１**にしました。|
そのほかの項目については無記入につき省略します。でもheaderが決められたり、シナリオの中で使う変数が決められたりなかなか便利そう...

【ステップ】
シナリオにおける一つ一つの段階を決めていきます。今回は特定のページにアクセスした時の応答を見るだけなので、一つだけ設定します。

| 設定項目 | 詳細 |
| --- | --- |
|名前|任意のステップ名。今回は「**internal server error**」としました。|
|url|アクセスするurl名。今回は**http://hogehoge.com**です。|
|要求ステータス|予想するstatus codeを記入します。今回はserver errorを検知したいので**503**とします。|

そのほかの項目については無記入につき省略します。headerやqueryパラメータについて決められたりとここもなかなか複雑な条件が設定できそうです。

【認証】
ページにアクセスするのに認証が必要な場合、認証の手法について決められます。今回は認証なしの場合を想定しているので省略します。

今回言及しなかった項目については以下のサイトも参考にしてください。

[zabbix公式 8.web監視](https://www.zabbix.com/documentation/2.2/jp/manual/web_monitoring)


#### トリガーの設定
ここからは、先ほど設定した「シナリオ」に対してトリガーを設定します。すなわち「この流れが起きたら問題だよ」といことをzabbixに教えてあげるわけです。

1. 同画面の「トリガー」から、「トリガーの作成」を選択。
2. トリガーの作成

| 設定項目 | 詳細 |
| --- | --- |
|名前|任意。今回は「**internal server error**」としました。|
|深刻度|障害の深刻度。今回は深刻度が「警告以上の時にslackで通知する」設定を行なっているので**警告**にしました。|

その他の項目はdefaultです。
さらに「条件式」について設定を行なっていきます。

1. 設定項目の「条件式」の隣にある「追加」ボタンをクリック。
2. アイテムの「選択」から条件式を選択。今回はシナリオの内容についてのみ吟味したいので「hogehoge: Failed step of scenario "interal server error".」を選択しました。

設定は以上です。条件式についても場合によって色々な設定がつけられそうですね！ 



### 結果
設定してしばらく待つとslackから通知が...

<img width="323" alt="スクリーンショット 2019-03-10 0.44.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/223014/6fbeafe9-2b50-feb6-804b-543e0a46715c.png">


きた！　でもちょっと表示が微妙...?　よりわかりやすくするには通知に使われているbashファイルをいじってあげる必要がありそうです。



## 所感
zabbix、まだまだわからないことだらけですが、うまく使いこなせると、かなり多くの障害に対して通知ができるようになりそうです！