tkuchikiの日記

新ブログ https://blog.tkuchiki.net

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 が unit32uint64 の場合、 Metrics.Scaleuint32 または 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 はちょっと... という場合は perlruby でも良いと思います。

※ go-mackerel-plugin-helper は、commit 04727eebfbb32b6ba54880d497fcaf94f18be810 時点のもので確認しています。