Learning Platform
Глоссарий Troubleshooting
Урок 11.01 · 30 мин
Продвинутый
JMXMetricsMBeanBroker MetricsProducer MetricsConsumer MetricsMonitoring

Таксономия JMX-метрик Kafka

Прежде чем настраивать Grafana-дашборды и писать Prometheus-правила, необходимо знать, что именно измерять. Kafka экспортирует сотни JMX-метрик. Большинство из них вы никогда не будете смотреть в боевой обстановке. Но десяток критически важных метрик должен быть перед глазами каждые 24 часа.

Этот урок — систематизированный каталог метрик по категориям: брокер, реквесты, продюсер, консьюмер, KRaft-контроллер. Для каждой метрики: точное имя MBean, нормальное значение, порог алерта, причина аномалии.


JMX в Kafka: фундамент экспорта метрик

Kafka написана на JVM и использует Java Management Extensions (JMX) — стандартный механизм инструментирования JVM-приложений. Каждая метрика представлена как MBean (Managed Bean) с уникальным именем в формате:

domain:type=TypeValue,name=MetricName[,additionalKey=additionalValue]

Примеры:

  • kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions
  • kafka.network:type=RequestMetrics,name=TotalTimeMs,request=Produce
  • kafka.producer:type=producer-metrics,client-id=my-producer,name=record-send-rate

Доступ к JMX:

# Запуск Kafka с JMX-портом
export JMX_PORT=9999
bin/kafka-server-start.sh config/server.properties

# Или через KAFKA_JMX_OPTS
export 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 брокера.

Детальный справочник критических метрик брокера:

kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions

Количество партиций, где ISR (In-Sync Replicas) меньше replication.factor. Это не то же самое, что UnderMinIsrPartitionCount. Партиция может быть under-replicated (ISR=2 при RF=3), но всё ещё принимать записи (если min.insync.replicas=2). Норма: 0. Если значение больше 0 в течение более 5 минут — это инцидент. Допустима ненулевая значение во время перезапуска брокера (rolling restart): несколько минут, пока фолловер догоняет лидера.

kafka.server:type=ReplicaManager,name=UnderMinIsrPartitionCount

Партиции, где ISR упал ниже min.insync.replicas. Для этих партиций produce с acks=all будет отклонён: NotEnoughReplicasException. Норма: строго 0. Любое значение больше 0 — немедленный алерт, бизнес под угрозой.

kafka.controller:type=KafkaController,name=ActiveControllerCount

В KRaft-кластере ровно один брокер является активным контроллером (Raft-лидером). Значение должно быть 1 на каждом брокере (каждый знает, кто контроллер). Alert при != 1.

kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent

Доля времени, когда 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.

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

kafka.network:type=RequestMetrics,name=TotalTimeMs,request=Produce

Полная задержка produce-запроса. MBean атрибуты: Mean, 50thPercentile, 95thPercentile, 99thPercentile, 999thPercentile. В production отслеживайте p99 и p999. Норма p99 при acks=all: меньше 100ms. При acks=1: меньше 20ms. Alert при p99 больше 500ms — disk bottleneck или ISR-проблема.

kafka.network:type=RequestMetrics,name=TotalTimeMs,request=FetchConsumer

Задержка ответа на fetch-запрос потребителя. Включает fetch.min.bytes waiting time (брокер ждёт накопления данных). При нормальной нагрузке и настроенных fetch.min.bytes/fetch.max.wait.ms — ожидаемо высокое значение p50 (потребитель ждёт данных). Проблемой является рост p999.

kafka.network:type=RequestMetrics,name=TotalTimeMs,request=FetchFollower

Задержка fetch-запросов от фолловеров. Если растёт — фолловеры не успевают реплицировать. Следствие: ISR сжимается, UnderReplicatedPartitions растёт.

kafka.network:type=RequestMetrics,name=RequestsPerSec,request=Produce

Количество 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Доля времени блокировки на bufferAlert при больше 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 (агрегат), можно смотреть лаг по конкретной партиции:

kafka.consumer:type=consumer-fetch-manager-metrics,
  client-id={id},topic={topic},partition={N},name=records-lag

Это позволяет обнаружить, что проблема только с одной партицией (например, 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 следующие метрики не будут эмитировать данные:

Удалённая метрикаПричина удаления
kafka.server:type=SessionExpireListener,name=*Вся ZooKeeper-интеграция удалена
kafka.controller:type=ControllerStats,name=ZooKeeperRequestLatencyMsZooKeeper-контроллер заменён KRaft
kafka.server:type=ZooKeeperClientMetrics,name=*ZooKeeper-клиент удалён из брокера
kafka.controller:type=KafkaController,name=ZkMigrationStateМиграция ZK -> KRaft завершена, нет состояния

Если ваш старый 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 между контроллерами.
RequestHandlerAvgIdlePercentДоля простоя I/O-потоков брокера.
BrokerМетрика пула I/O-потоков брокера.
больше 0.3030%+ простоя = достаточный запас мощности.
меньше 0.30 на 10+ минI/O-потоки перегружены. Решение: увеличить num.io.threads или масштабировать.
Перегрузка, мало num.io.threadsДиагностика: проверить количество запросов (RequestsPerSec) и скорость их обработки.
TotalTimeMs p99 (Produce)99-й перцентиль задержки produce-запроса.
RequestМетрика уровня сетевых запросов.
меньше 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 начнёт снижаться.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 3. Метрика kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions показывает значение 3 на протяжении 7 минут. Одновременно kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec на брокере broker-2 равен 0. Что произошло и каков первый шаг диагностики?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 6