ソースコード: https://github.com/kazegusuri/fluent-plugin-prometheus
Gem: https://rubygems.org/gems/fluent-plugin-prometheus
Prometheusは最近できたOSSのモニタリングシステムです。発表当時は少し触っている人がいましたが今はあまり聞かなくなりました。開発自体は順調に進んでいるようです。日本語ではこのあたりで紹介されています。
PrometheusはGraphiteと同様にメトリクスを収集してグラフ化やアラートなどができるものです。
今回作ったfluent-plugin-prometheusはFluentdでメトリクスを収集してPrometheusと連携するものです。少し異なるのはFluentdからPrometheusに送信するのではなく、PrometheusからFluentdにメトリクスを取得しにいくという違いがあります。
余談ですがなぜPrometheusを使っているかというと、Kubernetesがシステム内部のメトリクス収集にPrometheusを使っているからです。まだPrometheus自体微妙なところもありますが、これから盛り上がるかもしれません。
使い方
fluent-plugin-prometheusは4つのプラグインを内蔵しているのでそれぞれを説明します。
prometheus
input plugin
プラグインで収集したメトリクスをPrometheusに渡すためのエンドポイントを設定するプラグインです。必ず設定しておく必要があります。
<source>
type prometheus
</source>
これでポート23231でLISTENされるのでPrometheusからメトリクスが取得できるようになります。
prometheus_monitor
input plugin
Fluentd本体に組み込みで入っているmonitor_agentプラグインの情報を自動的に取得してPrometheusに渡すプラグインです。
現在取得できるものはBufferedOutputプラグインの以下の情報です。
- キューの長さ
- 全データサイズ
- 現在のリトライ数
prometheus
output/filter plugin
メインとなるメトリクスを収集するためのプラグインです。OutputとFilterの両方をサポートしています。使い勝手はほぼ同じです。ここではFilterでの使い方を説明します。
<filter message>
type prometheus
## レコード中のfooの値をcounterメトリクスとして収集
<metric>
name message_foo_counter ## Prometheusのmetric名
type counter ## Prometheusのmetric type
desc The total number of foo in message. ## Prometheusのmetricの説明文
key foo ## どのkeyの値を収集するか
<labels> ## 付与するラベル
key foo ## key=foo でラベルを追加
data_type ${type} ## レコード中のtypeの値をラベルの値として利用
</labels>
</metric>
## レコード中のbarの値をcounterメトリクスとして収集
<metric>
name message_bar_counter
type counter
desc The total number of bar in message.
key bar
<labels>
key foo
</labels>
</metric>
## 2つのメトリクスの共通のラベル
<labels>
host ${hostname}
tag ${tag}
</labels>
</filter>
<match message>
type stdout
</match>
上記のようにメトリクスを収集したいレコードに処理を挟むようにFilterを追加するだけです。Filterプラグインですが元のレコードの値を変更することはありません。
この状態でmessage
というタグ名でfooやbarを含むレコードを送信するとmessage_foo_counter
とmessage_bar_counter
というメトリクスが生成され、Prometheusから収集されるようになります。
Prometheusで重要な概念であるラベルも自由に設定できるようにしてあります。レコードの中から値を設定できるので、例えばHTTPのレスポンスコードをラベルの値として追加してレスポンスコード毎の比率をグラフ化なども可能です。
チュートリアル
データを用意したり、Prometheusのセットアップが面倒という場合はチュートリアルも用意してあるので試してみて下さい。