takutakahashi.dev

この世の全てを metrics 化できる any-exporter を作った

タイトルは釣りです。
スクリプトを書けば、prometheus が読み取れる exporter がすぐに作れるミドルウェアを作りました。

モチベーション

最近いくつか exporter を作ることがあったのですが、
以下の課題に困っていました。

  • exporter それぞれで作り込みするのがめんどくさい
    • web server や
    • prometheus metrics 記法(正式名称なんだろう)へのパースなど
  • ライブラリが充実した言語や、書き慣れた言語でロジックを書きたい
    • shell exec などしたくない

なので、メトリクス収集ロジック以外を実装したミドルウェアを作ろうと思いました。

成果物

成果物はこちらになります。

https://github.com/takutakahashi/any-exporter

以下の機能を実装しています。

  • yaml による configuration
  • 任意の言語でロジックを書ける
    • output は json 形式文字列
    • json から metrics 記法へ自動でパース
  • メトリクス定期非同期実行・更新

使い方

  1. ロジックを書きます

自己実行可能なスクリプトとして書きます。

  1. 出力を整形します

最終行が json となるようにスクリプトで出力します。
Shell Script だと難しいんですが、一般的な高級言語なら簡単に出力できると思います。
出力は、以下の形式に則って書きます。

{
  "name": "出力するときのメトリクス名前",
  "values": [
    {
      "labels": {"label名": "labelの値"},
      "value": メトリクスとして出力する数値
    }
  ]
}

こんな感じで書きます。

#!/bin/bash
AUTHOR=$1
DATE=`date +%s`
FMT='{"name": "test", "values": [{"labels":{"author": "%s", "color":"green"}, "value": 1.0}, {"labels":{"color": "black", "time": "%d"}, "value": 12345.0}]}'
printf "$FMT" "$AUTHOR" "$DATE"

直接↑を実行して、ちゃんとした値が取れるかデバッグします。

  1. config 書きます

以下の形式で config を書きます。

- workdir: "スクリプトが入っているディレクトリの絶対パス"
  scriptPath: "スクリプト実体の workdir からの相対パス"
  args: ["スクリプトの引数"]

このような感じで書きます。

- workdir: "/app/example/test_metrics"
  scriptPath: "./metrics"
  args: ["takutakahashi"]
  1. image build します

だいたい container image としてまとめると思うので、build します。 該当のスクリプトと、スクリプトが実行できる環境を構築します。

  1. 動かします

あとはお好きな環境で動かします。

まとめ

もうちょっとゼロコストで exporter を作れるようにして、
バンバン数値化しようと思います。