2014-12-13

第九回 #渋谷java で飛び入り LT してきました (Slack 用 Logback Appender を実装する話)

Posted on 2014-12-13, 19:44

はじめに

会社の合宿予定が入っていて参加できそうになかったので、やむなく参加を見送っていた 12/13 (土) の 第九回 渋谷java でしたが、思ったより早く東京に戻ってくることができたので、下記のように

と参加できそうなのかつぶやいてみたところ、カジュアル無茶ぶりコメントをたけぞー先生よりいただいたので適当にネタをでっちあげて LT 発表してきたのでした。

SmartNews ♥ Slack

@amachino さんが先日 Slack の Advent calendar に投稿したとおり、スマートニュースでは 社内のコミュニケーションに Slack を活用しています。 通常の人同士の会話だけでなく Jenkins からの通知や Datadog からのアラートなども Slack に集約しており、普段扱っているコミュニケーションツールの中でも特段利用時間が長い状況になっています。

そのため、「プロダクション環境で動いている Java アプリケーションの実行状況・進捗や、例外が発生したときの詳細を Slack 経由で見たい・知りたい」という要望が Java エンジニア的には自然と沸き起こってくるわけです。

Logback の Appender を実装する

そういうわけで、Java アプリケーションからお手軽に Slack にメッセージをポストする方法として、Logback の Appender 実装を用意する方法を紹介しました。

プロダクション環境で利用するにあたって、HTTP(S) 経由で Slack API を呼び出す際に

  • ロガーメソッドを呼び出す元の実行をブロックしないように (すぐに制御が戻るように) 非同期処理する
  • 非同期処理で Slack API を叩くにしてもログのイベントが前後するのは嫌なので (Array)BlockingQueue を使ってログイベントを直列化する
  • HTTP 通信で失敗したときのためにリトライ処理を入れる

などの仕組みを入れ込んだ実装としています (発表中にお見せしたコードはまだ整備しきれていないので現在は非公開としていますが、いずれ公開する予定です)。

会場参加者からのツッコミ

これは発表の際に java-ja から来られた方 からいただいたツッコミなのですが、Appender 内部で非同期処理をする場合は、 ContextAwareBase クラス (AppenderBase クラスの親クラス) が context フィールドで保持しているオブジェクトの Context#getExecutorService() メソッドの戻り値を使って、その ExecutorService オブジェクト経由でスレッドを立ち上げるといいそうです。

まとめ・感想

  • Logback の Appender 実装はツボさえ押さえれば、あんまり難しくないよ
  • Logback のインタフェースで Slack API を叩けるようになれば、Logback 使っている既存の Java アプリケーションなら容易に Slack に通知を出せるようになるね!
  • java-ja から来た人、ちょっとコワイけど、丁寧な説明だったりアドバイスをいただけたりと、とっても親切だね!

0 コメント:

コメントを投稿