feat(monitoring): add Kafka monitoring via kafka-exporter
- Add kafka-exporter service to docker-compose.yml - Add kafka job to prometheus.yml scrape configs - Add Kafka Overview dashboard (Grafana provisioning) - Add Kafka alert rules (broker down, consumer lag, etc.) - Add make reload-monitoring command for easy updates - Update OPERATIONS.md with TL;DR and troubleshooting API verified via Context7: - /danielqsj/kafka_exporter for exporter config - /prometheus/docs for scrape_configs format
This commit is contained in:
@@ -0,0 +1,222 @@
|
||||
# План подключения Kafka к мониторингу
|
||||
|
||||
> Дата создания: 2026-02-08
|
||||
> Источник: Kafka via danielqsj/kafka-exporter
|
||||
> Проверка API: Context7 (`/danielqsj/kafka_exporter`, `/prometheus/docs`)
|
||||
|
||||
---
|
||||
|
||||
## 1. Обзор
|
||||
|
||||
Подключаем мониторинг Kafka через **kafka-exporter** (Prometheus exporter для Kafka). Используем официальный образ `danielqsj/kafka-exporter:latest`.
|
||||
|
||||
**Метрики, которые будем собирать:**
|
||||
- `kafka_brokers` — количество брокеров в кластере
|
||||
- `kafka_topic_partitions` — количество партиций по топикам
|
||||
- `kafka_topic_partition_current_offset` — текущий offset
|
||||
- `kafka_topic_partition_oldest_offset` — oldest offset
|
||||
- `kafka_consumer_group_lag` — лаг консьюмер-групп
|
||||
- `kafka_consumer_group_current_offset` — текущий offset консьюмеров
|
||||
|
||||
---
|
||||
|
||||
## 2. Изменения в инфраструктуре
|
||||
|
||||
### 2.1. docker-compose.yml
|
||||
|
||||
Добавить сервис `kafka-exporter`:
|
||||
|
||||
```yaml
|
||||
kafka-exporter:
|
||||
image: danielqsj/kafka-exporter:latest
|
||||
command: ["--kafka.server=kafka:29092"]
|
||||
ports:
|
||||
- "9308:9308"
|
||||
networks:
|
||||
- cs_dwh
|
||||
depends_on:
|
||||
- kafka
|
||||
```
|
||||
|
||||
**Почему `kafka:29092`:** внутри Docker-сети Kafka слушает на `PLAINTEXT://kafka:29092` (см. `KAFKA_ADVERTISED_LISTENERS` в текущем docker-compose.yml).
|
||||
|
||||
### 2.2. configs/prometheus.yml
|
||||
|
||||
Добавить job для скрейпа kafka-exporter:
|
||||
|
||||
```yaml
|
||||
scrape_configs:
|
||||
- job_name: "clickhouse"
|
||||
metrics_path: "/metrics"
|
||||
static_configs:
|
||||
- targets: ["clickhouse:9126"]
|
||||
labels:
|
||||
instance: Clickhouse-1
|
||||
honor_labels: true
|
||||
|
||||
# Новый job для Kafka
|
||||
- job_name: "kafka"
|
||||
metrics_path: "/metrics"
|
||||
static_configs:
|
||||
- targets: ["kafka-exporter:9308"]
|
||||
labels:
|
||||
instance: Kafka-1
|
||||
honor_labels: true
|
||||
```
|
||||
|
||||
**Проверка через Context7:** формат `scrape_configs` подтверждён через `/prometheus/docs` (snippet: `scrape_configs: - job_name: myapp ... static_configs: - targets:`).
|
||||
|
||||
---
|
||||
|
||||
## 3. Дашборд Grafana
|
||||
|
||||
### 3.1. Создать файл: `configs/grafana/provisioning/dashboards/kafka-overview.json`
|
||||
|
||||
Основные панели дашборда:
|
||||
|
||||
| Панель | PromQL запрос | Описание |
|
||||
|--------|--------------|----------|
|
||||
| Brokers Up | `kafka_brokers` | Количество доступных брокеров |
|
||||
| Topics Count | `count(kafka_topic_partitions) by (topic)` | Количество топиков |
|
||||
| Total Partitions | `sum(kafka_topic_partitions)` | Всего партиций |
|
||||
| Messages In/sec | `rate(kafka_topic_partition_current_offset[5m])` | Скорость записи сообщений |
|
||||
| Consumer Lag | `kafka_consumer_group_lag` | Лаг по консьюмер-группам |
|
||||
| Partition Offsets | `kafka_topic_partition_current_offset` | Текущие offsets по партициям |
|
||||
|
||||
### 3.2. Структура дашборда (JSON)
|
||||
|
||||
```json
|
||||
{
|
||||
"dashboard": {
|
||||
"id": null,
|
||||
"uid": "kafka-overview",
|
||||
"title": "Kafka Overview",
|
||||
"tags": ["kafka", "messaging"],
|
||||
"timezone": "Europe/Moscow",
|
||||
"schemaVersion": 36,
|
||||
"refresh": "10s",
|
||||
"panels": [
|
||||
// Row 1: Cluster Health
|
||||
// - Brokers Up (stat panel)
|
||||
// - Topics Count (stat panel)
|
||||
// - Total Partitions (stat panel)
|
||||
|
||||
// Row 2: Throughput
|
||||
// - Messages In/sec (graph panel)
|
||||
// - Partition Offsets (graph panel)
|
||||
|
||||
// Row 3: Consumers
|
||||
// - Consumer Lag (table panel)
|
||||
// - Consumer Offsets (graph panel)
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Алерт-правила Grafana
|
||||
|
||||
### 4.1. Создать/дополнить: `configs/grafana/provisioning/alerting/kafka-alert-rules.yml`
|
||||
|
||||
```yaml
|
||||
apiVersion: 1
|
||||
|
||||
groups:
|
||||
- orgId: 1
|
||||
name: kafka_health_group
|
||||
folder: Kafka Alerts
|
||||
interval: 1m
|
||||
rules:
|
||||
# Alert: Kafka broker down
|
||||
- uid: kafka_broker_down
|
||||
title: Kafka Broker Down
|
||||
condition: C
|
||||
data:
|
||||
- refId: A
|
||||
datasourceUid: prometheus_uid
|
||||
model:
|
||||
expr: kafka_brokers < 1
|
||||
noDataState: Alerting
|
||||
for: 1m
|
||||
annotations:
|
||||
summary: "Kafka broker недоступен"
|
||||
|
||||
# Alert: High consumer lag
|
||||
- uid: kafka_consumer_lag_high
|
||||
title: Kafka Consumer Lag High
|
||||
condition: C
|
||||
data:
|
||||
- refId: A
|
||||
datasourceUid: prometheus_uid
|
||||
model:
|
||||
expr: kafka_consumer_group_lag > 10000
|
||||
for: 5m
|
||||
annotations:
|
||||
summary: "Высокий лаг консьюмера {{ $labels.group }} для топика {{ $labels.topic }}"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Порядок внедрения
|
||||
|
||||
```bash
|
||||
# 1. Добавить сервис в docker-compose.yml
|
||||
# 2. Обновить configs/prometheus.yml
|
||||
# 3. Создать дашборд configs/grafana/provisioning/dashboards/kafka-overview.json
|
||||
# 4. Создать алерты configs/grafana/provisioning/alerting/kafka-alert-rules.yml
|
||||
# 5. Применить изменения
|
||||
|
||||
docker compose up -d kafka-exporter
|
||||
docker compose restart prometheus
|
||||
|
||||
# Перезагрузить provisioning Grafana
|
||||
curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/dashboards/reload
|
||||
curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/alerting/reload
|
||||
|
||||
# Проверка
|
||||
curl -s http://localhost:9090/api/v1/targets | grep kafka
|
||||
curl -s http://localhost:9308/metrics | head -20
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. URL после внедрения
|
||||
|
||||
| Сервис | URL |
|
||||
|--------|-----|
|
||||
| Kafka Exporter metrics | http://localhost:9308/metrics |
|
||||
| Grafana Dashboard | http://localhost:3000/d/kafka-overview/kafka-overview |
|
||||
| Prometheus Targets | http://localhost:9090/targets |
|
||||
|
||||
---
|
||||
|
||||
## 7. Проверка метрик
|
||||
|
||||
```bash
|
||||
# Проверить, что kafka-exporter отдаёт метрики
|
||||
curl -s http://localhost:9308/metrics | grep "^kafka_"
|
||||
|
||||
# Проверить, что Prometheus собирает метрики
|
||||
curl -s "http://localhost:9090/api/v1/query?query=kafka_brokers"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Troubleshooting
|
||||
|
||||
| Проблема | Решение |
|
||||
|----------|---------|
|
||||
| `connection refused` к Kafka | Проверить, что используется `kafka:29092` (внутренняя сеть), не `localhost:9092` |
|
||||
| `No data` в Grafana | Проверить Status -> Targets в Prometheus UI |
|
||||
| Алерты не загружаются | Проверить синтаксис YAML, перезагрузить provisioning |
|
||||
|
||||
---
|
||||
|
||||
## 9. Принятые решения (фиксация)
|
||||
|
||||
- **Образ kafka-exporter:** `danielqsj/kafka-exporter:latest` — стандарт de-facto, подтверждён через Context7.
|
||||
- **Порт exporter:** `9308` (стандартный).
|
||||
- **Адрес Kafka:** `kafka:29092` (внутренняя Docker-сеть, PLAINTEXT listener).
|
||||
- **Формат конфигурации Prometheus:** подтверждён через Context7 (`/prometheus/docs`).
|
||||
- **Без SASL/TLS:** для локального демо-стенда аутентификация не требуется.
|
||||
Reference in New Issue
Block a user