fluent-plugin-inline-classifier という input プラグインを作りました。このプラグインを使うと、メッセージのとあるキーに入っている値に基づき、メッセージを分類し、結果を別のキーとして挿入することができます。
アクセスログを fluentd で流している時には reqtime
にレスポンスタイムが入っていることが多いと思います。しかし、reqtime は数値なので、Kibana で Terms panel を使って Pie chart や table で表示しようとしてもうまくいきません。
そんな時にこのプラグインを使えば、reqtime を元にログをいくつかのカテゴリに分類することができます。分類結果は有限なので、Terms panel を使って各カテゴリに該当するログがどれだけあるかが一目瞭然になります。
インストール
gem でインストールできます。
$ gem install fluent-plugin-inline-classifier
設定
設定例を載せておきます。
<match raw.access.**>
type inline_classifier
add_prefix classified
remove_prefix raw
<rule>
key reqtime
type range
store speed
class1 ~20ms * 0.02
class2 20-50ms 0.02 0.05
class3 50-100ms 0.05 0.1
class4 100-200ms 0.1 0.2
class5 200-500ms 0.2 0.5
class6 500-1000ms 0.5 1.0
class7 1000ms~ 1.0 *
</rule>
</match>
type
, add_prefix
, remove_prefix
は見たままです。
分類方法は rule
セクションで指定してやります。rule
セクションは複数指定することが可能です。
-
key
: 分類に使用するキーを指定します。 -
type
: 分類方法を指定します。v0.1.0 ではrange
のみサポートしています。 -
store
: 分類結果を書き出すキーを指定します。 -
classN
: クラス名と条件を指定します。条件は type に依存します。条件は N の昇順にチェックされ、最初にマッチしたクラス名が分類結果になります。
range classifier
条件は min max
の形で指定します。判定は min <= x < max になります。min や max には *
を指定することもでき、指定した側の値は考慮されなくなります。今のところ * *
には対応していません。
上のサンプルによれば、reqtime
が 0.02 未満なら speed
に ~20ms という値が挿入されます。同様に、reqtime
が 0.1 なら speed
に 100-200ms という値が挿入されます。
Elasticsearch の設定
speed
というキーが Elasticsearch に登録されると、適当に解析されてしまってうまく表示できないと思います。そんな時には Elasticsearch の index templates で解析方法を指定する(または、default mapping が効かない時に) を参考にしてください。