Prometheus 监控 Kafka 全栈实战从吞吐量到消费者延迟的实时可观测性Apache Kafka 是现代数据管道的核心枢纽它的Broker 吞吐量、网络请求延迟、分区副本状态、ISR 收缩以及最重要的消费者 Lag直接决定数据流的可靠性与实时性。Prometheus 通过JMX Exporter与kafka_exporter双剑合璧可将 Kafka 的所有 JVM、Broker 指标及消费者组偏移信息转化为标准化时序数据。本文将带你从零配置 JMX 代理与专用导出器构建覆盖生产者、Broker 到消费者的全链路监控。1. 方案选型JMX Exporter kafka_exporter 组合组件负责范围关键指标JMX Exporter随 Broker 启动Broker 运行时状态、JVM、网络、请求队列消息入站速率、分区数量、ISR 状态、请求延迟、JVM GCkafka_exporter独立进程消费者组偏移、分区 Lag、Topic/Partition 详情kafka_consumergroup_lag、kafka_topic_partitionsCruise Control 或 CMAK集群负载均衡、副本迁移不直接暴露 Prometheus 指标可配合 JMX 采集最佳实践是每个 Broker 加载 JMX Exporter并额外部署一个kafka_exporter抓取消群体偏移两个 Job 在 Prometheus 中合并展现。2. JMX Exporter 监控 Broker2.1 下载并配置 JMX 代理在每个 Broker 服务器上下载jmx_prometheus_javaagentwgethttps://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.20.0/jmx_prometheus_javaagent-0.20.0.jarsudomkdir/etc/kafka/prometheussudomvjmx_prometheus_javaagent-0.20.0.jar /etc/kafka/prometheus/编写规则文件/etc/kafka/prometheus/kafka_jmx.yml覆盖核心 Kafka MBeanstartDelaySeconds:0hostPort:127.0.0.1:9999# Kafka 默认 JMX 端口ssl:falserules:# 消息流入/流出速率-pattern:kafka.servertypeBrokerTopicMetrics, nameMessagesInPerSec(Count|OneMinuteRate)name:kafka_messages_in_per_sec_$1-pattern:kafka.servertypeBrokerTopicMetrics, nameBytesInPerSec(Count|OneMinuteRate)name:kafka_bytes_in_per_sec_$1-pattern:kafka.servertypeBrokerTopicMetrics, nameBytesOutPerSec(Count|OneMinuteRate)name:kafka_bytes_out_per_sec_$1# 分区与副本-pattern:kafka.servertypeReplicaManager, nameUnderReplicatedPartitions(Value)name:kafka_under_replicated_partitions-pattern:kafka.servertypeReplicaManager, namePartitionCount(Value)name:kafka_partition_count-pattern:kafka.servertypeReplicaManager, nameOfflineReplicaCount(Value)name:kafka_offline_replica_count-pattern:kafka.servertypeReplicaManager, nameIsrShrinksPerSec(Count)name:kafka_isr_shrinks_per_sec_count# 网络请求-pattern:kafka.networktypeRequestMetrics, nameRequestsPerSec, request(.*)(Count)name:kafka_requests_per_sec_$1-pattern:kafka.networktypeRequestMetrics, nameTotalTimeMs, request(.*)(Count|Mean)name:kafka_request_total_time_ms_$2labels:request:$1# 磁盘与日志-pattern:kafka.logtypeLogFlushStats, nameLogFlushRateAndTimeMs(Count|Mean)name:kafka_log_flush_rate_and_time_ms_$1# JVM 内存与 GC-pattern:java.langtypeMemoryHeapMemoryUsage(used|max)name:jvm_memory_heap_$1-pattern:java.langtypeGarbageCollector, name(.)(CollectionCount|CollectionTime)name:jvm_gc_$1_$22.2 启用 JMX 并加载代理修改 Kafka 的bin/kafka-server-start.sh或systemd环境变量设置 JMX 端口并添加 Java agentexportKAFKA_JMX_OPTS-Dcom.sun.management.jmxremote.port9999 -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalseexportKAFKA_OPTS$KAFKA_OPTS-javaagent:/etc/kafka/prometheus/jmx_prometheus_javaagent-0.20.0.jar9097:/etc/kafka/prometheus/kafka_jmx.yml监听端口9097提供 Prometheus 指标。重启 Broker验证curl http://localhost:9097/metrics。3. 部署 kafka_exporter 监控消费延迟danielqsj/kafka_exporter连接 Kafka 集群并读取__consumer_offsets生成消费者组 Lag 指标。Docker 运行dockerrun-d\--namekafka_exporter\-p9308:9308\danielqsj/kafka-exporter:v1.7.0\--kafka.serverkafka1:9092\--kafka.serverkafka2:9092\--kafka.version2.8.0二进制wgethttps://github.com/danielqsj/kafka_exporter/releases/download/v1.7.0/kafka_exporter-1.7.0.linux-amd64.tar.gztarxzf kafka_exporter-1.7.0.linux-amd64.tar.gz ./kafka_exporter--kafka.serverlocalhost:9092 --web.listen-address:9308访问http://localhost:9308/metrics得到kafka_consumergroup_lag等指标。4. 配置 Prometheus 抓取scrape_configs:-job_name:kafka-brokersscrape_interval:30sstatic_configs:-targets:-broker1:9097-broker2:9097-broker3:9097labels:cluster:kafka-prod-job_name:kafka-consumersscrape_interval:60sstatic_configs:-targets:[kafka-exporter:9308]labels:cluster:kafka-prod5. 核心监控指标与 PromQL维度关键指标 (来源)含义PromQL 示例Broker 存活up{jobkafka-brokers}1 可达直接告警消息吞吐kafka_bytes_in_per_sec_OneMinuteRate(JMX)入站字节速率rate(kafka_bytes_in_per_sec_Count[1m])分区状态kafka_under_replicated_partitions(JMX)副本不足的分区数 0 立即告警离线分区kafka_offline_replica_count(JMX)离线副本数 0 即严重活跃控制器kafka_controller_active_count(JMX 某些版本)控制器数量应为 1请求延迟kafka_request_total_time_ms_Mean{requestProduce}(JMX)请求平均耗时 100ms 需关注消费者 Lagkafka_consumergroup_lag(kafka_exporter)消费者滞后消息数kafka_consumergroup_lag 10000Lag 总和sum(kafka_consumergroup_lag) by (consumergroup)按消费者组聚合趋势告警JVM 堆内存jvm_memory_heap_used / jvm_memory_heap_max堆使用率 80% 告警GC 时间rate(jvm_gc_G1_Young_Generation_CollectionTime[5m])GC 耗时速率高则 JVM 压力大常用计算生产吞吐量 (MB/s)rate(kafka_bytes_in_per_sec_Count[1m]) / 1024 / 1024消费延迟条kafka_consumergroup_lag6. Grafana 仪表盘推荐Kafka Broker ExporterDashboard ID7589经典全面基于 JMX Exporter 指标展示 Broker 吞吐、请求、分区、JVM。Kafka Consumer LagID7628基于 kafka_exporter显示消费者组 Lag 详情。Kafka Overview (Kubernetes)若在 K8s 运行可导入 ID13296。导入后选择数据源并将cluster变量绑定到你的 Kafka 集群。7. 告警规则实战groups:-name:kafka_alertsrules:-alert:KafkaBrokerDownexpr:up{jobkafka-brokers} 0for:1mlabels:severity:criticalannotations:summary:Kafka Broker {{ $labels.instance }} 下线-alert:KafkaUnderReplicatedPartitionsexpr:kafka_under_replicated_partitions0for:5mlabels:severity:criticalannotations:summary:存在未充分复制的分区总数{{ $value }}-alert:KafkaOfflineReplicaexpr:kafka_offline_replica_count0for:1mlabels:severity:criticalannotations:summary:Kafka 离线副本数大于 0可能丢失数据-alert:KafkaHighConsumerLagexpr:kafka_consumergroup_lag10000for:10mlabels:severity:warningannotations:summary:消费者组 {{ $labels.consumergroup }} Lag 超过 10000-alert:KafkaHighProduceLatencyexpr:kafka_request_total_time_ms_Mean{requestProduce}100for:5mlabels:severity:warningannotations:summary:生产请求平均延迟超过 100ms-alert:KafkaJvmHeapUsageexpr:(jvm_memory_heap_used / jvm_memory_heap_max)0.85for:10mlabels:severity:warningannotations:summary:Broker {{ $labels.instance }} 堆内存使用率超过 85%8. 进阶安全认证与多集群8.1 SASL/SSL 认证若 Kafka 启用了 SASL_SSLJMX 连接不受影响本地 JMX但kafka_exporter需要提供安全参数kafka_exporter\--kafka.serverbroker:9093\--tls.enabled\--tls.ca-file/path/ca-cert\--sasl.enabled\--sasl.mechanismscram-sha256\--sasl.usernameprometheus\--sasl.passwordpasswordJMX Exporter 的 YAML 中可以配置username和password若 JMX 远程认证开启但通常 JMX 仅本地访问。8.2 Kafka 多集群在每个集群部署独立的kafka_exporter并在 Prometheus 中使用不同的cluster标签区分。对于 Broker JMX也可分组抓取。8.3 使用 Prometheus Operator (Kubernetes)若 Kafka 通过 Strimzi 或 Confluent Operator 部署它们已内置 Prometheus 指标暴露Strimzi 直接暴露metrics端口只需创建PodMonitor即可。9. 性能与安全建议JMX Exporter 随 Broker 启动内存开销极小 50MB。kafka_exporter会扫描所有消费者组偏移在大型集群 1000 个分区中建议将scrape_interval设为 60s 或更久且使用--kafka.consumer-groups-regex过滤不必要的组。防火墙仅允许 Prometheus 访问 9097 和 9308 端口。至此你的 Kafka 集群从 Broker 的 JVM 健康、网络吞吐、到消费者的积压情况全部纳入了 Prometheus 的统一监控体系。任何副本丢失、分区离线或消费延迟都将在第一时间触发告警让数据管道真正实现端到端的可观测性为实时分析、事件驱动的业务提供坚实底座。