へろへろもへじ

(ブログタイトル募集中)

【Fluentd】ネストされたJSONをフラットにするFluentdのプラグイン(fluent-plugin-json-nest2flat)を公開しました

たぶん需要はないとは思うのですが、勉強がてらに俺得プラグインを公開しました。

fluent-plugin-json-nest2flat | RubyGems.org | your community gem host
fukuiretu/fluent-plugin-json-nest2flat · GitHub

※13/12/25 不具合を修正しました。。
※13/12/27 パラメータの追加と不具合を修正しました。
※14/01/11 パラメータの追加をしました。

プラグインの概要

ネストされたJSONをフラットに変換します。例えば以下のような感じです。

■変換前
{"hoge":1, "foo":2, "data":{"name":"taro", "age":18, "height":175}}

■変換後
{"hoge":1, "foo":2, "name":"taro", "age":18, "height":175}

用途

そもそもなぜ作ったのか?といいますと、以下の要件を実現するのに弊害があったからです。

  1. アプリ(Webサーバ)で吐いたログをtd-agentのin_tailを利用して、受信(ログ集約)サーバにフォワードする。
  2. フォワードされたログをfluent-plugin-redshiftを利用し、Redshift上のテーブルにCOPYする

アプリ側で吐いているログの一部の要素がJSONになっておりまして、これをin_tailで噛ませると、JSONが入れ子になってしまいます。でですね。RedshiftのテーブルにはJSONではなくフラットなカラムとしてデータを保持したかったのです。
今回作成したプラグインを利用することで、上述の「プラグインの概要」を例とすると、
"data":{"name":"taro", "age":18, "height":175}という1カラムを、
"name":"taro", "age":18, "height":175という3カラムにすることが可能になります。

使い方

GItHubのREADMEをご参照ください。

所感など

fluent-plugin-datacounterのautorであり、fluentd界隈で有名なtagomorisさん、
fluent-plugin-jsonbucketのautorのmoaikidsさんの記事やプログラムを大変参考にさせて頂きました。この場を借りてお礼申し上げます。ありがとうございました!

今回初めてRubyに触れたので、こんなしょぼいプラグインでもかなり時間がかかってしまいました。。(プログラム的に怪しい部分もあるかもしれません。。)少しづつRubyも勉強して、次はもっとサクッとスマートに実装できるように頑張ります。

もっと、JSONの変換を細かくゴニョゴニョしたいという方はこちらで紹介されている(gemは公開されていない?)実装を参考にするとよいかと思います。
suz-lab - blog: FluentdでJSON形式のログを読み込んで整形する

GitHubのREADMEは追々整備します。。。
あと、2階層以上のネストにも対応できるようにしたいと思います。

参考サイト


それでは、メリークリスマス\(^o^)/