関連ページ

Robust Perception とは

メトリックのラベル名の数を減らす/違う Time Series になってしまうものを意図的に同じ TS にまとめる

  • sum/max/min などの集計関数に by (残したいラベル) をつける
  • 例えば GKE 上に Prometheus を helm chart でインストールしていて
    • preemptible node に node_exporter を乗せていた場合、再起動するたびに Node のアドレスが変わるため、別 Time Series になってしまう
      • node_exporter から scrape された metrics の中には node_exporter が稼働する Node の IP アドレスが instance ラベルとして自動的に追加されるため
    • Prometheus helm chart を upgrade した場合、kube_* metrics が別 Time Series になってしまう
      • kube_* metrics を提供する kube-state-metrics から scrape した metrics の中には、chart 名と chart version が chart ラベルとして自動的に追加されるため
      • chart="prometheus-9.1.0" のような形で追加される
    • Node ごとのインスタンス起動時間を求める
      max(node_boot_time_seconds) by (node)
  • Grafana で表形式で結果を出すときに、表示するカラムを絞るときにも使える

複数 metric を JOIN する

  • 参考: https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching external_link
  • 1対1、1対多、多対1 のマッチングが可能(多対多は未サポート)
  • 必ず演算子が必要になる
    • 算術演算子 +-*/%^
    • 比較演算子 == !=
    • 論理演算子 and or unless
  • 1対1 のとき
    • on(<ラベル名>) で指定したラベルのみが結果の metrics に残る
    • ignoring(<ラベル名>) で指定したラベル以外が結果の metrics に残る
    • optional で、group_left group_right を追加してもよい
      • group_left は左側の metrics についているラベルを残すときに使う
      • group_right は右側の metrics についているラベルを残すときに使う
      • group_left(<ラベル名>) のようにラベル名を追加すると、逆側のラベルを残せる(group_left なら右側のラベル、group_right なら左側のラベル)
  • 1対多、多対1 のとき
    • on ignoring の挙動は一緒
    • group_left group_right の指定が必須になる
    • app: growi というラベルが設定された Pod が現在稼働している Node を得る
      sum(kube_pod_labels{label_app="growi"} * on (pod) group_left(node) kube_pod_info) by (pod,node)
      • Pod のラベルは kube_pod_labels という metric、稼働している Node など現在の状況は kube_pod_info という metric にラベルとして付加されている
      • このようなラベルに情報が入っており metric value に意味を持たない metric には、通常 1 が設定されている
        • Prometheus は value として数値以外のデータを扱えないため、文字列データはすべて metric のラベルとして付加することで記録する必要がある
      • metric value として 1 が設定されている理由は、おそらく掛け算で join すれば元の値を変化させずにラベルを追加することが可能だからだと思われる