ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

fluent-plugin-json_expanderというものを作ったんだ

github.com

やりたいこと

  • データとして流れてくるJSONの中身を見て、動的にアウトプットを編集したい。

こういうことができます

こういう設定を書いておく。

<match access.summary>
  type json_expander
  subtype growthforecast

  <template>
    gfapi_url http://127.0.0.1:5125/api/
    graph_path ${data[mothor_host]}/${data[vhost]}/${key_name}
    name_keys count_2xx,count_3xx,count_4xx,count_5xx
  </template>
</match>

すると、こういうデータが流れてきたときに、

// tag = access.summary
{
  "mother_host": "kvm001.udzura.jp",
  "vhost": "front.udzura.com",
  "count_2xx": 1234,
  "count_3xx": 567,
  "...": "..."
}

受け取って、内部でtemplateからこういうoutputを生成して、そこに流し込んでくれます。この場合はout_growthforecastに受け流す。

type growthforecast

gfapi_url http://127.0.0.1:5125/api/
graph_path kvm001.udzura.jp/front.udzura.com/${key_name}
name_keys count_2xx,count_3xx,count_4xx,count_5xx

オプションなど詳細は READMEをどうぞ。

背景、作ってみて思ったことなど雑感

hb.matsumoto-r.jp

松本リーなんとかさんがこういった検証を進めていて、その一環でぼくに"""圧"""がきたのでgrowthforecastの設定がより便利になるよう作った。もちろん、vhostごとに集約先のログファイル名を変えたい、しかも動的にやりたいんだ!!1、といった場合にも有効だと思う。

プラグインの製作の過程では、 id:tagomoris さんの先行実装、というかforestがめちゃくちゃ参考になった。感謝してもしきれません...。

github.com

このへんとかですね。

おかげで、Fluentdの内部実装にも若干詳しくなり、なるほど綺麗な設計だなと思うなどした。いつかまとめるかもしれない。。

制限事項

レコードごとに内部でアウトプットを作る(または使い回す)、という実装のため、いったんEventStreamとChainをその都度その都度ダミーで作って流し込む、という実装方針にしている。

このへんです

このおかげで、多分タグやレコードをつかけえてフォワードする系のやつがうまく動かないかもしれない。一方、先ほどのout_growthforecastのような、データの流れの終端となるようなoutput pluginはちゃんと動くと思われる。この辺り、もっといい感じの実装方針があれば是非プルリクいただきたいところ。

稼働実績

先ほどの記事の通り、 id:matsumoto_r さんの自宅サーバで動作している。なのでプロダクション投入されていると言って差し支えないだr

メモリが太りそうな感じもするけど、いまのところそういうことは起こっていない模様。人柱求む。


そんな感じで、今月めちゃくちゃコードを公開した気がする。。