今回はPrometheusのGoのライブラリーと公式ページを参考に、メソッドについてメモを残しておきます。
参考にしたのは以下のドキュメント・書籍です
prometheusパッケージ(go)
公式Document
入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング
📊Mtricsの種類について
golangのprometheusパッケージのMetrics章にはこんなことが書いてあります。(https://pkg.go.dev/github.com/prometheus/client_golang/prometheus#hdr-Metrics)
However, in addition to the basic plumbing shown in the example above, you only need to understand the different metric types and their vector versions for basic usage.
訳: (圧倒されるような量のMetricの定義あることに対して)しかし、実用する上で理解しなければいけないことは、上記の例に示されている標準的な繋ぎ込みの実装に加えて異なるメトリック型とそのベクターバージョンだけです。
ベクターバージョンは後述するメトリックタイプの接尾として扱われ、ラベルと呼ばれる次元に沿ってサンプルを分割し、メトリックベクトルを作成します。イメージ的には同じ値をさしている複数の切り口(=ラベル)をつけられるといったところです。
入門Prometheusでは3章にPythonの実装例が書かれていたので
🧮メトリクスタイプ
Counter
単調増加する値を表す累積的な指標。増加するか0にリセットするかの二つの操作を行える。
例: リクエスト数・エラー数
Gauge
任意に上下する値を表す
例: メモリ使用量・同時接続数
Histgram
観測値をサンプリングし、設定可能なバケットでカウントします。全ての観測値の合計も提供します。Apdex(アプリケーションパフォーマンスインデックス)の計算に適している。
観測値の例: リクエストの所要時間,レスポンスのサイズ
例:リクエストの所要時間の計算
⚙️Summary
観測値をサンプリングし、sliding time windowにおける測定可能な分位点を計算します。
📦実際に使ったもの
今回は、HTTPリクエストに対してのエンドポイント・ステータスコード別のカウンター、各リクエストの処理時間の推移(エンドポイント別)を実装したので CounterVec と HitgramVec を利用しました。
これは実際に使用したMetricsインスタンスを作成する実装です。
func New() *Metrics {
//1. make CounterVec
requestTotal := prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "HTTPリクエストの総数です",
},
[]string{"service", "method", "path", "status"},
)
// 2. make HistogramVec
requestDuration := prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "HTTPリクエストの処理時間(秒)",
Buckets: []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10},
},
[]string{"service", "method", "path"},
)
return &Metrics{
requestsTotal: requestTotal,
requestDuration: requestDuration,
}
}
共通の実装構造の解説
このようにNewXXXVecで似たような構造にしておくことで計装の実装がやりやすくなっています。
NewXXXVec はタプル構造になっています。
- XXXOpts という名前のインテグレーション毎の構造体
- ラベル名
ラベル名をタプルに加えることでVec特有の構造を表現しているところがわかりやすい抽象化だなと思いました。
🎀 まとめ
一見すると型が多くて複雑そうですが、実際に触ってみると Counter / Gauge / Histogram / Summary の4種とその Vector を押さえるだけで、実用的な計装を書けることが分かりました。
今回、AIで開発して分からないことを後から調べてまとめてみるという方法を取ったのですが、実際に写経したことあるコードが出てきて「このコードはこういう意味だったのか!」と回収できて楽しく学習することができました。