🧐

Prometheus で探索対象の ServiceMonitor を広げる

2022/12/05に公開

Kubernetes クラスタで Prometheus を導入し,ServiceMonitor を作って監視対象を定義したところ,一向に Target として追加されないことがありました。

ServiceMonitor が作られているだけでは不十分で,Prometheus の探索する対象に入っている必要があります。それがどこで定義されているかを調べました。

以下のような ServiceMonitor を考えます。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: example-service-monitor
  namespace: prometheus
  labels:
    app: prometheus
spec:
  # 省略

ServiceMonitor のある Namespace

まず探索対象の ServiceMonitor が存在する Namespace を指定します。

定義箇所

Prometheus リソースspec.serviceMonitorNamespaceSelector です。
LabelSelector 形式で定義するので,matchExpressionsmatchLabelsが使えます。

デフォルトでは Prometheus リソースが存在する Namespace のみ探索します。

Namespace 名の列挙による指定

Namespace 名の列挙で指定する場合,各 Namespace の kubernetes.io/metadata.name というラベルに名称が入っているので,これを利用して完全一致で列挙します。

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
spec:
  serviceMonitorNamespaceSelector:
    matchExpressions:
      - key: kubernetes.io/metadata.name
        operator: In
        values:   
          - monitoring
          - prometheus
          - default

kube-prometheus-stack の場合

kube-prometheus-stack で Prometheus を立ち上げている場合, prometheus.prometheusSpec.serviceMonitorNamespaceSelector という変数で指定できます。上記の例では matchExpressions 以下を値にします。

https://github.com/prometheus-community/helm-charts/blob/cfb8a0f5f0d08b10f67ad75704051c279168948e/charts/kube-prometheus-stack/templates/prometheus/prometheus.yaml#L147-L152

ServiceMonitor のラベル

次に ServiceMonitor に付けられたラベルで絞り込みます。

定義箇所

Prometheus リソース の spec.serviceMonitorSelector です。
Namespace と同様に LabelSelector 形式で定義します。

デフォルトではすべての ServiceMonitor が選択されます。

ServiceMonitor に付けられたラベルによる絞り込み

例えば app: prometheus というラベルが付いた ServiceMonitor を絞り込みたい場合は,matchLabels を使って以下のように記述します。

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
spec:
  serviceMonitorSelector:
    matchLabels:
      app: prometheus

kube-prometheus-stack の場合

kube-prometheus-stack で Prometheus を立ち上げている場合, prometheus.prometheusSpec.serviceMonitorSelector という変数で指定できます。上記の例では matchLabels 以下を値にします。

https://github.com/prometheus-community/helm-charts/blob/cfb8a0f5f0d08b10f67ad75704051c279168948e/charts/kube-prometheus-stack/templates/prometheus/prometheus.yaml#L137-L146

prometheus.prometheusSpec.seviceMonitorSelector が空で,prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValuestrue であれば,Helm の release を元にしたラベルが適用されます。

文中のリンク以外に参考にしたページ

https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md

https://github.com/prometheus-operator/prometheus-operator/issues/1331

Discussion