Zucksの技術環境整備係 @bash0C7 です。

さて、我々は今のところシステム監視にXymonという統合監視ツールを使っています。基本のXymon Client連携の他、カスタムスクリプトで定期的にAWSのリソースの状態を監視したり、Fluentdからfluent-plugin-xymon経由でXymonにメトリクスを取り込んだりという手を加えながら、より高いサービスレベルの達成に力を注いでいます。

Zucks Ad NetworkではXymonが問題を感知したときの通知として、これまでは伝統的なメール発報を行ってきました。利用実績の多さに加え、最近だと携帯にプッシュを受けれたり、ルールに基いてメールを転送したり、フィルタリングしたりと、伝統的とはいえまだまだ使い手のある手段ではあります。
ただ、21世紀の今日、もっとカジュアルかつ即時性が高く、送られてきた通知を契機に迅速かつスムーズにコミュニケーションが取れる手段を使いたいなあと思っていました。

そこで我々は"チーム開発にフォーカスした快適なグループチャット"idobataとXymonを組み合わせることで上記を実現しました。

Xymonからidobataに通知


idobataはグループチャットとして動作がスムーズで謳い文句の通り快適に使うことができる他、WebHook機能によってGithub、PivotalTracker、Jenkinsなど日常的に使っているポピュラーな開発支援ツールからの通知をかんたんに取り込むことができます。
Xymonからidobataの連携は、汎用のGeneric WebHookに、Xymonサーバからアクセスする方法をとっています。

下記2ステップをXymon側に設定するだけでかんたんに実現できるので、Xymonを使っている方は是非速攻でお試しください。
他の監視ツールを使っている場合も考え方は同じなのでかんたんに適用できるでしょう。 また、Fluentdにはfluent-plugin-idobataというプラグインがあるので、こちらも利用すると捗るかと思います。

■ステップ1

alerts.cfgに、条件に合致したらスクリプトをキックするように設定を追加します。
例えばいずれかのホストでCOLORがredの場合に/path/to/xymon2idobata.shをキックしてidobataに通知する場合、下記の様に記述します。
$ZGOK_IDOBATA_WEBHOOK_URL=https://idobata.io/WEBHOOK_URL

HOST=* COLOR=red
  SCRIPT /path/to/xymon2idobata.sh $ZGOK_IDOBATA_WEBHOOK_URL  
idobataのWebHook URLはidobataのルームごとにユニークなものが発行されるので、idobataのROOM SETTINGSをご覧ください。
alerts.cfgの詳細な書き方は、http://xymon.sourceforge.net/xymon/help/xymon-alerts.html#scripts をご参照ください

■ステップ2

idobataに通知するためのxymon2idobata.shを実装します。
スクリプトの中では、エラーの状況やメッセージなどが環境変数で渡されるので、それを元にhttpリクエストを作ってidobataにpostします。
#!/bin/bash

WEB_HOOK_URL=$RCPT

IDOBATA_STATUS="<span class='label label-info'>${BBCOLORLEVEL}</span>"
test ${BBCOLORLEVEL} = "red" && IDOBATA_STATUS="<span class='label label-important'>FAILURE</span>"
test ${BBCOLORLEVEL} = "yellow" && IDOBATA_STATUS="<span class='label label-warning'>WARNING</span>"

curl -s $WEB_HOOK_URL --data-urlencode "body=${IDOBATA_STATUS}<pre>${BBALPHAMSG}</pre>`echo $BBALPHAMSG | sed 's/.*See http/http/g'`" -d format=html
スクリプト中で使えるXymonの環境変数についても、http://xymon.sourceforge.net/xymon/help/xymon-alerts.html#scripts をご覧ください。
ちょっとしたハマりどころとしては、alerts.cfgで渡したrecipient情報(ステップ1では$ZGOK_IDOBATA_WEBHOOK_URL)は、コマンドライン引数ではなくRCPT環境変数に格納されます。

このスクリプトではidobata.ioでGeneric HookでFAILUREとかSUCCESSを出すを大いに参考にして、エラーレベルごとにわかりやすくidobataに表示するようにしています。
BBCOLORLEVELにredだのyellowだの、Xymonのエラーレベルのカラーが渡ってくるので、これでどのようなラベルにするか判断しています。

また、Xymonからのメッセージをpreタグで囲むようにしましたが、これだとメッセージの最後についているURLがidobata上でクリッカブルになりません。`echo $BBALPHAMSG | sed 's/.*See http/http/g'` でURL部分をpre外にも出して、idobataに送り込んでいます。


どうですか、かんたんだったでしょう?
上記スニペットはMIT Licenseとしますので、ご自由にお使いください。


また他にも様々な技術的なアーキテクチャや工夫を行っています。
PHPカンファレンス2013やad:tech Tokyo 2013 AWSブースで講演した時の資料を公開していますので、こちらも是非ご参照ください。

■PHPカンファレンス2013講演資料

■ad:tech Tokyo 2013 AWSブース講演資料

そして、VOYAGE GROUPや広告配信に興味を持ちましたら、是非こちらもご検討ください。
VOYAGE GROUP キャリア採用 広告配信システムエンジニア