くりにっき

フルスタックキュアエンジニアです

fluentd初心者がgitlabとChatWorkを連携してみた

こんにちは、fluentd歴2週間です(挨拶)

会社でGitlabとChatWorkを使ってるので連携してみました

ゴール

Gitlabのリポジトリが更新されたらChatWorkに通知を流す

fluentdに至るまでに考えた構成

gitlabのwebhookを受けてChatWorkに通知するアプリを作る

f:id:sue445:20140629030419p:plain

問題点

  • GitlabとChatWorkが密結合
    • 汎用性がない
  • オレオレアプリ増やしたくない

gitlabのwebhookをJenkinsで受けてChatWorkに通知

f:id:sue445:20140629030857p:plain

webappの部分がJenkinsになっただけ

問題点

  • ChatWorkに通知するだけでジョブ追加するのは大げさ
  • 通知対象のリポジトリ増やす度にジョブコピペつらい

fluentdを使ってみることにした

f:id:sue445:20140629031326p:plain

  • 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 を作った

使い方はこんな感じ

<match **>
  type         chatwork
  api_token    YOUR_SECRET_TOKEN
  room_id      0000000000
  message      Hello ChatWork!\n<%= record["value"] %>
</match>

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

f:id:sue445:20140629034336p:plain

  • gitlab*1のwebhookのレスポンスにはリポジトリのURLが含まれないのでURL(tag)に含めて引き回す必要がある
    • /gitlab/namespace/repository みたいなpathにするとin_httpプラグインがタグを gitlab.namespace.repository にする
    • tagの内容を動的に取得してごにょごにょする方法を探してたら id:tagomoris さんの fluent-plugin-forest を見つけた(ノ∀`)

ChatWorkへの通知

f:id:sue445:20140629034206p:plain

fluentd所感

  • よかった
    • 構成がシンプル
    • インストールが思ったよりも楽
    • 日本人が作ってるので日本語のドキュメントが充実してる
  • つらみ
    • 設定ファイルが横に長くなる

追記

Gitlab Webhookのつらみ

v6.7時点なので他バージョンでは事情違うかも

  • Issue Eventsの挙動がおかしい
    • Created(issueの新規作成)だとWebhook 1回だけ叩かれるのに、ClosedやReopenedだと2回叩かれる
  • Webhookのレスポンスの中身がいろいろ足りない

ChatWork APIのつらみ

  • 実装されてない機能が多すぎる
    • 2014年2月で更新止まってる

*1:v6.7時点