統合監視ツールのZabbixをテストしていて、不思議な現象に遭遇。
Zabbixには症状監視の他に、Web監視というのがある。 設定内容は細かく設定変更できるのだけど、以下のような設定にしていた。
- 監視先サイトへアクセスできるか
- ステータスコードが200かどうか
- サイトのトップページにGETでアクセスして、取得したレスポンスボディに特定文字列が含まれているか
試しに、いくつかサイトをいくつかピックアップしているとどうも挙動がおかしい。 いくつかのサイトは「正常」のステータスになるのに、2サイトだけステータスコードが「0」になってしまうというもの。 該当サイトのアクセスログを見ていると、ちゃんと200 OKで残っているのに…
設定画面上では下のように設定していた。
zabbix.comのWikiを覗いてみると
Status code 0: This usually happens if the request times out. Try increasing the timeout value slightly in the web monitor step. (意訳) この現象はリクエストがタイムアウトする場合に起こることがあります。 Web監視のタイムアウトの値を増やしてみてください。
とある。
試しに15秒となっていたタイムアウトの中身を30秒にしてみたがやっぱりダメ。
しばらく悩んで、Twitterで叫んでいたら、ZABBIX-JPの@kodai74こと寺島広大さんが助け船を出してくれたりしたんだけど解決せず。 該当サイトのHTMLソースなど読んでいるうちに気がついた。
監視先サイトをよく見比べてみると…
Web監視を設定していた4つのサイトのうち、監視がうまくいっていた2サイトは文字コードがUTF-8、 監視が失敗していたサイトは文字コードがSJISだった!
そして、Web監視の要求文字列に日本語を含んだ文字列を指定している!? やっぱり、半角英数に変更すると、監視が通った。おぉー。
@kodai74さんによれば「Web監視はまだUTF-8以外対応してないんですよね」とのこと。
監視の動きとしては、ステータスコードの監視は通って、 その後の要求文字列が含まれているかどうかのチェックでコケるのが正しい動きだとは思うけど、これぐらいはしょうがないか。 というより2バイト文字入れてた僕がバカでした。すみません。
お礼とお詫びに『Zabbix統合監視「実践」入門』を宣伝させていただきます。
実際買わせていただいて、リファレンスとして使わせていただいているけど、 Zabbixに関して国内で唯一といっていい解説本だと思うので、おすすめ。
最後に結論
ZabbixのWeb監視を設定する際、取得文字列には2バイト文字は設定しないようにしましょう!