JSON Lines 形式のログからメトリックを生成し、Mackerelに投稿するためのカスタムプラグインです。
mkrを使うと楽です
mkr plugin install --upgrade monitoring-forge/mackerel-plugin-jsonl
./mackerel-plugin-jsonl \
--key-name count \
--json-key foo.bar \
--aggregator count \
--log-file /path/to/your.log \
--prefix custom.jsonl
複数のキーや集計方法を指定する場合は、--key-name, --json-key, --aggregator を同じ数だけ指定してください。
| オプション | 短縮形 | 説明 |
|---|---|---|
--version |
-v |
バージョン情報を表示します。 |
--key-name |
-k |
メトリック名に使用するキー名を指定します(必須)。複数指定できます。 |
--json-key |
-j |
ログから値を抽出するJSONキーを指定します(必須)。パイプ区切りで変換関数を指定できます。複数指定できます。 |
--aggregator |
-a |
集計方法を指定します(必須)。count、sum、group_by、group_by_with_percentage、percentile、percentile(...) が指定可能です。複数指定できます。 |
--log-file |
-l |
読み込むJSON Lines形式のログファイルパスを指定します(必須)。 |
--prefix |
Mackerelメトリック名のプレフィックスを指定します(必須)。 | |
--filter |
ログ行をフィルタする文字列を指定します。指定した文字列を含む行のみ対象となります。 | |
--ignore |
ログ行を除外する文字列を指定します。指定した文字列を含む行は無視されます。 | |
--skip-until-json |
JSONの { まで読み飛ばします。プレーンテキストのヘッダーが含まれるJSONログで利用します。 |
|
--per-second |
1秒あたりの値で出力します。未指定時は1分あたりの値で出力されます。 | |
--log-archive-dir |
ログのローテート済みアーカイブディレクトリを指定します。 | |
--verbose |
詳細なログを標準エラーに出力します。 |
[plugin.metrics.jsonl]
command = "/path/to/mackerel-plugin-jsonl --key-name count --json-key foo.bar --aggregator count --log-file /var/log/app.log --prefix custom.jsonl"--aggregator には以下の種類を指定できます。
count: 対象となるキーが存在する行をカウントします- 例:
json.total.count 80000.000000 1760281381
- 例:
sum: 指定した数値キーを合計します- 例:
json.bytes_sent.sum 75000.000000 1760281381
- 例:
group_by: 指定したキーの値ごとに件数を集計します。- 例:
json.status.2xx 24769.733333 1760281381
- 例:
group_by_with_percentage: group_byの各値ごとの割合(%)も出力します。- 例:
json.status_percentage.5xx 23.139667 1760281381
- 例:
percentile: 指定した数値キーの平均値とパーセンタイル(mean, p90, p95, p99)を出力します。- 例:
json.latency.p95 0.030000 1760281381
- 例:
複数のaggregatorを同時に指定することで、複数のメトリクスを一度に出力できます。
percentile(...) の引数に、出力したい統計値・パーセンタイルをカンマ区切りで指定できます。計算には sampdo を使用します。
./mackerel-plugin-jsonl \
--key-name latency \
--json-key reqtime \
--aggregator 'percentile("max","min","mean","50","70",90,99.9)' \
--log-file /path/to/your.log \
--prefix json- 統計値は
max(最大値)、min(最小値)、mean(平均値)を指定できます。 - パーセンタイルは
0以上100以下の数値で、小数も指定できます。 - 引数は引用符あり・なしのどちらでも指定できます。
- 統計値の出力名はそのまま
max、min、meanです。数値は先頭にpを付け、小数点を_に変換します(99.9→p99_9)。
上記の例では、json.latency.max、json.latency.min、json.latency.mean、json.latency.p50、json.latency.p70、json.latency.p90、json.latency.p99_9 のみを指定順に出力します。
従来の --aggregator percentile は引き続き mean、p90、p95、p99 を出力します。percentile() のような空の指定、未対応の統計名、範囲外の数値はエラーになります。対象データがない場合は出力しません。
--json-key にはパイプ(|)区切りで変換関数を指定できます。
例: foo.bar|tolower|replace('a','b')|trimspace
| 関数 | 説明 | 利用できる aggregator |
|---|---|---|
tolower |
値を小文字に変換します。 | group_by, group_by_with_percentage |
toupper |
値を大文字に変換します。 | group_by, group_by_with_percentage |
trimspace |
値の前後の空白を除去します。 | group_by, group_by_with_percentage |
replace('pattern','repl') |
正規表現で値を置換します。 | group_by, group_by_with_percentage |
have('key1','key2','key3') |
集計結果に指定したキーをあらかじめ 0 で追加します。集計した値がない場合でもメトリックを出力できます。 |
group_by, group_by_with_percentage |
multiply(factor) |
数値に指定した係数を掛けます。 | count, sum, group_by, group_by_with_percentage, percentile |
- 数値変換関数(
multiply)は、すべての aggregator で利用できます。 - 文字列変換関数(
tolower、toupper、trimspace、replace)とhave()はgroup_byおよびgroup_by_with_percentageのみで利用できます。 multiply()はcountでは件数、group_by/group_by_with_percentageでは各値の件数、percentileでは各統計値に係数を掛けます。
例:
--json-key "user.name|trimspace|tolower"
--json-key "message|replace('error','warn')"
--json-key "status|tolower|have('2xx','3xx','4xx','5xx')"
一般的なJSON形式のWebサーバのアクセスログからメトリクスを生成する
% /path/to/mackerel-plugin-jsonl --prefix json --log-file json.log \
-k total.count -j time -a count \
-k status -j 'status|replace("^(?:([1235])\d{2}|(4)(?:[0-8]\d|9[0-8]))$","${1}${2}xx")|have("2xx","3xx","4xx","499","5xx")' -a group_by_with_percentage \
-k latency -j reqtime -a percentile
json.total.count 4800000.000000 1760339314
json.status.3xx 684256.000000 1760339314
json.status.4xx 1370792.000000 1760339314
json.status.499 344392.000000 1760339314
json.status.5xx 1031020.000000 1760339314
json.status.2xx 1369540.000000 1760339314
json.status_percentage.2xx 28.532083 1760339314
json.status_percentage.3xx 14.255333 1760339314
json.status_percentage.4xx 28.558167 1760339314
json.status_percentage.499 7.174833 1760339314
json.status_percentage.5xx 21.479583 1760339314
json.latency.mean 0.030000 1760339314
json.latency.p99 0.030000 1760339314
json.latency.p90 0.030000 1760339314
json.latency.p95 0.030000 1760339314
dnstap (https://github.com/dmachard/DNS-collector) のJSONログからメトリクス生成
mackerel-plugin-jsonl \
--prefix dnstap \
-l /var/log/dnstap/query.log \
-k network.proto \
-j 'network.protocol|tolower|have(tcp,udp)' \
-a group_by \
-k dns.qtype \
-j 'dns.qtype|tolower|have(a,aaaa)' \
-a group_by_with_percentage \
-k dns.latency \
-j dnstap.latency \
-a percentile \
-k dns.rcode \
-j 'dns.rcode|tolower|have(noerror,servfail,nxdomain,refused)' \
-a group_by \
--per-second
dnstap.network.proto.udp 25.818182 1760582504
dnstap.network.proto.tcp 0.000000 1760582504
dnstap.dns.qtype.a 19.303030 1760582504
dnstap.dns.qtype.aaaa 3.666667 1760582504
dnstap.dns.qtype.srv 0.030303 1760582504
dnstap.dns.qtype.https 2.757576 1760582504
dnstap.dns.qtype.mx 0.030303 1760582504
dnstap.dns.qtype.txt 0.030303 1760582504
dnstap.dns.qtype_percentage.a 74.765258 1760582504
dnstap.dns.qtype_percentage.aaaa 14.201878 1760582504
dnstap.dns.qtype_percentage.srv 0.117371 1760582504
dnstap.dns.qtype_percentage.https 10.680751 1760582504
dnstap.dns.qtype_percentage.mx 0.117371 1760582504
dnstap.dns.qtype_percentage.txt 0.117371 1760582504
dnstap.dns.latency.mean 0.000000 1760582504
dnstap.dns.latency.p90 0.000000 1760582504
dnstap.dns.latency.p95 0.000000 1760582504
dnstap.dns.latency.p99 0.000000 1760582504
dnstap.dns.rcode.refused 0.000000 1760582504
dnstap.dns.rcode.noerror 25.636364 1760582504
dnstap.dns.rcode.servfail 0.000000 1760582504
dnstap.dns.rcode.nxdomain 0.181818 1760582504
MIT License