prometheus-to-sdを調べた時のメモ
Prometheus to stackdriver
LTする上で prometheus text formatをstackdriver向けに変換してくれる prometheus-to-sd を調べた時のメモです。何もわからんとこから調べたので、もし間違ってたら指摘してもらえると助かります
https://github.com/GoogleCloudPlatform/k8s-stackdriver/tree/master/prometheus-to-sd
prometheus text formatとは
prometheusが扱えるmetrcisのフォーマット
text formatの仕組み
go_gc_duration_seconds{quantile="0.0"} 0.0
metric_name [ - "{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}" - ] value [ timestamp ]
https://ja.wikipedia.org/wiki/EBNF EBNFの読み方不明だったので参考
- metric_name: metrics名
- label_name="label_value"(optional): ラベル名とラベルの値 カンマでつなげることで複数定義可能
- value: 値、中身はGoのParseFloat()でパースできる値である必要がある。数値以外では
Nan
+Inf
-Inf
が使える。 - timestamp(optional): timestamp
go_gc_duration_seconds{quantile="0.0"} 0.0
の場合
となる。labelはパーセンタイル等、同一Metricsだが、ラベル付をしたい時任に利用する
HELPとTYPE
これとは別に #HELP
と #TYPE
が存在している
# HELP $MetricName $Description
というような形でMetricsに対して説明を付与することができる
# TYPE $MetricName $MetricType
というような形でMetricsがどんなMetricsなのかを付与できる。
付与できる一覧は以下
- Counter: カウンター、単調増加する値、完了したタスク数のような値で使う
- Gauge: ゲージ、単一の数値、メモリ使用量など
- Histogram: ヒストグラム、
- Summary: 概要、リクエスト期間等でサンプリングできるもの、パーセンタイル等で使える
- Untyped: 型なし
Stackdriveに変換される上でのポイント
prometheus to stackdirverにて変換するときは以下のように変換する
MetricType
COUNTER OR HISTOGRAM
->CUMULATIVE
OTHER
->GAUGE
func extractMetricKind(mType dto.MetricType) string { if mType == dto.MetricType_COUNTER || mType == dto.MetricType_HISTOGRAM { return "CUMULATIVE" } return "GAUGE" }
ValueType
stackdriverで扱う値は ParseFloatでパースできるかどうかしか見てないが、StackdriverのValue Typeでは型があるので変換される
- すでにcustomMetricsが定義されいる場合: 定義されている型に従う(おそらく)
- MetricTypeがHISTOGRAMの場合 -> DISTRIBUTION
- それ以外: INT64
func extractValueType(mType dto.MetricType, originalDescriptor *v3.MetricDescriptor) string { // If MetricDescriptor is created already in the Stackdriver use stored value type. // This is going to work perfectly for "container.googleapis.com" metrics. if originalDescriptor != nil { // TODO(loburm): for custom metrics add logic that can figure value type base on the actual values. return originalDescriptor.ValueType } if mType == dto.MetricType_HISTOGRAM { return "DISTRIBUTION" } return "INT64" }
https://cloud.google.com/monitoring/api/v3/metrics-details?hl=ja#metric-kinds