ServiceMonitor

ServiceMonitor

Der ServiceMonitor-Helper erstellt Prometheus ServiceMonitor-Ressourcen für automatisches Metrics-Scraping.

Übersicht

ServiceMonitors sind Custom Resources des Prometheus Operators. Sie definieren, wie Prometheus Metriken von Ihren Services scrapen soll.

Basis-Konfiguration

monitoring:
  - name: my-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s

Konfigurationsoptionen

Endpoints

monitoring:
  - name: my-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics           # Port-Name des Service
        interval: 30s           # Scrape-Intervall
        path: /metrics          # Metrics-Pfad (Standard: /metrics)
        scheme: http            # http oder https

Mehrere Endpoints

Ein Service kann mehrere Metrics-Endpoints haben:

monitoring:
  - name: my-service
    namespace: monitoring
    release: prometheus
    endpoints:
      # Haupt-Metriken
      - port: metrics
        interval: 15s
        path: /metrics

      # Slow-Queries Metriken
      - port: metrics
        interval: 60s
        path: /metrics/slow

      # Health Metriken
      - port: http
        interval: 30s
        path: /healthz

Mehrere ServiceMonitors

monitoring:
  # API Service
  - name: api
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 15s

  # Database Exporter
  - name: postgres-exporter
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s

  # Redis Exporter
  - name: redis-exporter
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s

Label-Matching

Der ServiceMonitor verwendet automatisch Labels zum Matchen:

monitoring:
  - name: my-api  # Wird zu my-api-metrics
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s

Prometheus Operator sucht nach Services mit dem Label:

app.kubernetes.io/name: my-api

Vollständiges Beispiel

Mit Chart-Modus

chart:
  enabled: true
  fullnameOverride: "my-api"

  container:
    image: myapp/api:latest
    ports:
      - name: http
        containerPort: 8080
      - name: metrics
        containerPort: 9090

  service:
    type: ClusterIP
    ports:
      - port: 80
        targetPort: http
        name: http
      - port: 9090
        targetPort: metrics
        name: metrics

  # ServiceMonitor für Prometheus
  monitoring:
    - name: my-api
      namespace: monitoring
      release: prometheus
      endpoints:
        - port: metrics
          interval: 15s
          path: /metrics
          scheme: http

Standalone Helper

# Chart.yaml
apiVersion: v2
name: monitoring-setup
version: 1.0.0

dependencies:
  - name: ohmyhelm
    alias: mon
    repository: https://gitlab.com/ayedocloudsolutions/ohmyhelm
    version: 1.18.0
# values.yaml
mon:
  monitoring:
    # Kubernetes Nodes
    - name: node-exporter
      namespace: monitoring
      release: prometheus
      endpoints:
        - port: metrics
          interval: 30s

    # Kubernetes API Server
    - name: kube-apiserver
      namespace: monitoring
      release: prometheus
      endpoints:
        - port: https
          interval: 30s
          scheme: https
          tlsConfig:
            insecureSkipVerify: true

    # etcd
    - name: etcd
      namespace: monitoring
      release: prometheus
      endpoints:
        - port: metrics
          interval: 30s

Erweiterte Konfiguration

Mit TLS

monitoring:
  - name: secure-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: https-metrics
        interval: 30s
        scheme: https
        tlsConfig:
          insecureSkipVerify: true
          # Oder mit Zertifikat:
          # caFile: /etc/prometheus/secrets/ca.crt
          # certFile: /etc/prometheus/secrets/client.crt
          # keyFile: /etc/prometheus/secrets/client.key

Mit Basic Auth

monitoring:
  - name: protected-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s
        basicAuth:
          username:
            name: metrics-auth
            key: username
          password:
            name: metrics-auth
            key: password

Mit Bearer Token

monitoring:
  - name: token-service
    namespace: monitoring
    release: prometheus
    endpoints:
      - port: metrics
        interval: 30s
        bearerTokenSecret:
          name: metrics-token
          key: token

Prometheus Operator Labels

Der ServiceMonitor muss Labels haben, die der Prometheus-Konfiguration entsprechen:

monitoring:
  - name: my-service
    namespace: monitoring
    release: prometheus  # Muss dem Prometheus-Release entsprechen

Der release Wert wird als Label gesetzt:

metadata:
  labels:
    release: prometheus

Prometheus sucht nach ServiceMonitors mit diesem Label:

serviceMonitorSelector:
  matchLabels:
    release: prometheus

Best Practices

  1. Sinnvolle Intervalle - Kurze Intervalle für kritische Metriken, längere für weniger wichtige
  2. Namespace-Trennung - ServiceMonitors im monitoring Namespace erstellen
  3. Labels konsistent halten - Verwenden Sie das korrekte release Label
  4. Resource Labels - Fügen Sie Labels für Filterung hinzu
  5. Dokumentation - Dokumentieren Sie welche Metriken verfügbar sind

Troubleshooting

ServiceMonitor prüfen

# ServiceMonitors anzeigen
kubectl get servicemonitors -n monitoring

# Details anzeigen
kubectl describe servicemonitor my-api-metrics -n monitoring

# Prometheus Targets prüfen
kubectl port-forward svc/prometheus 9090:9090 -n monitoring
# Dann: http://localhost:9090/targets

Häufige Probleme

Problem Ursache Lösung
Target nicht gefunden Label-Mismatch Service Labels prüfen
Scrape fehlgeschlagen Port/Path falsch Endpoints-Konfiguration prüfen
Keine Metriken App exposed keine Metriken Metriken-Endpoint der App prüfen

Service Labels prüfen

# Service Labels anzeigen
kubectl get svc my-api -n production -o yaml | grep -A 10 labels

# Selector des ServiceMonitors
kubectl get servicemonitor my-api-metrics -n monitoring -o yaml | grep -A 10 selector

Siehe auch