Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.

Slackへの通知をAttachmentsでわかりやすく...

Site Reliability Engineering Teamの@cubicdaiyaです。今回はSlackのライトなお話です。

SlackのAttachments

SlackにはIncoming WebhooksやWeb APIでメッセージを投稿する際、ペイロードにAttachementsと呼ばれる情報を含めることでメッセージを装飾できる仕組みがあります。

これを利用すると例えばメッセージにタイトルを付けたり、

f:id:cubicdaiya:20160111025631p:plain

用途に応じてカラーリングするといったことができます。(画像はイメージです。実際のアラートメッセージとは異なります。)

f:id:cubicdaiya:20160111025656p:plain

上記の場合、障害が発生したら赤、復旧したら黄緑で色分けしています。このようにAttachementsを利用することでSlackへ投稿するメッセージを分かりやすく装飾することができます。

メルカリでのAttachementsの利用例

メルカリでのAttachmentsの主な利用方法にはさきほども紹介した障害やエラーの発生/復旧時の通知の色分けのほか、fieldsを利用したテキストの整形などが挙げられます。ここでは実際の活用例をいくつか紹介します。

fluent-plugin-slackとNorikraを利用したエラー通知

メルカリのアプリで発生したエラーのログはAPIサーバからFluentdを経由してNorikraで集計された後、さらにFluentdが定期的にNorikraから集計済みのデータを取り出してSlackにポストされるようになっています。

f:id:cubicdaiya:20160111025721p:plain

この際に活躍するのがfluent-plugin-slackです。fluent-plugin-slackはその名の通りFluentdに流れてきたメッセージをSlackにポストしてくれるプラグインで機能も豊富です。

github.com

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)を指定するとメッセージをカラーリングしてくれます。

f:id:cubicdaiya:20160111025805p:plain

Slackboardを利用したエラー通知

メルカリではSlackboardというSlackのIncoming Webhooksプロキシサーバとそのためのクライアントツールを利用してSlackへの通知を簡略化する仕組みを構築しています。

f:id:cubicdaiya:20160111030411p:plain

Slackboardのメルカリでの実際の活用例については下記のエントリをご覧下さい。

tech.mercari.com

Slackboardはプロキシサーバ(slackboard)と2種類のクライアントプログラム(slackboard-clislackboard-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

f:id:cubicdaiya:20160111025939p:plain

このように色分けの仕組みを提供することで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

f:id:cubicdaiya:20160111030001p:plain

fieldsによるリリース内容の整形

大人のスタートアップは大人のリリースができる。そう、ChatOpsならね。にもあるとおり、メルカリではアプリケーションコードのデプロイを所謂ChatOpsで行っています。

tech.mercari.com

デプロイ時刻になるとどこからともなくBot(通称:GoBold)がやってきて「デプロイしますか?」と聞いてくるのでyesと返せばデプロイが始まります。なお、noと返しても無限ループしてくれません。

f:id:cubicdaiya:20160111030253p:plain

この際に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にはサムネイルやリンクを差し込んだりと色々なことができるようになっています。詳しくは下記の公式ドキュメントをご覧下さい。

Attachments | Slack

それでは良いSlackライフを。

参考