Прежде чем настраивать Grafana-дашборды и писать Prometheus-правила, необходимо знать, что именно измерять. Kafka экспортирует сотни JMX-метрик. Большинство из них вы никогда не будете смотреть в боевой обстановке. Но десяток критически важных метрик должен быть перед глазами каждые 24 часа.
Этот урок — систематизированный каталог метрик по категориям: брокер, реквесты, продюсер, консьюмер, KRaft-контроллер. Для каждой метрики: точное имя MBean, нормальное значение, порог алерта, причина аномалии.
JMX в Kafka: фундамент экспорта метрик
Kafka написана на JVM и использует Java Management Extensions (JMX) — стандартный механизм инструментирования JVM-приложений. Каждая метрика представлена как MBean (Managed Bean) с уникальным именем в формате:
# Запуск Kafka с JMX-портомexport JMX_PORT=9999bin/kafka-server-start.sh config/server.properties# Или через KAFKA_JMX_OPTSexport KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=9999 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false"
Kafka 4.0 и KRaft: В Kafka 4.0 ZooKeeper полностью удалён. Это непосредственно влияет на метрики: все SessionExpireListener и ZooKeeper-era метрики контроллера удалены, вместо них появились новые KRaft-специфичные метрики. Если вы мигрируете мониторинг с Kafka 3.x на 4.0 — читайте раздел о запрещённых метриках в конце урока.
Broker-level метрики: мониторить всегда
Это метрики, которые должны быть на вашем главном дашборде. Отклонение любой из них от нормы — потенциальный инцидент.
Критические метрики брокера — Kafka 4.0
Каждый DataBox = одна JMX-метрика. Hover для деталей алерта.
UnderReplicatedPartitionskafka.server:type=ReplicaManager,name=UnderReplicatedPartitions. Норма: 0. Alert: больше 0 в течение более 5 минут. Причины: упавший брокер, disk I/O bottleneck, network partition. Это показатель нарушения ISR.
UnderMinIsrPartitionCountkafka.server:type=ReplicaManager,name=UnderMinIsrPartitionCount. Норма: 0. Alert: больше 0 немедленно. Значение больше 0 означает: запись с acks=all будет падать с NotEnoughReplicasException. Прямая угроза записи данных.
ActiveControllerCountkafka.controller:type=KafkaController,name=ActiveControllerCount. Норма: ровно 1. Alert: не равно 1. 0 = нет активного контроллера (кластер не работает). Больше 1 = split-brain (критично). В KRaft это Raft-лидер среди контроллеров.
RequestHandlerAvgIdlePercentkafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent. Норма: больше 0.30 (30% простоя). Alert: меньше 0.30 на протяжении более 10 минут. Означает: I/O-потоки перегружены. Решение: увеличить num.io.threads или масштабировать кластер.
MessagesInPerSeckafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec. Норма: зависит от нагрузки. Используется для трекинга throughput и обнаружения аномалий: внезапный drop до нуля = брокер перестал принимать записи.
BytesInPerSec / BytesOutPerSeckafka.server:type=BrokerTopicMetrics,name=BytesInPerSec и BytesOutPerSec. Байты в секунду. BytesOutPerSec включает исходящий трафик к потребителям И трафик репликации фолловерам. Используйте per-broker вид для выявления hot-spot брокера.
Количество партиций, где ISR (In-Sync Replicas) меньше replication.factor. Это не то же самое, что UnderMinIsrPartitionCount. Партиция может быть under-replicated (ISR=2 при RF=3), но всё ещё принимать записи (если min.insync.replicas=2). Норма: 0. Если значение больше 0 в течение более 5 минут — это инцидент. Допустима ненулевая значение во время перезапуска брокера (rolling restart): несколько минут, пока фолловер догоняет лидера.
Партиции, где ISR упал ниже min.insync.replicas. Для этих партиций produce с acks=all будет отклонён: NotEnoughReplicasException. Норма: строго 0. Любое значение больше 0 — немедленный алерт, бизнес под угрозой.
В KRaft-кластере ровно один брокер является активным контроллером (Raft-лидером). Значение должно быть 1 на каждом брокере (каждый знает, кто контроллер). Alert при != 1.
Доля времени, когда I/O-потоки брокера не заняты обработкой запросов. Значение 1.0 = все потоки простаивают (нет нагрузки). Значение 0.0 = все потоки заняты 100% времени (перегрузка). Норма: выше 0.30. При значении ниже 0.30 больше 10 минут: увеличьте num.io.threads или добавьте брокеры.
Request-level метрики: диагностика задержек
Когда latency растёт, эти метрики показывают, на каком этапе обработки запроса возникает задержка.
Pipeline обработки запроса Kafka
TotalTimeMs = сумма всех этапов. Hover каждый этап для понимания что замеряет.
Клиент
Клиентский запрос поступает на сетевой поток брокера. Начало отсчёта TotalTimeMs.
RequestQueueTimeMskafka.network:type=RequestMetrics,name=RequestQueueTimeMs,request=Produce. Время ожидания в очереди перед тем, как I/O-поток взял запрос. Если это растёт -- I/O-потоки перегружены. Диагностика: проверить RequestHandlerAvgIdlePercent.
LocalTimeMsВремя записи на диск лидером. Если растёт -- disk I/O bottleneck. Диагностика: смотреть IOPS и disk utilization на хосте брокера.
RemoteTimeMsВремя ожидания подтверждения от ISR-фолловеров (только при acks=all). Если растёт -- фолловеры отстают или есть network latency между брокерами.
ResponseQueueTimeMsВремя ожидания в очереди ответов. Если растёт -- сетевые потоки перегружены исходящим трафиком.
Ответ клиенту
Ответ отправлен клиенту. TotalTimeMs = сумма всех предыдущих этапов. Норма p99 для acks=all: меньше 100ms. Норма p99 для acks=1: меньше 20ms.
Полная задержка produce-запроса. MBean атрибуты: Mean, 50thPercentile, 95thPercentile, 99thPercentile, 999thPercentile. В production отслеживайте p99 и p999. Норма p99 при acks=all: меньше 100ms. При acks=1: меньше 20ms. Alert при p99 больше 500ms — disk bottleneck или ISR-проблема.
Задержка ответа на fetch-запрос потребителя. Включает fetch.min.bytes waiting time (брокер ждёт накопления данных). При нормальной нагрузке и настроенных fetch.min.bytes/fetch.max.wait.ms — ожидаемо высокое значение p50 (потребитель ждёт данных). Проблемой является рост p999.
Количество produce-запросов в секунду. Отличается от record-send-rate (одна запись) тем, что один запрос может содержать batch из тысяч записей. Позволяет оценить накладные расходы на запросы.
Producer-side метрики: диагностика на стороне клиента
Producer-метрики привязаны к client-id. В JMX-нотации client-id=* означает, что нужно подставить реальный client.id вашего продюсера.
Жизненный цикл записи на стороне продюсера
producer.send()
Приложение вызывает producer.send(record). Запись поступает в RecordAccumulator.
record-queue-time-avgkafka.producer:type=producer-metrics,client-id={id},name=record-queue-time-avg. Среднее время записи в буфере RecordAccumulator до отправки. При throughput-конфигурации (linger.ms=50) ожидаемо до 50ms. При latency-конфигурации (linger.ms=0) должно быть близко к 0.
batch-size-avgkafka.producer:type=producer-metrics,client-id={id},name=batch-size-avg. Средний размер отправляемого batch в байтах. Сравнивайте с batch.size конфигом. Если batch-size-avg намного меньше batch.size -- batch не заполняется, throughput не оптимален. Увеличьте linger.ms.
request-latency-avgkafka.producer:type=producer-metrics,client-id={id},name=request-latency-avg. Среднее время от отправки batch до получения ACK от брокера. Включает network latency + broker processing. При acks=all также включает ISR-ожидание.
record-send-ratekafka.producer:type=producer-metrics,client-id={id},name=record-send-rate. Количество успешно отправленных записей в секунду. Мониторьте вместе с record-error-rate: если send-rate падает, а error-rate растёт -- продюсер испытывает проблемы.
Полный список producer JMX метрик:
Метрика
Значение
Когда смотреть
record-send-rate
Записей/сек успешно отправлено
Всегда — базовый throughput
record-error-rate
Ошибок/сек
Alert при больше 0 устойчиво
request-latency-avg
Средняя задержка запроса (ms)
При жалобах на latency
batch-size-avg
Средний размер batch (байты)
При тюнинге throughput
compression-rate-avg
Отношение сжатия (0.0-1.0)
При настройке compression
record-queue-time-avg
Время записи в буфере (ms)
При тюнинге linger.ms
bufferpool-wait-ratio
Доля времени блокировки на buffer
Alert при больше 0.01
bufferpool-wait-ratio — часто упускаемая метрика. Значение больше 0.01 означает: продюсер блокируется ожидая свободного места в buffer.memory. Решение: увеличить buffer.memory или снизить нагрузку.
Consumer-side метрики: лаг как главный индикатор
Главная метрика консьюмера — лаг. Всё остальное вторично.
Метрики лага консьюмера
records-lag-max = расстояние от позиции потребителя до конца партиции (Log End Offset)
records-lag-maxkafka.consumer:type=consumer-fetch-manager-metrics,client-id={id},name=records-lag-max. КРИТИЧНО. Максимальный лаг по всем назначенным партициям. Норма: менее 100 записей при стабильной нагрузке. Alert при более 1000 (WARNING), более 10000 (CRITICAL). Растущий лаг = консьюмер не справляется.
records-consumed-ratekafka.consumer:type=consumer-fetch-manager-metrics,client-id={id},name=records-consumed-rate. Скорость потребления записей (records/sec). Сравнивайте с MessagesInPerSec брокера: если consumed-rate меньше входящей скорости -- лаг будет расти.
rebalance-latency-avgkafka.consumer:type=consumer-coordinator-metrics,client-id={id},name=rebalance-latency-avg. Средняя длительность ребалансировки группы (ms). Частые ребалансировки (rebalance-rate-per-hour больше 10) убивают throughput. Причины: crash, slow processing, max.poll.interval.ms exceeded.
fetch-latency-avgkafka.consumer:type=consumer-fetch-manager-metrics,client-id={id},name=fetch-latency-avg. Средняя задержка fetch-запроса. Включает время ожидания fetch.min.bytes. Высокое значение при fetch.min.bytes больше 0 является нормальным (брокер ждёт накопления данных).
assigned-partitionskafka.consumer:type=consumer-coordinator-metrics,client-id={id},name=assigned-partitions. Количество назначенных партиций этому консьюмеру. После ребалансировки должно стабилизироваться. Резкое изменение = ребалансировка произошла.
last-rebalance-seconds-agokafka.consumer:type=consumer-coordinator-metrics,client-id={id},name=last-rebalance-seconds-ago. Сколько секунд назад была последняя ребалансировка. Позволяет определить: ребалансировки стали частыми (значение постоянно малое).
Детализированный лаг per partition: Помимо records-lag-max (агрегат), можно смотреть лаг по конкретной партиции:
Это позволяет обнаружить, что проблема только с одной партицией (например, hot partition или проблема с конкретным брокером).
KRaft Controller метрики (Kafka 4.0 specific)
В Kafka 4.0 контроллер работает на основе Raft-протокола. Часть метрик появилась заново или изменила смысл.
KRaft Controller метрики
ActiveControllerCountkafka.controller:type=KafkaController,name=ActiveControllerCount. Ровно 1 в здоровом кластере. KRaft использует Raft-консенсус: среди нескольких контроллер-нод выбирается лидер. Именно он и является активным контроллером. 0 = кластер не работает.
EventQueueSizekafka.controller:type=KafkaController,name=EventQueueSize. Количество необработанных событий в очереди контроллера. В норме должно быть близко к 0. Высокое значение = контроллер не справляется с нагрузкой (много leader elections, partition changes).
ActiveBrokerCountkafka.controller:type=KafkaController,name=ActiveBrokerCount. Количество живых брокеров в кластере. Должно равняться ожидаемому числу брокеров. При падении брокера -- значение уменьшится, одновременно UnderReplicatedPartitions вырастет.
Дополнительные KRaft-метрики:
kafka.controller:type=KafkaController,name=OfflinePartitionsCount — партиции без лидера. Норма: 0. Если больше 0 — данные недоступны для чтения и записи.
kafka.controller:type=KafkaController,name=PreferredReplicaImbalanceCount — партиции, где текущий лидер не является предпочтительным (preferred leader). Ненулевое значение допустимо после rolling restart, но должно снижаться.
Метрики, которых больше нет в Kafka 4.0
При миграции мониторинга с Kafka 3.x на 4.0 следующие метрики не будут эмитировать данные:
Если ваш старый Prometheus/Grafana стек содержит alerts на эти метрики — они будут вечно отсутствовать (no data), что может триггерить “no data” алерты. Удалите или обновите такие алерты при переходе на Kafka 4.0.
Сводная таблица топ-15 метрик
Топ-15 метрик для production Kafka 4.0
МетрикаКраткое имя метрики для идентификации
КатегорияКто эмитирует эту метрику
НормаНормальное значение в здоровом кластере
Alert-порогПри каком значении нужен алерт
Причина аномалииЧто искать при выходе за норму
UnderReplicatedPartitionsISR меньше replication.factor. Первый признак проблем с репликацией.
BrokerМетрика уровня брокера, агрегат по всем партициям на брокере.
0Ноль означает: все партиции имеют полный ISR. Это норма.
больше 0 на 5+ минAlert если URP больше 0 устойчиво более 5 минут. Кратковременный рост (rolling restart) допустим.
Упавший брокер, disk I/O, network partitionДиагностика: смотреть BytesInPerSec per broker. Если один брокер = 0, он недоступен.
UnderMinIsrPartitionCountISR упал ниже min.insync.replicas. Запись с acks=all невозможна.
BrokerМетрика уровня брокера.
0Строго ноль.
больше 0 немедленноНемедленный критический алерт. Бизнес-критично.
Связан с URP, min.insync.replicasСледствие UnderReplicatedPartitions при acks=all и min.insync.replicas=2+
ActiveControllerCountКоличество активных KRaft-контроллеров. Ровно 1 в норме.
ControllerKRaft-контроллер метрика.
1Ровно один активный контроллер.
не равно 10 = нет лидера (кластер не работает). Больше 1 = split-brain (критично).
Сбой Raft-консенсуса, network partitionРедкое состояние. При возникновении: проверить network connectivity между контроллерами.
меньше 100ms (acks=all)При acks=1: менее 20ms. При acks=all: менее 100ms с учётом ISR-ожидания.
больше 500msКритический threshold. Продюсеры испытывают значительные задержки.
Disk bottleneck, ISR-wait, перегрузкаДиагностика: смотреть LocalTimeMs (диск) и RemoteTimeMs (ISR).
records-lag-maxМаксимальный лаг консьюмера по всем партициям.
ConsumerМетрика уровня консьюмера.
меньше 100Нормальный лаг при стабильной нагрузке.
больше 1000 / больше 10000Warning при больше 1000. Critical при больше 10000. Зависит от требований к freshness данных.
Медленная обработка, ребалансировка, нагрузкаДиагностика: смотреть records-consumed-rate vs MessagesInPerSec брокера. Если consumed-rate меньше -- нужно масштабировать.
DANGER
UnderReplicatedPartitions больше 0 в течение более 5 минут — это инцидент. Причины: (1) упавший брокер — проверьте ActiveBrokerCount и BytesInPerSec per broker (если один брокер показывает 0, он недоступен); (2) disk I/O bottleneck на одном из брокеров — фолловеры не успевают реплицировать из-за медленного диска; (3) network partition между брокерами — фолловеры не могут установить соединение с лидером. Порядок диагностики: 1) ActiveBrokerCount — упал ли брокер; 2) BytesInPerSec per broker — кто показывает 0 или аномально низкое значение; 3) ReplicationBytesInPerSec — идёт ли репликация.
TIP
JMX-метрики экспортируются через порт, который вы настраиваете (обычно 9999). Для Prometheus/Grafana используйте JMX Exporter (jmx_prometheus_javaagent.jar), который конвертирует JMX MBeans в HTTP endpoint /metrics в Prometheus-формате. Следующий урок полностью посвящён этому стеку.
Проверка знанийKnowledge check
На графике наблюдается: UnderReplicatedPartitions = 5, RequestHandlerAvgIdlePercent = 0.12, BytesInPerSec одного из трёх брокеров = 0. Что произошло? Опишите причину и первые три шага диагностики.
ОтветAnswer
Один из трёх брокеров недоступен: BytesInPerSec = 0 означает, что брокер не принимает трафик. Следствие: партиции, у которых недоступный брокер является частью ISR, стали under-replicated (URP = 5). RequestHandlerAvgIdlePercent = 0.12 объясняется перегрузкой оставшихся двух брокеров: весь трафик упавшего брокера (включая его партиции) перераспределился на них. Первые три шага: (1) Проверить ActiveBrokerCount -- если уменьшился на 1, брокер упал. (2) Проверить kafka-topics.sh --describe для under-replicated партиций: выяснить какой брокер отсутствует в ISR. (3) Восстановить упавший брокер (перезапуск процесса, проверка диска/сети) -- после восстановления фолловер начнёт репликацию, URP начнёт снижаться.
Доступ закрыт
Требуется вход
Для доступа к материалам курса необходимо войти через Telegram
Проверьте понимание
Результат: 0 из 0
Прикладной
Закончили урок?
Отметьте его как пройденный, чтобы отслеживать свой прогресс