Prometheus exporters как HelmRelease: Kafka, MongoDB, Redis, RabbitMQ

Published: 2026-02-21

kube-prometheus-stack из коробки даёт метрики узлов, kubelet и Kubernetes API. Для метрик уровня приложений — consumer lag в Kafka, hit ratio в Redis, частоты операций в MongoDB — нужны отдельные экспортёры. Вот как мы разворачиваем и подключаем их через FluxCD по единому паттерну.


Паттерн

Каждый экспортёр следует одному и тому же паттерну HelmRelease:

  1. Разворачивать в том же namespace, что и рабочая нагрузка (не в observability)
  2. Включить serviceMonitor с меткой release: kube-prom-stack — по ней оператор Prometheus находит ServiceMonitor
  3. Через relabelings записать в метку job стабильное читаемое значение
  4. Задать resource requests/limits

Почему в том же namespace, что и рабочая нагрузка? Экспортёру нужен сетевой доступ к сервису, с которого он собирает метрики, а общий namespace позволяет обходиться короткими именами хостов.


kafka-exporter

yamlapiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: kafka-exporter
  namespace: kafka
spec:
  chart:
    spec:
      chart: prometheus-kafka-exporter
      version: "3.0.1"
      sourceRef:
        kind: HelmRepository
        name: prometheus-community
        namespace: flux-system
  values:
    kafkaServer:
      - kafka.kafka.svc.cluster.local:9092
    prometheus:
      serviceMonitor:
        enabled: true
        additionalLabels:
          release: kube-prom-stack
        interval: 30s
        relabelings:
          - targetLabel: job
            replacement: kafka
    resources:
      requests:
        cpu: 25m
        memory: 64Mi
      limits:
        cpu: 200m
        memory: 128Mi

Что даёт: consumer lag (по партициям и по группам), количество партиций топика, статус брокеров, недореплицированные партиции, частоту сообщений.

Ключевые метрики для алертинга:

  • kafka_consumergroup_lag_sum — суммарный лаг по consumer group
  • kafka_topic_partition_under_replicated_partition — состояние репликации
  • kafka_brokers — количество видимых брокеров

mongodb-exporter

yamlapiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: mongodb-exporter
  namespace: db
spec:
  chart:
    spec:
      chart: prometheus-mongodb-exporter
      version: "3.8.0"
      sourceRef:
        kind: HelmRepository
        name: prometheus-community
        namespace: flux-system
  values:
    mongodb:
      uri: "mongodb://exporter:${MONGO_EXPORTER_PASS}@mongodb.db.svc.cluster.local:27017/admin"
    serviceMonitor:
      enabled: true
      additionalLabels:
        release: kube-prom-stack
      interval: 30s
      relabelings:
        - targetLabel: job
          replacement: mongodb
    resources:
      requests:
        cpu: 25m
        memory: 64Mi
      limits:
        cpu: 200m
        memory: 128Mi

mongodb.uri содержит учётные данные — он подставляется через ExternalSecret из Vault и никогда не хранится в Git открытым текстом.

Пользователь MongoDB для экспортёра

javascriptuse admin
db.createUser({
  user: "exporter",
  pwd: "secure-password",
  roles: [
    { role: "clusterMonitor", db: "admin" },
    { role: "read", db: "local" }
  ]
})

Что даёт: количество документов по коллекциям, лаг репликации, статистику индексов, частоту операций (insert/update/delete/query), hit ratio кэша WiredTiger, использование пула соединений.


redis-exporter

yamlapiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: redis-exporter
  namespace: db
spec:
  chart:
    spec:
      chart: prometheus-redis-exporter
      version: "6.9.0"
      sourceRef:
        kind: HelmRepository
        name: prometheus-community
        namespace: flux-system
  values:
    redisAddress: redis://redis-master.db.svc.cluster.local:6379
    auth:
      enabled: true
      secret:
        name: redis-password
        key: redis-password
    serviceMonitor:
      enabled: true
      labels:
        release: kube-prom-stack
      interval: 15s
      relabelings:
        - targetLabel: job
          replacement: redis
    resources:
      requests:
        cpu: 10m
        memory: 32Mi
      limits:
        cpu: 100m
        memory: 64Mi

interval: 15s — метрики Redis меняются быстро (hit rate, частота команд). Частый сбор даёт более точный сигнал для алертов о задержках.

Ключевые метрики:

  • redis_keyspace_hits_total / redis_keyspace_misses_total — hit ratio кэша
  • redis_memory_used_bytes против redis_memory_max_bytes — нехватка памяти
  • redis_evicted_keys_total — вытеснения ключей (признак нехватки памяти)

Recording rule для hit ratio Redis

yaml- record: job:redis_hit_ratio:5m
  expr: |
    rate(redis_keyspace_hits_total[5m])
    /
    (rate(redis_keyspace_hits_total[5m]) + rate(redis_keyspace_misses_total[5m]))

Алерт при падении hit ratio ниже 80%:

yaml- alert: RedisLowHitRatio
  expr: job:redis_hit_ratio:5m < 0.8
  for: 10m
  labels:
    severity: warning
    event: 'Redis Low Hit Ratio |{{$value | humanize}}'

rabbitmq-exporter

У RabbitMQ есть встроенный эндпоинт метрик Prometheus — отдельный экспортёр не нужен:

yamlvalues:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true
      labels:
        release: kube-prom-stack
      interval: 30s
      relabelings:
        - targetLabel: job
          replacement: rabbitmq

Ключевые метрики:

  • rabbitmq_queue_messages — сообщений в очереди (косвенный показатель consumer lag)
  • rabbitmq_queue_consumers — активные консьюмеры (0 — очередь никто не читает)
  • rabbitmq_node_mem_alarm — флаг memory alarm (1 = сработал)
  • rabbitmq_node_disk_free_alarm — флаг disk alarm

helm-exporter

Отслеживает версии и статусы Helm-релизов на кластерах:

yamlapiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: helm-exporter
  namespace: observability
spec:
  chart:
    spec:
      chart: helm-exporter
      sourceRef:
        kind: HelmRepository
        name: sstarcher
  values:
    serviceMonitor:
      create: true
      labels:
        release: kube-prom-stack

Даёт по одному gauge на каждый Helm-релиз с метками chart, version, namespace, status. Алерт на зависшие релизы:

yaml- alert: HelmReleaseFailed
  expr: helm_chart_info{status!="deployed"} > 0
  for: 15m
  labels:
    severity: warning
    event: 'Helm Release Failed |{{$labels.chart}}|{{$labels.namespace}}'

Как работает ServiceMonitor discovery

Оператор Prometheus следит за объектами ServiceMonitor, метки которых соответствуют serviceMonitorSelector в Prometheus CR:

yamlserviceMonitorSelector:
  matchLabels:
    release: kube-prom-stack

Если у ServiceMonitor нет этой метки, Prometheus не станет опрашивать таргет. Проверить:

bashkubectl get servicemonitor -A -l release=kube-prom-stack

# Убедиться, что targets видны в Prometheus
kubectl port-forward -n observability svc/kube-prom-stack-prometheus 9090:9090
# localhost:9090/targets — должны быть kafka, mongodb, redis, rabbitmq