こんにちは、fluentd歴2週間です(挨拶)
会社でGitlabとChatWorkを使ってるので連携してみました
ゴール
Gitlabのリポジトリが更新されたらChatWorkに通知を流す
fluentdに至るまでに考えた構成
gitlabのwebhookを受けてChatWorkに通知するアプリを作る
問題点
- GitlabとChatWorkが密結合
- 汎用性がない
- オレオレアプリ増やしたくない
gitlabのwebhookをJenkinsで受けてChatWorkに通知
webappの部分がJenkinsになっただけ
問題点
- ChatWorkに通知するだけでジョブ追加するのは大げさ
- 通知対象のリポジトリ増やす度にジョブコピペつらい
fluentdを使ってみることにした
- fluentdは使ったことなかったけどどんなものかはなんとなく知ってた
- webhookを受けることは出来るけどChatWorkに通知するプラグインがなかったのでそれだけは作る必要あった
- fluentdのプラグインであればGitlabのwebhook以外でも使えるので再利用性高そう
- (一応)全社のインフラを見てる立場なので素振りがてら使ってみたかった
インストール
OpenStackのCPU1コア、メモリ1GB、Debian Wheezyのインスタンスを使用。入れたミドルはnginxとgitくらい
http://docs.fluentd.org/ja/categories/installation を参考にインストール
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
でコンソールにログが出ねーってハマってましたが、stdoutプラグインってcurlした時のコンソールじゃなくてtd-agent.logに出るんですね(恥
fluent-plugin-out_chatwork を作った
- github https://github.com/sue445/fluent-plugin-out_chatwork
- rubygems http://rubygems.org/gems/fluent-plugin-out_chatwork
使い方はこんな感じ
<match **> type chatwork api_token YOUR_SECRET_TOKEN room_id 0000000000 message Hello ChatWork!\n<%= record["value"] %> </match>
- erbと改行はプラグイン側で実装
- プラグインの作り方は id:bash0C7 さんの https://github.com/bash0C7/fluent-plugin-idobata や https://github.com/bash0C7/fluent-plugin-ruby_one_liner を
パクらs参考にさせて貰いました- ビバrspec
webhookを受けるためのnginx設定
td-agentの in_http だけだとwebhook受けられなかったのでnginx経由させた
server { location / { proxy_pass http://127.0.0.1:8888; break; } }
80番ポートで受けて8888ポート(fluentd)に流すだけのシンプルな設定
実際に設定してみた
もうちょっときれいに出来そうだけどだいたいこんな感じ
設定ファイルの書き方も id:bash0C7 さんのGitLab魔改造カンファレンスの資料を参考にさせて貰いました
Gitlabに登録するwebhook
- gitlab*1のwebhookのレスポンスにはリポジトリのURLが含まれないのでURL(tag)に含めて引き回す必要がある
- /gitlab/namespace/repository みたいなpathにするとin_httpプラグインがタグを
gitlab.namespace.repository
にする - tagの内容を動的に取得してごにょごにょする方法を探してたら id:tagomoris さんの fluent-plugin-forest を見つけた(ノ∀`)
- /gitlab/namespace/repository みたいなpathにするとin_httpプラグインがタグを
ChatWorkへの通知
fluentd所感
- よかった
- 構成がシンプル
- インストールが思ったよりも楽
- 日本人が作ってるので日本語のドキュメントが充実してる
- つらみ
- 設定ファイルが横に長くなる
追記
Gitlab Webhookのつらみ
v6.7時点なので他バージョンでは事情違うかも
- Issue Eventsの挙動がおかしい
- Created(issueの新規作成)だとWebhook 1回だけ叩かれるのに、ClosedやReopenedだと2回叩かれる
- Webhookのレスポンスの中身がいろいろ足りない
- リポジトリのURLくらいはほしい。。。
ChatWork APIのつらみ
- 実装されてない機能が多すぎる
- 2014年2月で更新止まってる
*1:v6.7時点