標準入力を適当にまとめてSlackに通知するnotify_slackを作りました

もうすぐISUCON7の季節です。ISUCONは3人チームで挑むためSlackなどのチャットツールを使って情報を共有することになると思います。

そういうときに例えばデプロイスクリプトのようなものを作ったときに以下のようなことがしたくなります。

  • デプロイスクリプトを実行した時間も残しておきたいのでSlackに通知したい(ブログ用に)
  • 流れるログをSlackに通知してサーバー上で何が行われているか全メンバーが把握できるようにしたい
  • curlで雑に通知しようとすると1行ずつSlackにPOSTするようになってしまい地球に優しくないので、1秒分のログをまとめてSlackにPOSTするようにしたい
  • Slackにログを流すにしても、ターミナル上でコマンドのログは見ておきたいのでteeみたいなことをしたい
  • SlackのURLは長くなるので設定ファイルで適当に持っておきたい
  • デプロイスクリプトはメンバーの各Macで実行するかもしれないし、競技用のインスタンス上のLinuxで実行するかもしれないのでどちらでも対応できるようにしたい
  • 設定ファイルの場所はデフォルトが決まっていて、いちいち渡さなくてもいいようにしたい

そんなわがままに答えられるものを作ってみました。

notify_slackはお目当てのスクリプトをパイプで渡すようにするだけで使えます。tee的な動きもするので渡したスクリプトの標準出力は普通に標準出力に出てきます。デフォルトで1秒分のログをまとめて通知するので地球にも優しいです。

設定はコマンドラインでも渡せるし、tomlファイルでも渡せます。両方指定した場合はコマンドラインが優先されます。tomlファイルは以下の順序で読み込まれます。

  1. -cで指定したファイル
  2. $HOME/etc/notify_slack.toml
  3. /etc/notify_slack.toml

各Macは自分のホームディレクトリで、競技用のインスタンス上にはグローバルの設定で、というような使われ方を想定しています。

エラー処理に適当な部分があるのでプロダクションにはおすすめしませんが、ISUCONのような仲間内で使うなら特に問題無いだろうと考えています。

まだまだ実装や仕様をいじる気はしますが、とりあえず動いているのでこの時点で紹介します。

技術的には1秒分のログをまとめるところが非常に難しかったです。というか今の実装でいいのかあまり自信が無いです。ツッコミどころはたくさんあると思っているのでPRをお待ちしております。

追記(2019/02/16)

動画を撮りました。

将来の夢は隠居です

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store