mackerel-agent-plugin の diff の出力結果を加工してデータを per sec にする
mackerel-plugin-mysql を例にすると、
$ ./mackerel-plugin-mysql | grep Com_ mysql.cmd.Com_insert 0.000000 1475200487 mysql.cmd.Com_select 6.000000 1475200487 mysql.cmd.Com_update 0.000000 1475200487 mysql.cmd.Com_update_multi 0.000000 1475200487 mysql.cmd.Com_delete 0.000000 1475200487 mysql.cmd.Com_delete_multi 0.000000 1475200487 mysql.cmd.Com_replace 0.000000 1475200487 mysql.cmd.Com_set_option 0.000000 1475200487
は、1 分間に各 SQL をどれくらい実行したかという結果だと思いますが、
秒間どれくらい実行しているかというデータを見たいことがあると思います(少なくとも私は見たい)。
mackere-agent-plugin-helper の Metrics 構造体に Scale というフィールドがあり、データに指定の値を乗算する機能があります(キロバイトをバイトに変換したいときに 1024 をかけるみたいな感じ)。
これに 1 / 60
を渡せるようにすればよいかと思いましたが、 Metrics 構造体の Type が unit32
か uint64
の場合、
Metrics.Scale
を uint32
または uint64
でキャストするので 0 になるためこの方法は使えませんでした。
プラグインを変更するにしても、Type を全部 float64
にしてしまうのは乱暴ですし、特定の値だけ 60 で除算する、というのをどうやって指定するのかという問題があります。
そこで、mackerel-agent-plugin の出力結果を加工してしまうという方法があります。
mackerel-plugin-mysql を例にすると、mysql.cmd.Com_*
だけ 60 で除算したい場合、
$ ./mackerel-plugin-mysql | awk '{val=$2; if ($1 ~ /mysql\.cmd\.Com_/){ val = val / 60.0 } printf("%s\t%.6f\t%d\n", $1, val, $3) }'
のようにすれば OK です。
awk はちょっと... という場合は perl や ruby でも良いと思います。
※ go-mackerel-plugin-helper は、commit 04727eebfbb32b6ba54880d497fcaf94f18be810 時点のもので確認しています。