読者です 読者をやめる 読者になる 読者になる

Mercari Engineering Blog

メルカリのエンジニアブログです。技術情報を日々発信していきます。

Pascal〜Puree + ngx_lua + Fluentd + BigQueryでつくるメルカリのログ分析基盤〜

nginx

エンジニアではなくプログラマと呼ばれたい@cubicdaiyaです。今回はメルカリのログ分析基盤のお話です。

メルカリにおけるログデータ分析

メルカリでは初期の頃からログデータの分析をサービスの成長にとって重要なタスクとして位置づけ、そのための基盤作りに取り組んできました。ログの種類はいくつかありますが、中でも代表的なのがアプリケーションサーバで出力されるアクセスログやアプリケーション固有のログです。これらのログはサイズが大きいので効率良くログデータを転送するための工夫が必要になります。そこで活躍するのがFluentdです。

f:id:cubicdaiya:20150907121701j:plain

大雑把に説明するとアプリケーションサーバで出力されたログはFluentdから最終的にBigQueryやTreasure Dataといったクラウドサービスに転送されます。(上記の図は非常に簡単に済ませていますが、実際にはログの中継やフィルタリングをするためのFluentd、NorikraやKibanaといったコンポーネントもあってもう少し複雑です。)

ログデータ分析のためのインフラの運用はインフラチームが担当し、実際のデータ分析は主にディレクターやデータサイエンティストのチームが行います。また、不具合等の調査のために開発者が利用することもよくあります。

f:id:cubicdaiya:20150907125640j:plain

メルカリにはこれ以外にも色々なログデータの集計、可視化、レポーティングの仕組みが用意されています。その一例を挙げると、

  • メールによるKPIのデイリーレポート
  • MySQLを利用した分析用データベース
  • Web UIによる統計ダッシュボード
  • 外部の分析ツール利用

といった具合です。

Pascal〜独自のログ分析基盤の構築〜

メルカリではこれまで上記で挙げた複数のログデータ分析の仕組みを構築・運用してきましたが、次のような課題が出てきました。

  • 各種KPIや分析に必要な元データが分散
  • アクセスログは生データなので元々分析に利用するのには向いてなくて使いづらい(コツがいる)
  • 外部の分析ツールだと手軽に集計・可視化ができる一方、細かい部分を詳しく調べたり他のデータやツールと組み合わせるのが難しい

そこで分析に適したログを一から設計・集計して分析ツールと組み合わせて使えるようにしよう、ということで新しいログ分析基盤を構築することになりました。 この分析基盤は社内ではPascalと呼ばれているもので既に今年の夏から稼働を開始しており、タップや画面遷移といったアプリ内イベント、A/Bテストのためのログデータ分析基盤といった形で適用する領域を徐々に広げています。

Pascalは以下のコンポーネントで構成されています。

  • Puree (iOSAndroidアプリのためのログコレクタ)
  • OpenResty (ngx_luaベースのアプリケーションフレームワーク)
  • Fluentd
  • BigQuery

以下はPascalの処理の流れを図示したものです。

f:id:cubicdaiya:20150907140751j:plain

Puree

Pureeはクックパッド社がOSSで公開しているスマートフォンアプリ向けのログコレクタです。端末の通信状況やバッテリ、データ使用量といったスマートフォンアプリならではの技術的課題を考慮して設計されているのが特徴です。iOS, Androidでほぼ同じ条件でログデータを取得することができること、取得したいログデータのカスタマイズが容易なことから採用されました。(参考:モバイルアプリのログ収集ライブラリ「Puree」をリリースしました)

OpenResty

OpenRestyngx_luaをベースにしたアプリケーションフレームワークです。ngx_lua向けの便利なモジュールやLuaとLuaJIT、nginxのサードパーティモジュールがバンドルされているnginxのスーパーセットとも言えるフレームワークです。非常に高速でなおかつノンブロッキングアーキテクチャでスケーラビリティの高いnginxの強みを享受できる優れものです。

PascalではPureeからJSONで送られてくるイベント列を分解してイベントの種類(チャンネルと呼んでいます)毎にログを出力する役割を担っています。

Pascalの処理の流れ

Pascalではアプリ内のイベントデータがある程度溜まるとPureeによってフラッシュされ、OpenRestyで構築されたエンドポイントに転送されます。

各エンドポイントではJSONとして送られてきたイベントデータを分解してチャンネル毎にFluentdでタグ付けして最終的にBigQueryに格納します。

BigQueryに格納する際、流量の多いログデータは一旦ファイルに書き出して定期的にバッチで投入し、流量が少なめのログデータはfluent-plugin-bigqueryで投入することでコストと利便性のバランスを取っています。

さいごに

メルカリではこれらのログ分析基盤の改善・強化に取り組むエンジニア、新たなデータ分析の仕組みの考案やログ分析基盤を通じてサービスの潜在的な課題やニーズを見出し、解決案を提案・施行するデータサイエンティストを募集しています。

また、これらの分野に限らずメルカリでは常に優秀なエンジニアを募集しています。興味を持たれた方はぜひご応募ください。

採用情報 | 株式会社メルカリ