はじめに
Prometheusはメトリクス収集対象を静的に記載して扱うこともできますが
ServiceDiscoveryを利用すれば対象の自動的な検出が可能です。
本記事ではKubernetesのServiceを利用してメトリクスを収集する際にマニフェストに記載する以下のアノテーションの役割について実機で確認しました。
- prometheus.io/scrape
- prometheus.io/scheme
- prometheus.io/path
- prometheus.io/port
環境情報
$ /bin/prometheus --version prometheus, version 2.31.X... go version: go1.17.X platform: linux/amd64
各prometheus.io
Serviceにアノテーションがない場合でもPrometheus側の設定でサービス検出対象になっていれば自動的にPrometheus側がサービスディスカバリーとして検出します。
kubernetes-service-endpoints (X/Y active targets)
その状態でメトリクスの収集先になるServiceにてscrapeを「true」とすると
$ kubectl annotate service test-metrics prometheus.io/scrape=true service/ test-metrics annotated
対象に紐づくServiceがTargetとして認識されます。
一方で該当のPodが他のServiceにも紐づいている場合、そのServiceもTargetとして認識されてしまうので、以下でServiceが公開しているPortを明示的に指定します。
$ kubectl annotate service test-metrics prometheus.io/port=XXXX service/test-metrics annotated
そして一般的には/metricsに対してリクエストを投げることでメトリクス情報が取得できますが、同項目が別の値の場合は任意のパスをスラッシュ付きで与える必要があります。
$ kubectl annotate service test-metrics prometheus.io/path=/mymetrics
最後に、スクレイピングをhttps通信にするか否かですが、httpではなくhttpsを行う場合はschemeにて指定します。
$ kubectl annotate service test-metrics prometheus.io/scheme=https
そうするとTagetへの接続がhttpからhttpsに変更されますが、収集先が対応してなければ以下のようなエラーとなります。
Get "https://XX:XX/metrics": http: server gave HTTP response to HTTPS client
終わりに
まとめると、prometheus.io/scrapeではスクレイピングをするか否か、prometheus.io/schemeではhttpsにするか否か、prometheus.io/pathではメトリクスのパスを/metricsから上書きするか否か、prometheus.io/portでは公開しているPortに対してどのPortを指定するのかを与えます。
以上、ご参考になれば幸いです。