mackerel-agent-pluginの出力をJSONに変換するやーつを作った
GW前に緊急事態宣言が出されたためにクラブイベントが全てなくなって、なんにもすることがなくなり酒飲んでアニメ見てたマンですこんにちは。
そんななか、GW中唯一の進捗が「mackerel-agent-pluginの出力をJSONに変換するやーつ」でございます。
canning(缶詰)をもじってkanningとしました。
mackerelがサバなので、サバを缶詰にするイメージでの命名です。
なお、まだ本番投入してないし、テストも書いてないので本番利用しないでください(誰も使わないと思うけど)
なんぞこれは?
上述のまんまなんですけど、標準入力にmackerel-agent-pluginの出力をわたすと、JSONに変換して標準出力してくれるCLIです。
mackrel-agent-pluginは
メトリクス名\t値\tタイムスタンプ
という形式のTSVフォーマットで出力します。
具体的には、
fireworq.jobs.elapsed.jobs_average_elapsed_time 0 1620055407 fireworq.node.active_nodes 1 1620055407 fireworq.node.active_nodes_percentage 100 1620055407 fireworq.queue.workers.queue_idle_workers 20 1620055407 fireworq.queue.workers.queue_running_workers 0 1620055407 fireworq.queue.buffer.queue_outstanding_jobs 0 1620055407 fireworq.jobs.jobs_failure 0 1620055407 fireworq.jobs.jobs_success 0 1620055407 fireworq.jobs.jobs_outstanding 0 1620055407 fireworq.jobs.jobs_waiting 0 1620055407 fireworq.jobs.events.jobs_events_pushed 0 1620055407 fireworq.jobs.events.jobs_events_popped 0 1620055407 fireworq.jobs.events.jobs_events_failed 0 1620055407 fireworq.jobs.events.jobs_events_succeeded 0 1620055407 fireworq.jobs.events.jobs_events_completed 0 1620055407
こういうデータを標準入力に食わせると
{ "jobs": { "elapsed": { "jobs_average_elapsed_time": 0 }, "events": { "jobs_events_completed": 0, "jobs_events_failed": 0, "jobs_events_popped": 0, "jobs_events_pushed": 0, "jobs_events_succeeded": 0 }, "jobs_failure": 0, "jobs_outstanding": 0, "jobs_success": 0, "jobs_waiting": 0 }, "node": { "active_nodes": 1, "active_nodes_percentage": 100 }, "queue": { "buffer": { "queue_outstanding_jobs": 0 }, "workers": { "queue_idle_workers": 20, "queue_running_workers": 0 } } }
こんな具合にjsonに変換して出力してくれるというものでございます。
何に使うの?
mackerel-agent-pluginの出力をtelegrafに食わせるのが目的です。
telegrafはinfluxdb社が開発しているメトリクスコレクターみたいなやつです。
何ゆえtelegraf?
mackerelに課金する金がねえwwwwww
で、telegrafは入力プラグインを作ってPR出してマージしてもらうか、外部コマンド実行から標準出力を取り込む(input.exec)ことができるので、今回は後者を選択したという感じです。
今回メトリクスを取りたいミドルウェアははてな社が作っているジョブキューシステムのfireworqで、fireworqは公式のmackerel-agent-pluginは公式のものが存在するので、それをそのまま利用したいなと考えたわけです。
(mackerel-agent-pluginは単体実行できる形式で提供されている)
あと、telegrafはcloudwatchを出力先にするプラグインがあるので、それも理由の一つですね。
mackerel-agentをforkして出力先をcloudwatchに魔改造することもちょっと考えたけど、さすがに工数が大きいのでやめておきました。
なお、cloudwach-agentはtelegrafのforkなので、それを使ったらいいんじゃないかとも考えましたが、独自のメトリクスを取り込む機構がオミットされてるっぽかった(多分)ので、ボツになりました。
メトリクスコレクター、みんな何使っとるん?
何使ってるんですかね?
みなさん、datadogかmackerelつかってて、そんな困ってないんですかね?
モニタリングにcloudwatch使ってると、メトリクスどうやって収集しようかってなるんですけど、telegrafの利用例の記事って日本語の記事あんまり出てこないんですよね。