🚀

K8sGPT: Prometheus Analyzers

2024/01/23に公開

v0.3.26 からPrometheus の Analyzer がリリースされました
デモ映像はこちら
https://github.com/k8sgpt-ai/k8sgpt/pull/855
本PR作成者の Daniel Clark さんは Google の方 (2024/01/18時点)で,prometheus-engine (Cloud Managed Service for Prometheus (GMP)) に多くのコントリビューションをされています.

先にまとめ

  • Prometheus Analyzer には現在二つの機能が含まれる
    • Config AnalyzerRelabel Analyzer
  • Config Analyzer は PrometheusConfig を見て以下を確認
    • 対応していないパラメータを使っていないかどうか (YAML<->構造体の相互変換)
    • スクレイピングの設定があるかどうか
  • Relabel Analyzer は Validation 用途ではなく、何が設定されているかを簡易的に解説する機能
  • Kubernetes 環境で Prometheus を初めて使うような方にとってはサポート役になってくれそうです
  • 次の会は対話型でk8sgptを使いデバッグを行っていく interactive mode について紹介できたらと思います
    https://github.com/k8sgpt-ai/k8sgpt/pull/854

実装を読み込む

ConfigAnalyzer

https://github.com/k8sgpt-ai/k8sgpt/blob/main/pkg/integration/prometheus/config_analyzer.go#L45-L103

補足

  • ConfigReloader とは
    • Prometheusの設定ファイルを動的に再読み込みし、Prometheusが再起動することなく変更を取り込むツール
  • プロンプト本文はこちら
    • Prometheus のドキュメントを参考に修正までの提案をしてくださいという内容

処理

  1. 以下のラベルを持つ Prometheus の Pod を取得
var prometheusPodLabels = map[string]string{
	"app":                    "prometheus",
	"app.kubernetes.io/name": "prometheus",
}
  1. ConfigReloader の Flag (--config-file=) から Prometheus設定ファイルが置いてあるパスを取得
    2-1. ConfigReloader がなければ Prometheus の Flag から探す
  2. パスからVolume名(k8s用語)を取得し,設定ファイルの中身を取り出す
    (※ ここまでは下準備,以降 Analyze の内容)
  3. Prometheus設定ファイルのバリデーション
    1. YAML<->構造体の変換
    2. スクレイピングの設定(ScrapeConfig)に値が入っているかどうか

出力結果 (Demo画面のスクショ)

RelabelAnalyzer

https://github.com/k8sgpt-ai/k8sgpt/blob/main/pkg/integration/prometheus/relabel_analyzer.go#L15-L85

補足

  • Prometheus の relabel_config とは

    • Service Discovery (監視対象) に対する操作ができ
    • 監視対象のフィルタ(ex: keep,drop)やラベルの変更等(ex: replace)が可能です
  • relabel_config は scrape_config のパラメータの一つ

  • プロンプト本文はこちら

    • プロンプトではscrape_configから以下の三つのパラメータを渡している
      • job_name,relabel_configs,kubernetes_sd_configs
    • 設定ファイルを見やすいよう指定したフォーマットに変換してくださいという内容
  • scrape_config のサンプル

    • Argo Workflows に Prometheus Operator の Service Monitor を作成した際のサンプル
scrape_configs:
- job_name: serviceMonitor/argo-workflows/argo-workflows-workflow-controller/0
  honor_labels: false
  kubernetes_sd_configs:
  - role: endpoints
    namespaces:
      names:
      - argo-workflows
  scrape_interval: 30s
  metrics_path: /metrics
  relabel_configs:
  - source_labels:
    - job
    target_label: __tmp_prometheus_job_name
  - action: keep
    source_labels:
    - __meta_kubernetes_service_label_app_kubernetes_io_instance
    - __meta_kubernetes_service_labelpresent_app_kubernetes_io_instance
    regex: (argo-workflows);true
(長いので割愛)  

処理

※ Prometheus Config を取得するところまでは ConfigAnalyzer と同じ

  1. relabel_configs 構造体を YAML に変換
  2. Service Discovery Config から Kubernetes の SDConfig を探す
    1. 見つかったら構造体を YAML に変換
  3. ①と② どちらかが空でない場合はプロンプトに渡す情報(補足参照)を作成

出力結果 (Demo画面のスクショ)

Discussion