Prerequisites:
- module-2/03-incremental-snapshots
JMX Метрики Debezium: Интерпретация и мониторинг
Вы настроили Debezium коннектор, данные потекли в Kafka. Но как понять, что pipeline работает правильно? Как обнаружить отставание до того, как оно станет критическим? Метрики — это ваши глаза в production CDC.
В этом уроке мы изучим язык observability Debezium — какие метрики существуют, что они означают, и как использовать их для диагностики проблем.
Почему метрики критически важны для CDC
CDC pipeline — это real-time система. В отличие от batch jobs, где можно дождаться результата, CDC требует непрерывного мониторинга:
- Lag (отставание) — насколько потребители отстают от источника
- Staleness (устаревание) — когда последний раз приходили события
- Throughput (пропускная способность) — сколько событий обрабатывается
Production истина: Если вы не мониторите CDC — вы не знаете, работает ли он. Проблема может накапливаться часами, прежде чем станет заметной downstream.
Архитектура JMX метрик
Debezium экспортирует метрики через JMX (Java Management Extensions). JMX — стандартный механизм мониторинга Java-приложений.
Поток метрик от Debezium до визуализации
Поток метрик:
- Debezium регистрирует метрики как JMX MBeans
- JMX Exporter (Java agent) конвертирует JMX → Prometheus формат
- Prometheus скрапит HTTP endpoint
:9404 - Grafana визуализирует и алертит
В нашем lab-окружении эта архитектура уже развернута:
- connect:9404 — JMX Exporter endpoint
- localhost:9090 — Prometheus UI
- localhost:3000 — Grafana dashboards
Категории JMX метрик
Debezium организует метрики по контекстам (contexts), отражающим стадии работы коннектора.
1. Streaming Metrics (debezium.streaming)
Основные метрики во время нормальной работы — чтение WAL и публикация событий.
| Метрика | Описание | Единица | Значимость |
|---|---|---|---|
| MilliSecondsBehindSource | Отставание от источника | ms | PRIMARY alert metric |
| MilliSecondsSinceLastEvent | Время с последнего события | ms | Staleness indicator |
| QueueTotalCapacity | Размер внутренней очереди | events | Capacity baseline |
| QueueRemainingCapacity | Свободное место в очереди | events | Backpressure indicator |
| TotalNumberOfEventsSeen | Всего обработано событий | count | Throughput tracking |
| NumberOfCommittedTransactions | Зафиксированных транзакций | count | Transaction rate |
| Connected | Соединение с БД | boolean | Health check |
2. Snapshot Metrics (debezium.snapshot)
Метрики во время initial или incremental snapshot.
| Метрика | Описание | Единица |
|---|---|---|
| RowsScanned | Обработано строк | count |
| TotalTableCount | Всего таблиц для snapshot | count |
| RemainingTableCount | Осталось таблиц | count |
| SnapshotCompleted | Snapshot завершен | boolean |
| SnapshotDurationInSeconds | Длительность snapshot | seconds |
3. Kafka Connect Worker Metrics
Метрики уровня Kafka Connect (не специфичные для Debezium).
| Метрика | Описание |
|---|---|
| source-record-poll-rate | Скорость чтения записей |
| source-record-write-rate | Скорость записи в Kafka |
| task-batch-size-avg | Средний размер батча |
Три ключевые метрики для CDC
Из всех метрик есть три, которые критически важны для понимания здоровья pipeline.
1. MilliSecondsBehindSource — Primary Lag Metric
Что измеряет: Разница между временем создания события в БД и временем его обработки Debezium.
MilliSecondsBehindSource = current_time - event_timestamp_in_db
Расчет отставания от источника
Интерпретация:
- 0-500ms — нормально (processing overhead)
- 500ms-5s — следить, возможна нагрузка
- >5s — warning, расследовать причину
- >30s — critical, SLO breach
Важно: MilliSecondsBehindSource НИКОГДА не равен нулю. Всегда есть задержка на обработку. Если видите 0 — метрика не обновляется.
PromQL запрос:
debezium_metrics_MilliSecondsBehindSource{connector="inventory-connector"}
2. MilliSecondsSinceLastEvent — Staleness Detector
Что измеряет: Время с момента получения последнего события.
Зачем нужна: MilliSecondsBehindSource обновляется только при получении событий. Если событий нет — метрика “замирает”.
Интерпретация:
- До 30s — нормально
- 30s-5min — возможно нет активности в БД (OK) или проблема (проверить)
- Более 5min — расследовать: heartbeat настроен?
PromQL запрос:
debezium_metrics_MilliSecondsSinceLastEvent{connector="inventory-connector"}
3. QueueRemainingCapacity — Backpressure Indicator
Что измеряет: Свободное место во внутренней очереди между WAL reader и Kafka writer.
Почему важно: Если Kafka недоступен или медленный, очередь заполняется. Когда очередь полна — Debezium перестает читать WAL.
Queue utilization % = 100 * (1 - QueueRemainingCapacity / QueueTotalCapacity)
Интерпретация:
- Utilization до 50% — нормально
- Utilization 50-80% — нагрузка высокая
- Utilization 80-95% — warning, Kafka медленный
- Utilization более 95% — critical, backpressure
PromQL запрос:
100 * (1 - (
debezium_metrics_QueueRemainingCapacity{connector="inventory-connector"} /
debezium_metrics_QueueTotalCapacity{connector="inventory-connector"}
))
Проверка знанийПочему MilliSecondsBehindSource никогда не равен нулю, даже когда CDC pipeline работает идеально?
Framework интерпретации метрик
Когда возникает проблема — используйте этот decision tree.
Framework диагностики проблем CDC pipeline
Сценарий 1: “Коннектор отстает” (Lag growing)
Симптомы:
- MilliSecondsBehindSource растет со временем
- TotalNumberOfEventsSeen увеличивается (события обрабатываются)
Диагностика:
-
Проверить Queue utilization:
100 * (1 - debezium_metrics_QueueRemainingCapacity / debezium_metrics_QueueTotalCapacity) -
Если Queue >80% — проблема в Kafka:
- Producer latency высокий?
- Broker throttling?
- Network между Connect и Kafka?
-
Если Queue нормальный — проблема в WAL processing:
- Большие транзакции (много строк)?
- LOB колонки (BYTEA, TEXT)?
- Сложные transforms?
Сценарий 2: “Коннектор застрял” (Stale connector)
Симптомы:
- MilliSecondsSinceLastEvent > 30 секунд
- MilliSecondsBehindSource не меняется
Диагностика:
-
Проверить Connected:
debezium_metrics_Connected{connector="inventory-connector"} -
Если Connected = false — соединение потеряно:
- PostgreSQL доступен?
- Credentials валидны?
- Replication slot существует?
-
Если Connected = true — возможно:
- Нет новых транзакций в БД (нормально)
- Heartbeat не настроен (slot не продвигается)
- Slot wal_status = ‘lost’ (WAL удален)
Сценарий 3: “Backpressure к Kafka” (Queue saturation)
Симптомы:
- QueueRemainingCapacity близок к 0
- MilliSecondsBehindSource резко растет
- Kafka producer errors в логах
Диагностика:
-
Проверить Kafka broker:
- Достаточно ли места на диске?
- ISR (In-Sync Replicas) полный?
- Throttling активен?
-
Проверить network:
- Latency между Connect и Kafka?
- Packet loss?
-
Решение:
- Увеличить
max.batch.size(default 2048) - Увеличить
max.queue.size(default 8192) - Оптимизировать Kafka producer settings
- Увеличить
Таблица рекомендуемых порогов алертов
| Метрика | Warning | Critical | Duration |
|---|---|---|---|
| MilliSecondsBehindSource | >5,000 ms | >30,000 ms | 2-5 min |
| MilliSecondsSinceLastEvent | >60,000 ms | >300,000 ms | 5 min |
| Queue utilization | >80% | >95% | 5 min |
| Connected | - | = 0 | 1 min |
Примечание: Эти пороги — отправная точка. Настраивайте под ваш SLO. Для финансовых систем порог lag может быть 1 секунда, для аналитики — 5 минут.
Проверка знанийМониторинг показывает QueueRemainingCapacity = 100 из 8192, а MilliSecondsBehindSource растет. В какой части pipeline находится bottleneck — в чтении WAL или в записи в Kafka?
Особенности метрик в Debezium 2.5.4
Наша lab-среда использует Debezium 2.5.4 (project standard). Важные ограничения:
Отсутствуют per-table метрики. Метрики агрегированы на уровне коннектора. Вы не можете увидеть lag отдельно для таблицы orders vs customers.
Per-table метрики появились в Debezium 3.0+:
debezium_metrics_TotalNumberOfCreateEventsSeen{table="orders"}debezium_metrics_TotalNumberOfUpdateEventsSeen{table="orders"}
Для Debezium 2.x, если нужна per-table granularity — используйте отдельные коннекторы для разных наборов таблиц.
Lab: Просмотр метрик через JMX Exporter
Давайте посмотрим реальные метрики в вашей lab-среде.
Шаг 1: Убедитесь, что lab запущен
cd labs
docker-compose up -d
Шаг 2: Проверьте JMX endpoint напрямую
# Получить все доступные метрики
curl http://localhost:9404/metrics | grep debezium
# Пример вывода:
# debezium_metrics_MilliSecondsBehindSource{context="streaming",plugin="postgres",server="inventory",...} 150.0
# debezium_metrics_QueueRemainingCapacity{...} 8190.0
# debezium_metrics_TotalNumberOfEventsSeen{...} 42.0
Шаг 3: Откройте Prometheus UI
- Перейдите на http://localhost:9090
- В поле Expression введите:
debezium_metrics_MilliSecondsBehindSource - Нажмите Execute
- Переключитесь на вкладку Graph для визуализации
Шаг 4: Исследуйте другие метрики
Попробуйте запросы:
# Все метрики Debezium
{__name__=~"debezium_metrics_.*"}
# События в секунду (rate)
rate(debezium_metrics_TotalNumberOfEventsSeen[5m])
# Utilization очереди
100 * (1 - debezium_metrics_QueueRemainingCapacity / debezium_metrics_QueueTotalCapacity)
Важные нюансы метрик
MilliSecondsBehindSource никогда не равен нулю
Даже при идеальной работе есть processing delay. Типичные значения:
- 50-200ms — отличный результат
- 200-500ms — нормально для нагруженных систем
Метрики обновляются только при событиях
Если в БД нет транзакций — метрики “замирают”. Используйте MilliSecondsSinceLastEvent для обнаружения staleness.
Heartbeat продвигает метрики
Настройка heartbeat.interval.ms генерирует synthetic events, которые:
- Продвигают replication slot (предотвращают WAL bloat)
- Обновляют метрики (не даем им устареть)
{
"heartbeat.interval.ms": "10000",
"heartbeat.action.query": "SELECT pg_logical_emit_message(false, 'heartbeat', now()::varchar)"
}
Queue metrics при отсутствии активности
Когда нет событий:
QueueRemainingCapacity = QueueTotalCapacity(очередь пуста)Queue utilization = 0%
Это нормально — система idle.
Что дальше?
Теперь вы понимаете, что означают JMX метрики Debezium. Следующий шаг — научиться собирать эти метрики в Prometheus и писать PromQL запросы для alerting.
В следующем уроке мы настроим JMX Exporter, изучим конфигурацию Prometheus scraping и напишем production-ready PromQL queries.
Ключевые выводы
- MilliSecondsBehindSource — PRIMARY metric для lag мониторинга
- MilliSecondsSinceLastEvent — детектор “застрявшего” коннектора
- QueueRemainingCapacity — индикатор backpressure к Kafka
- Connected — базовый health check соединения с БД
- Метрики обновляются только при получении событий — используйте heartbeat
- Debezium 2.5.4 не имеет per-table метрик (появились в 3.0+)
- Нормальный lag 50-500ms, alert при sustained >5s
- Алерты с duration (not instantaneous) предотвращают ложные срабатывания
Check Your Understanding
Finished the lesson?
Mark it as complete to track your progress