Site Reliability Engineering Teamの@cubicdaiyaです。今回はSlackのライトなお話です。
SlackのAttachments
SlackにはIncoming WebhooksやWeb APIでメッセージを投稿する際、ペイロードにAttachementsと呼ばれる情報を含めることでメッセージを装飾できる仕組みがあります。
これを利用すると例えばメッセージにタイトルを付けたり、
用途に応じてカラーリングするといったことができます。(画像はイメージです。実際のアラートメッセージとは異なります。)
上記の場合、障害が発生したら赤、復旧したら黄緑で色分けしています。このようにAttachementsを利用することでSlackへ投稿するメッセージを分かりやすく装飾することができます。
メルカリでのAttachementsの利用例
メルカリでのAttachmentsの主な利用方法にはさきほども紹介した障害やエラーの発生/復旧時の通知の色分けのほか、fieldsを利用したテキストの整形などが挙げられます。ここでは実際の活用例をいくつか紹介します。
fluent-plugin-slackとNorikraを利用したエラー通知
メルカリのアプリで発生したエラーのログはAPIサーバからFluentdを経由してNorikraで集計された後、さらにFluentdが定期的にNorikraから集計済みのデータを取り出してSlackにポストされるようになっています。
この際に活躍するのがfluent-plugin-slackです。fluent-plugin-slackはその名の通りFluentdに流れてきたメッセージをSlackにポストしてくれるプラグインで機能も豊富です。
Norikraから集計済みのデータを取り出してSlackにポストする処理はfluent-plugin-norikraと合わせて例えば以下のように記述することができます。
<source> type norikra norikra localhost:26571 <fetch> method sweep target slack tag query_name tag_prefix norikra.slack interval 3s </fetch> </source> <match norikra.slack.**> type slack token api-token-string username norikra color warning icon_emoji :fire: channel "%s" channel_keys channel message "%s" message_keys message flush_interval 3s </match>
上記のようにcolor
パラメータに特定のキーワード(e.g. good
, bad
, warning
)やカラーコード(e.g. #ff0000
)を指定するとメッセージをカラーリングしてくれます。
Slackboardを利用したエラー通知
メルカリではSlackboardというSlackのIncoming Webhooksプロキシサーバとそのためのクライアントツールを利用してSlackへの通知を簡略化する仕組みを構築しています。
Slackboardのメルカリでの実際の活用例については下記のエントリをご覧下さい。
Slackboardはプロキシサーバ(slackboard
)と2種類のクライアントプログラム(slackboard-cli
、slackboard-log
)から構成されています。
例えばslackboard-cli
であれば-C
オプションでカラーリングが可能です。
$ echo good | slackboard-cli -c random -s slackboard-server:29800 -C good $ echo bad | slackboard-cli -c random -s slackboard-server:29800 -C bad $ echo warning | slackboard-cli -c random -s slackboard-server:29800 -C warning
このように色分けの仕組みを提供することでSlackへの通知をわかりやすくしているというわけです。
ちなみにもう一つのクライアントプログラムであるslackboard-log
はプログラムの実行に失敗した時だけslackboard
にメッセージをポストするプログラムで、v0.6.0
からは自動で#ff0000
(赤色)でカラーリングされて投稿されます。
$ slackboard-log -c random -s 127.0.0.1:29800 -- ls notfound 2016/01/11 01:52:45 Host : classic-club.local Command: ls notfound Output : ls: notfound: No such file or directory Error : exit status 1
fieldsによるリリース内容の整形
大人のスタートアップは大人のリリースができる。そう、ChatOpsならね。にもあるとおり、メルカリではアプリケーションコードのデプロイを所謂ChatOpsで行っています。
デプロイ時刻になるとどこからともなくBot(通称:GoBold)がやってきて「デプロイしますか?」と聞いてくるのでyesと返せばデプロイが始まります。なお、noと返しても無限ループしてくれません。
この際にGoBoldが出力するメッセージをAttachementsのfields
を利用して整形しています。以下は上記メッセージに含まれているAttachmentsの該当するペイロードの一部を抜き出したものです。
... "pretext": "カレンダーの記述確認しました", "fields": [ { "title": "登録者", "value": "..." }, { "title": "タイトル", "value": "#16764..." }, { "title": "開始終了予定", "value": "01/07 16:00 - 16:30" }, { "title": "リリース先", "value": "JP" }, { "title": "Pull Requests", "value": "..." } ]
このようにfieldsを利用することでメッセージを項目毎に整形して見やすくすることができます。
まとめ
SlackのAttachmentsを利用してSlackへの通知をわかりやすくする事例について解説しました。このほかにもAttachementsにはサムネイルやリンクを差し込んだりと色々なことができるようになっています。詳しくは下記の公式ドキュメントをご覧下さい。
それでは良いSlackライフを。