Fluentd GitHub Slack

10年を超えたサービスの改善を加速する土台作り

Fluentd GitHub Slack

ご契約数100万ドメインを超えるムームードメイン開発チームの@pyama86です。これはPepabo Advent Calendar 2015の8日目のエントリです。

今日は2004年1月15日より提供を開始し、もうすぐ12年目を迎えるムームードメインのサービスの改善を加速する仕組みについて紹介します。

はじめに

ムームードメインは主な開発言語はPHPを利用しています。先に記載した通り、12年目をもうすぐ迎えるサービスで、故に12年分のプログラムコードが詰まっていることもあり、現代の設計手法では採用し得ないような実装も所々に残っています。その一例として下記のような実装があります。

  • example.php
require_once 'global_function.php';
$client = new exampleApi();
$result = $client->execApi();

if ( $result["code"] != 200 ) {
  // 開発者MLにメールを送信
  globalDebugMail("APIレスポンスエラー:{$result}")
}

これはAPIにPOSTした結果が正常応答ではない場合に、開発者のメーリングリストに対して、エラーメールを送信する実装です。Webhookやログ解析ツールの発達した昨今では、こういった通知はSlackなどのチャットツールへ送るか、もしくはログを出力し、その内容を元に通知することが多いと思います。この通知をメールで行う場合の起こりえる問題として下記が挙げられます。

  1. 履歴管理がしにくい、情報を蓄積しづらい
  2. 検索に適していない(メーラー依存)
  3. 基本的にメールは個人で見るものなので、エラーの自分事化がしづらい

特に3. 基本的にメールは個人で見るものなのでエラーの自分事化がしづらいについてはエラーメールを受信した際に、その対応をいつまでに、誰が、どういった方法でやるのかを管理しづらいという問題があります。こういった幾つかの問題を技術的に解決する方法について説明していきます。

ログを集める

ムームードメインではメールでのデバッグ情報の出力をやめ、下記のような実装に変更しました。

  1. ログを出力する
  2. ログを一箇所に集める
  3. 利活用できる形式にする

まずはメールの送信をやめ、全て下記のようなコードに置き換えます。

  • example.php
if ( $result["code"] != 200 ) {
  // 開発者MLにメールを送信
  logger("APIレスポンスエラー:{$result}")
}

この変更により、これまでメールを送信していた箇所が全てログファイルへの出力へと変更されました。ただし、これだけではログを検索する際に、各サーバにログインして、ログの内容をgrepなりptコマンドで検索する手間が発生します。そういった問題を解決するためにムームードメインではFluentdTreasure Dataを利用しています。

ログ基盤構成図1

上記の図のように各サーバからcollectorサーバにFluentdでログを集め、collectorサーバがTreasure Dataにログを送信しています。Treasure Dataに送信したデータはSQLに似たHiveQLを利用して検索したり、BIツールと組み合わせることにより数値を可視化することができます。

自分事化する仕組みづくり

さて、ログを一箇所に集め、検索できる仕組みはできました。次のステップとして自分事化する仕組みをご紹介します。

SlackやGitHubのIssueに集約する

メールからログファイルへの移行期間に、メールの情報を元にSlack通知やGitHubのIssueを作成するpopperというプログラムを筆者が開発しています。そして、popperを現在のログファイルへの情報収集移行後も継続して利用しています。

先に挙げたFluentdにもfluent-plugin-slackのような仕組みはあるのですが、移行期間の仕組みをそのまま使えるのであれば工数も削減できるかつ、GitHubのIssueの自動作成は現時点でFluentdのプラグインには見当たらないので、その開発コストも不要となります。

Fluentdとpopperのつなぎ込みはfluent-plugin-notifierを採用しており、特定のキーワードを含むログが出力されたことをトリガーにpopperでSlackへの通知、GitHubのIssue作成を行っています。

ログ基盤構成図2

これにより何かエラーが発生した際にSlackチャンネルで情報が共有され、さらにGitHubのIssueでそのままエラーの解決までの管理を行うことができます。

最後に

歴史あるサービスにおいて、小さなエラーを検知し、それを改善し続けるということは非常に大事なタスクの一つです。 その改善の始まりとなる気づきの仕組みを再構築することで今まで検知できていなかったエラーが見えるようになり、自動的にIssue管理することで、埋もれていたメールの情報が利用されやすい形になり、改善を加速させます。さらにはログをDBに集合し、解析、可視化することでこれまでより多角的に情報を分析することが可能になりました。

こういった情報基盤を利用し、日々の少しの改善を積み重ね、ムームードメインではよりお客様に選んでいただけるドメイン総合サービスを目指しています。