kaakaa Blog

この世は極楽 空にはとんぼ

fluentd-plugin-lets-chatを作った

fluentdのプラグインを作るために色々調べたので備忘録。

概要

REST API経由でsdelements/lets-chatへメッセージを送信してくれるプラグイン

kaakaa/fluent-plugin-lets-chat

背景

Gitbucketを遊びで使ってて、Gitbucketの飛ばすWebhookをLets Chatに飛ばしたかった。

  • Let's ChatのREST APIではリクエストパラメータのJSONの中にtextフィールドを持ってなきゃいけない
  • fluentdに対して `json={}` でない形式でデータを送った時に、fluentdのin_httpプラグインだと解析してくれない(ように見えた)
    • GitbucketのWebhookが `payload={}` の形式でリクエスト飛ばすので、それを処理したかった
    • => なので、 `KEY={}` の `KEY` の部分をconfで指定できるようなHttpInputプラグインを拡張したプラグイン書いた
  • Gitbucketの飛ばすwebhookの内容が大量なので、必要な情報だけをフィルターかけてLets Chatに飛ばしたかった
    • => なので、JSONがネストしてたりする場合もあるので、ネストしていてもキー指定できるようなOutputプラグインい書いた
    • => ただし、JSONの中にArray入ってる場合は強制的に1番目の要素を引っこ抜いてる現状

こう書くとFilterプラグインが必要そうだけど、Filterプラグインの使い方がいまいち掴めなかったので、InputプラグインとOutputプラグインでほげほげしてる。

調べたこと

Fluentdプラグインの書き方については下記を参考にした。

fluentdのためのプラグインをイチから書く手順(bundler版) - たごもりすメモ

  • 自分の環境(Ruby2.0.0)では、上記のやり方に加えて development_dependencyに test-unit を追加する必要があった。

途中、プラグインをインストールしているはずなのに、Fluentd(td-agent)がプラグインを見つけてくれない問題が起こった時には、下記サイトのやり方で原因を見つけた。

Fluentdの自作プラグインがロードできないのでソースの中身を追ってみる… - kk_Atakaの日記


HttpInputプラグインを拡張するやり方、およびテストの書き方については fluent-plugin-heroku-syslog を参考にした

また、本家のin_http.rbなども参考にした。

fluentd/in_http.rb
fluentd/test_in_http.rb

おわりに

Let's ChatはUIもモダンな感じだし、簡易的だけどREST APIも付いてるので自分でホストできるチャットツールとしては優秀だと思う。
SlackやらHipChatを使える人はそっちで十分だと思うけど、色んなしがらみによって外部ツールが使いづらいひとは試してみてはどうでしょう(主にSIer方面)。

Fluentプラグインはコード量が多くならないし、Github見ればいくつもサンプルが転がってるのでコーディング方面ではあまり躓かないけど、どういう動きをしてるのかを掴むまでは辛いものがあった。
まぁ、そこら辺はFluentdのコード読めな話なので精進が足りなかったということで。

蛇足

Royal Thunder良い。