slackboard-cli〜Slackboardクライアント〜
Slackboard〜Slackプロキシサーバ in Go〜で書いたようにSlackboardにはSlackプロキシ(slackboard)のためのクライアントプログラムであるslackboard-cliが付属している。
これを利用すると稼働中のslackboard(slackboard-host:29800)に対してメッセージを送信するだけでSlackに通知することができる。
$ echo message | slackboard-cli -t test -s slackboard-host:29800
ただ、時々何かの処理に失敗した時だけSlackに通知したいことがある。例えば一日一回圧縮済みのログファイルをGoogle Cloud Storageにアップロードしていて、このタスクが失敗した時だけSlackに通知するケースを考えてみる。
# copy log file to Google Cloud Storage
gsutil cp /data/${data_log}_20150505.log.gz gs://${bucket}/
result=`echo $?`
if [ $result -ne 0 ];
then
echo "@channel: failed to copy log to Google Cloud Storage(${date_log})." | slackboard-cli -s slackboard-host:29800 -t error-gcs
exit
fi
シェルでリターンコードを元に失敗判定を行うのは汎用的である一方結構面倒である。というかifの文法を毎回忘れてはググっている自分がいるのをどうにかしたい。
次にcrontabに書かれたスクリプトの実行が失敗した際にSlackに通知したいとする。
0 6 * * * some-command some-args
some-commandをラップしてsome-commandが失敗した際にSlackに通知するロジックを埋め込ることができれば便利だ。似たようなことをするツールにcronlogがある。
0 6 * * * cronlog -- some-command some-args
上記のようにcronlogをはさむとsome-commndが失敗したとき(リターンコードが非ゼロ)にだけ実行結果を標準出力と標準エラー出力に吐くことができる。
で、先週社内のSlackでcronlogのSlack版みたいなのがほしいよね、という話になってその二日後社内リポジトリにslacklogというPerlスクリプトがコミット&マージされた。
slackboard-log〜cronlogライクなSlackboardクライアント〜
cronlogやslacklogのアイデアは非常に良いものなので自分もSlackboard向けにGoでslackboard-logというクライアントプログラムを書いてみた。これを使うと特定のタスクが失敗した時だけSlackに通知するような処理を簡単にラッピングできる。
0 6 * * * slackboard-log -s slackboard-host:29800 -t error-some -- some-command some-args
Slackに通知するのとは別に実行結果をファイルに吐くこともできる(-log)。こっちはコマンド実行の成否にかかわらず行われる。
slackboard-log -s slackboard-host:29800 -t error-some -log /tmp/some.log -- some-command some-args