DevDevデブ!!

プログラミングのこととか書きます。多分。。。

mackerel-agent-pluginの出力をJSONに変換するやーつを作った

GW前に緊急事態宣言が出されたためにクラブイベントが全てなくなって、なんにもすることがなくなり酒飲んでアニメ見てたマンですこんにちは。

そんななか、GW中唯一の進捗が「mackerel-agent-pluginの出力をJSONに変換するやーつ」でございます。

github.com

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社が開発しているメトリクスコレクターみたいなやつです。

www.influxdata.com

何ゆえ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の利用例の記事って日本語の記事あんまり出てこないんですよね。