インターネットメモ帳

文章を書く練習をする場所

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のフォーマット

prometheus.io

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 の場合

  • metric_name: go_gc_duration_seconds
  • label: name=quantile="0.0"
  • value: 0.0

となる。labelはパーセンタイル等、同一Metricsだが、ラベル付をしたい時任に利用する

HELPとTYPE

これとは別に #HELP#TYPE が存在している

# HELP $MetricName $Description というような形でMetricsに対して説明を付与することができる

# TYPE $MetricName $MetricType というような形でMetricsがどんなMetricsなのかを付与できる。

付与できる一覧は以下

  • Counter: カウンター、単調増加する値、完了したタスク数のような値で使う
  • Gauge: ゲージ、単一の数値、メモリ使用量など
  • Histogram: ヒストグラム
  • Summary: 概要、リクエスト期間等でサンプリングできるもの、パーセンタイル等で使える
  • Untyped: 型なし

prometheus.io

Stackdriveに変換される上でのポイント

prometheus to stackdirverにて変換するときは以下のように変換する

MetricType

  • COUNTER OR HISTOGRAM -> CUMULATIVE
  • OTHER -> GAUGE

github.com

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では型があるので変換される

cloud.google.com

  • すでにcustomMetricsが定義されいる場合: 定義されている型に従う(おそらく)
  • MetricTypeがHISTOGRAMの場合 -> DISTRIBUTION
  • それ以外: INT64

github.com

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

https://github.com/int-tt/prometheus-test