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:
+71
-9
@@ -93,7 +93,12 @@ docker compose exec -T clickhouse clickhouse-client --user=default --password=12
|
||||
### TL;DR после `git pull`
|
||||
|
||||
```bash
|
||||
docker compose up -d prometheus grafana
|
||||
# Быстрый вариант (make)
|
||||
make reload-monitoring
|
||||
|
||||
# Или вручную:
|
||||
docker compose up -d prometheus grafana kafka-exporter
|
||||
docker compose restart prometheus
|
||||
curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/datasources/reload
|
||||
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
|
||||
@@ -127,17 +132,26 @@ curl -s http://localhost:9090/api/v1/targets | grep -o '"health":"[^"]*"'
|
||||
Если прилетели изменения в `configs/grafana/provisioning/*` или `configs/prometheus.yml`, примените их так:
|
||||
|
||||
```bash
|
||||
# Поднять/обновить сервисы мониторинга
|
||||
docker compose up -d prometheus grafana
|
||||
# Рекомендуемый способ (через make)
|
||||
make reload-monitoring
|
||||
|
||||
# Перечитать provisioning Grafana без рестарта контейнера
|
||||
# Или вручную:
|
||||
docker compose up -d prometheus grafana kafka-exporter
|
||||
docker compose restart prometheus
|
||||
curl -s -u admin:admin -X POST http://localhost:3000/api/admin/provisioning/datasources/reload
|
||||
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 -u admin:admin http://localhost:3000/api/datasources/name/Prometheus
|
||||
curl -s -u admin:admin http://localhost:3000/api/v1/provisioning/alert-rules
|
||||
Проверка результата:
|
||||
|
||||
```bash
|
||||
# Дашборды и алерты
|
||||
curl -s -u admin:admin http://localhost:3000/api/v1/provisioning/alert-rules | grep -o '"title":"[^"]*"'
|
||||
|
||||
# Kafka метрики
|
||||
curl -s http://localhost:9090/api/v1/targets | grep kafka
|
||||
curl -s http://localhost:9308/metrics | grep "^kafka_brokers"
|
||||
```
|
||||
|
||||
Если в пулле изменился `configs/prometheus_ch.xml`, дополнительно перезапустите ClickHouse:
|
||||
@@ -146,6 +160,12 @@ curl -s -u admin:admin http://localhost:3000/api/v1/provisioning/alert-rules
|
||||
docker compose restart clickhouse
|
||||
```
|
||||
|
||||
Если дашборд Kafka не загрузился (ошибка "Dashboard title cannot be empty" в логах), пересоздайте контейнер Grafana:
|
||||
|
||||
```bash
|
||||
docker compose stop grafana && docker compose rm -f grafana && docker compose up -d grafana
|
||||
```
|
||||
|
||||
### Дашборд ClickHouse Overview
|
||||
|
||||
URL: `http://localhost:3000/d/clickhouse-overview/clickhouse-overview`
|
||||
@@ -158,8 +178,34 @@ URL: `http://localhost:3000/d/clickhouse-overview/clickhouse-overview`
|
||||
|
||||
Принятое решение по метрикам: сверили naming через Context7 (`/clickhouse/clickhouse-docs`, раздел Prometheus interface) и заменили недоступные в `25.1` серии на фактически экспортируемые (`ClickHouseProfileEvents_InsertedRows`, `ClickHouseAsyncMetrics_TotalPartsOfMergeTreeTables`, `ClickHouseMetrics_Parts*`).
|
||||
|
||||
### Дашборд Kafka Overview
|
||||
|
||||
URL: `http://localhost:3000/d/kafka-overview/kafka-overview`
|
||||
|
||||
| Раздел | Метрики |
|
||||
|--------|---------|
|
||||
| Cluster Health | Brokers Up, Topics Count, Total Partitions, Consumer Groups |
|
||||
| Throughput | Messages In/sec by Topic |
|
||||
| Consumers | Consumer Lag by Group, Consumer Lag Table |
|
||||
| Partitions | Partition Offsets (Current), Oldest vs Current Offset Gap |
|
||||
|
||||
**Источник метрик:** `kafka-exporter` (danielqsj/kafka-exporter), формат конфигурации подтверждён через Context7 (`/danielqsj/kafka_exporter`, `/prometheus/docs`).
|
||||
|
||||
### Проверка метрик
|
||||
|
||||
```bash
|
||||
# Prometheus собирает метрики ClickHouse
|
||||
curl -s "http://localhost:9090/api/v1/query?query=ClickHouseAsyncMetrics_MemoryResident"
|
||||
curl -s "http://localhost:9090/api/v1/query?query=ClickHouseProfileEvents_Query"
|
||||
|
||||
# Prometheus собирает метрики Kafka
|
||||
curl -s "http://localhost:9090/api/v1/query?query=kafka_brokers"
|
||||
curl -s "http://localhost:9090/api/v1/query?query=kafka_consumer_group_lag"
|
||||
|
||||
# Прямая проверка kafka-exporter
|
||||
curl -s http://localhost:9308/metrics | grep "^kafka_"
|
||||
```
|
||||
|
||||
```bash
|
||||
# Проверить, что Prometheus собирает метрики
|
||||
curl -s "http://localhost:9090/api/v1/query?query=ClickHouseAsyncMetrics_MemoryResident"
|
||||
@@ -170,13 +216,21 @@ curl -s "http://localhost:9090/api/v1/query?query=ClickHouseProfileEvents_Query"
|
||||
|
||||
### Алерты Grafana
|
||||
|
||||
Provisioning-файл: `configs/grafana/provisioning/alerting/clickhouse-alert-rules.yml`
|
||||
**ClickHouse Alerts** — provisioning-файл: `configs/grafana/provisioning/alerting/clickhouse-alert-rules.yml`
|
||||
|
||||
Настроены правила:
|
||||
- `ClickHouse Failed Queries Rate` — `rate(ClickHouseProfileEvents_FailedQuery[5m]) > 0` в течение `2m`
|
||||
- `ClickHouse Memory Resident High` — `MemoryResident / OSMemoryTotal * 100 > 85` в течение `5m`
|
||||
- `ClickHouse Parts Active High` — `ClickHouseMetrics_PartsActive > 500` в течение `10m`
|
||||
|
||||
**Kafka Alerts** — provisioning-файл: `configs/grafana/provisioning/alerting/kafka-alert-rules.yml`
|
||||
|
||||
Настроены правила:
|
||||
- `Kafka Broker Down` — `kafka_brokers < 1` в течение `1m`
|
||||
- `Kafka Consumer Lag High` — `kafka_consumer_group_lag > 10000` в течение `5m`
|
||||
- `Kafka No Messages Produced` — `rate(kafka_topic_partition_current_offset[5m]) < 0.1` в течение `10m`
|
||||
- `Kafka Consumer Group Missing` — пропала консьюмер-группа в течение `5m`
|
||||
|
||||
Проверка и reload без рестарта контейнера:
|
||||
|
||||
```bash
|
||||
@@ -189,10 +243,18 @@ curl -s -X POST -u admin:admin http://localhost:3000/api/admin/provisioning/aler
|
||||
|
||||
### Troubleshooting мониторинга
|
||||
|
||||
**Общие проблемы:**
|
||||
- **"No data" в Grafana**: проверить, что Prometheus видит target (`Status -> Targets` в UI)
|
||||
- **Метрики не обновляются**: ClickHouse экспортирует метрики на `0.0.0.0:9126` внутри сети Docker
|
||||
- **Dashboard не загрузился**: проверить логи Grafana — provisioning работает при первом старте контейнера
|
||||
|
||||
**ClickHouse:**
|
||||
- **Метрики не обновляются**: ClickHouse экспортирует метрики на `0.0.0.0:9126` внутри сети Docker
|
||||
|
||||
**Kafka:**
|
||||
- **`connection refused` к Kafka**: проверить, что kafka-exporter использует `kafka:29092` (внутренняя сеть), не `localhost:9092`
|
||||
- **Метрики Kafka не появляются**: проверить, что kafka-exporter подключился к Kafka — `docker compose logs kafka-exporter`
|
||||
- **Нет консьюмер-групп**: kafka-exporter показывает lag только при наличии активных консьюмеров с закоммиченными offset
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- `etl_pipeline` падает с ошибкой схемы: сначала запустить `ddl_init`.
|
||||
|
||||
Reference in New Issue
Block a user