跳到主要内容

Kafka 监控与告警

4.1 监控目标

Kafka 监控要覆盖四类对象:

对象关注点
Broker存活、请求、网络、磁盘、JVM
Topic / Partition分区、Leader、ISR、Under Replicated
Producer / Consumer写入速率、消费速率、错误、延迟
Consumer GroupLag、消费状态、成员变化

生产环境最低要求:

  • Broker 存活告警。
  • Under Replicated Partitions 告警。
  • Offline Partitions 告警。
  • Consumer Lag 告警。
  • 磁盘容量告警。
  • JVM Heap / GC 告警。
  • Controller Quorum 异常告警。

4.2 监控方案

常见方案:

方案说明
JMX + Prometheus JMX Exporter采集 Kafka Broker JMX 指标
kafka-exporter采集 Consumer Group Lag、Topic、Partition 指标
Burrow专注 Consumer Lag 监控
Grafana展示 Kafka 指标面板
Alertmanager告警通知

建议组合:

Kafka Broker -> JMX Exporter -> Prometheus -> Grafana / Alertmanager
kafka-exporter -> Prometheus -> Grafana / Alertmanager
Node Exporter -> Prometheus -> 主机磁盘/CPU/网络监控

4.3 JMX Exporter 接入

下载 JMX Exporter:

mkdir -p /opt/jmx-exporter
cd /opt/jmx-exporter
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.1.0/jmx_prometheus_javaagent-1.1.0.jar

配置文件:

/opt/jmx-exporter/kafka.yml
lowercaseOutputName: true
rules:
- pattern: kafka.server<type=(.+), name=(.+)PerSec\w*><>Count
name: kafka_server_$1_$2_total
type: COUNTER

- pattern: kafka.server<type=(.+), name=(.+)><>Value
name: kafka_server_$1_$2
type: GAUGE

- pattern: kafka.controller<type=(.+), name=(.+)><>Value
name: kafka_controller_$1_$2
type: GAUGE

- pattern: kafka.network<type=(.+), name=(.+)><>Value
name: kafka_network_$1_$2
type: GAUGE

- pattern: java.lang<type=Memory><HeapMemoryUsage>used
name: jvm_memory_heap_used_bytes
type: GAUGE

- pattern: java.lang<type=Memory><HeapMemoryUsage>max
name: jvm_memory_heap_max_bytes
type: GAUGE

Kafka 启动参数:

export KAFKA_OPTS="$KAFKA_OPTS -javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent-1.1.0.jar=9404:/opt/jmx-exporter/kafka.yml"

systemd 示例:

Environment="KAFKA_OPTS=-javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent-1.1.0.jar=9404:/opt/jmx-exporter/kafka.yml"

验证:

curl http://localhost:9404/metrics | head

4.4 kafka-exporter

kafka-exporter 常用于采集 Topic、Partition、Consumer Group Lag。

Docker 示例:

docker run -d \
--name kafka-exporter \
--restart unless-stopped \
-p 9308:9308 \
danielqsj/kafka-exporter \
--kafka.server=10.0.0.11:9092 \
--kafka.server=10.0.0.12:9092 \
--kafka.server=10.0.0.13:9092

验证:

curl http://localhost:9308/metrics | head

常见指标:

指标说明
kafka_consumergroup_lagConsumer Group Lag
kafka_topic_partitionsTopic 分区数
kafka_topic_partition_current_offset分区最新 offset
kafka_consumergroup_current_offset消费组当前 offset
kafka_brokersBroker 数量

4.5 Prometheus 配置

prometheus.yml
scrape_configs:
- job_name: kafka-broker-jmx
static_configs:
- targets:
- 10.0.0.11:9404
- 10.0.0.12:9404
- 10.0.0.13:9404

- job_name: kafka-exporter
static_configs:
- targets:
- 10.0.0.20:9308

- job_name: node-exporter
static_configs:
- targets:
- 10.0.0.11:9100
- 10.0.0.12:9100
- 10.0.0.13:9100

4.6 核心指标

4.6.1 Broker 存活

关注:

  • Broker 进程是否存活。
  • Broker 数量是否符合预期。
  • Controller 是否正常。

命令检查:

kafka-broker-api-versions.sh --bootstrap-server "$BOOTSTRAP"
kafka-metadata-quorum.sh --bootstrap-server "$BOOTSTRAP" describe --status

4.6.2 Under Replicated Partitions

含义:

  • 有分区副本不在 ISR 中。
  • 通常表示 Broker 故障、磁盘慢、网络慢或复制跟不上。

命令:

kafka-topics.sh --bootstrap-server "$BOOTSTRAP" \
--describe --under-replicated-partitions

告警建议:

UnderReplicatedPartitions > 0 持续 5 分钟

4.6.3 Offline Partitions

含义:

  • 分区没有可用 Leader。
  • 业务读写会受影响,属于高优先级故障。

命令:

kafka-topics.sh --bootstrap-server "$BOOTSTRAP" \
--describe --unavailable-partitions

告警建议:

OfflinePartitionsCount > 0 立即告警

4.6.4 Consumer Lag

Lag 表示消费者落后生产者的消息数量。

命令:

kafka-consumer-groups.sh --bootstrap-server "$BOOTSTRAP" \
--describe --group "$GROUP"

告警建议:

  • 按业务 Topic 设置不同阈值。
  • 只看绝对 Lag 不够,还要看 Lag 是否持续增长。
  • 对离线任务和实时任务设置不同阈值。

4.6.5 磁盘

Kafka 强依赖磁盘容量和 IO。

检查:

df -h
du -sh /data/kafka/*
iostat -x 1

告警建议:

  • 磁盘使用率 > 80% 预警。
  • 磁盘使用率 > 90% 严重告警。
  • IO await 持续偏高需要排查。

4.6.6 JVM 与 GC

关注:

  • Heap 使用率。
  • Full GC 次数和耗时。
  • 进程是否 OOM。
  • Page Cache 是否被挤压。

建议:

  • Kafka 不应把所有内存都给 JVM Heap。
  • 需要给 OS Page Cache 留足内存。
  • 常见 Heap 配置为 4G-8G,具体按规模评估。

4.7 告警规则示例

Prometheus 规则示例:

kafka-alerts.yml
groups:
- name: kafka
rules:
- alert: KafkaBrokerDown
expr: up{job="kafka-broker-jmx"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Kafka broker exporter is down"

- alert: KafkaConsumerLagHigh
expr: kafka_consumergroup_lag > 100000
for: 10m
labels:
severity: warning
annotations:
summary: "Kafka consumer lag is high"

- alert: KafkaDiskUsageHigh
expr: (1 - node_filesystem_avail_bytes{mountpoint="/data"} / node_filesystem_size_bytes{mountpoint="/data"}) > 0.85
for: 5m
labels:
severity: warning
annotations:
summary: "Kafka data disk usage is high"

说明:

  • 指标名会受 Exporter 配置影响,实际规则需要以 Prometheus 中的指标为准。
  • Consumer Lag 阈值必须按业务设置,不建议全局一个阈值。

4.8 Grafana 面板

建议面板:

  • Broker 存活状态。
  • Broker 请求速率。
  • Bytes In / Bytes Out。
  • Messages In。
  • Under Replicated Partitions。
  • Offline Partitions。
  • Consumer Group Lag TopN。
  • Topic 流量 TopN。
  • JVM Heap / GC。
  • 磁盘容量和 IO。
  • 网络流量。

使用建议:

  • 大屏关注集群级健康。
  • 运维面板保留 Broker、Topic、Consumer Group 下钻。
  • 业务团队面板只暴露自身 Topic 和 Consumer Group。

4.9 常见问题

4.9.1 JMX Exporter 没有指标

排查:

ps aux | grep jmx_prometheus_javaagent
curl http://localhost:9404/metrics
journalctl -u kafka -n 200 --no-pager

常见原因:

  • KAFKA_OPTS 没有生效。
  • jar 路径错误。
  • 配置文件路径错误。
  • 端口被占用。

4.9.2 Consumer Lag 一直增长

排查方向:

  • 消费者是否存活。
  • 消费者并发是否小于分区数。
  • 消费逻辑是否变慢。
  • 下游数据库或接口是否变慢。
  • 是否出现大量重试。

4.9.3 Under Replicated Partitions 告警

排查方向:

  • Broker 是否离线。
  • Broker 磁盘 IO 是否异常。
  • 网络是否抖动。
  • 分区迁移是否正在执行。
  • follower 是否复制跟不上。

4.9.4 磁盘增长过快

排查:

  • Topic 保留策略是否过长。
  • 是否有异常流量。
  • 是否创建了过多副本。
  • 是否存在大消息。
  • 是否有 Topic 未设置合理保留策略。

4.10 参考资料