从零到一:Kafka-UI与Prometheus指标联动实战指南
引言:为什么需要Kafka监控集成?
你是否还在为Kafka集群的监控头疼?当消息积压、broker宕机或消费者滞后时,是否需要在多个工具间切换才能定位问题?本文将带你实现Kafka-UI与Prometheus的无缝集成,构建统一的监控可视化平台,让你通过一个界面掌握集群健康状态、性能瓶颈和实时数据流。
读完本文你将学会:
- 使用JMX Exporter暴露Kafka指标
- 配置Prometheus抓取Kafka监控数据
- 实现Kafka-UI与Prometheus的指标联动
- 定制关键指标仪表盘与告警规则
- 排查常见集成问题的实战技巧
架构解析:Kafka监控数据流向
数据流向说明:
- Kafka Broker通过JMX暴露原生指标
- JMX Exporter将JMX指标转换为Prometheus格式
- Prometheus定期抓取Exporter暴露的指标数据
- Kafka-UI从Prometheus查询并可视化指标
- 异常指标触发AlertManager发送告警通知
准备工作:环境与工具版本要求
| 组件 | 最低版本 | 推荐版本 | 作用 |
|---|---|---|---|
| Apache Kafka | 2.8.0 | 3.4.0+ | 消息队列核心组件 |
| Kafka-UI | 0.4.0 | 0.7.1+ | Kafka可视化管理界面 |
| Prometheus | 2.30.0 | 2.45.0+ | 时序数据监控系统 |
| JMX Exporter | 0.16.0 | 0.17.2+ | JMX指标转换工具 |
| Docker | 20.10.0 | 24.0.0+ | 容器化部署环境 |
| Docker Compose | 2.0.0 | 2.21.0+ | 多容器编排工具 |
兼容性提示:Kafka-UI 0.6.0+才原生支持Prometheus指标类型,低于此版本需要通过自定义配置实现
步骤一:部署JMX Exporter收集Kafka指标
1.1 配置JMX Exporter
创建jmx-exporter目录并添加以下两个文件:
kafka-broker.yml(指标收集规则):
lowercaseOutputName: true
rules:
# 通用JVM指标
- pattern: 'java.lang<type=Memory>(HeapMemoryUsage|NonHeapMemoryUsage)=(used|committed|max)'
name: jvm_memory_usage_$2_bytes
labels:
memory_type: $1
# Kafka Broker指标
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=(BytesInPerSec|BytesOutPerSec|MessagesInPerSec), topic=(.+)>(Count|Rate|OneMinuteRate)'
name: kafka_broker_topic_$1_$3
labels:
topic: "$2"
# 分区副本指标
- pattern: 'kafka.cluster<type=Partition, name=(UnderReplicatedPartitions|UnderMinIsrPartitions)>(Value)'
name: kafka_cluster_partition_$1
kafka-prepare-and-run(启动脚本):
#!/bin/bash
sed -i 's/#ssl.client.auth=required/ssl.client.auth=required/g' /etc/kafka/server.properties
exec /etc/confluent/docker/run
1.2 配置Docker Compose
创建docker-compose.yml文件,集成Kafka、JMX Exporter和Kafka-UI:
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.2.1
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:7.2.1
depends_on:
- zookeeper
ports:
- "9092:9092"
- "11001:11001" # JMX Exporter端口
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
# JMX Exporter配置
KAFKA_OPTS: "-javaagent:/usr/share/jmx_exporter/jmx_prometheus_javaagent.jar=11001:/usr/share/jmx_exporter/kafka-broker.yml"
volumes:
- ./jmx-exporter:/usr/share/jmx_exporter/
kafka-ui:
image: provectuslabs/kafka-ui:latest
ports:
- "8080:8080"
depends_on:
- kafka
environment:
KAFKA_CLUSTERS_0_NAME: "prod-cluster"
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: "kafka:29092"
KAFKA_CLUSTERS_0_METRICS_PORT: 11001
KAFKA_CLUSTERS_0_METRICS_TYPE: "PROMETHEUS"
KAFKA_CLUSTERS_0_METRICS_PATH: "/metrics"
1.3 启动基础服务
# 创建并启动容器
docker-compose up -d
# 检查服务状态
docker-compose ps
# 查看JMX Exporter是否正常工作
curl http://localhost:11001/metrics | grep "kafka_broker"
验证要点:
- 所有容器状态应为
Up - 访问
http://localhost:11001/metrics应返回Prometheus格式指标 - 指标中应包含
kafka_broker_topic_bytes_in_per_sec_count等Kafka相关指标
步骤二:配置Prometheus抓取Kafka指标
2.1 创建Prometheus配置文件
创建prometheus/prometheus.yml:
global:
scrape_interval: 15s # 抓取间隔
evaluation_interval: 15s # 规则评估间隔
rule_files:
- "alert.rules.yml" # 告警规则文件
alerting:
alertmanagers:
- static_configs:
- targets:
- "alertmanager:9093" # AlertManager地址
scrape_configs:
- job_name: 'kafka'
static_configs:
- targets: ['kafka:11001'] # JMX Exporter地址
labels:
service: 'kafka-broker'
cluster: 'prod-cluster'
- job_name: 'kafka-ui'
static_configs:
- targets: ['kafka-ui:8080']
labels:
service: 'kafka-management'
2.2 添加告警规则
创建prometheus/alert.rules.yml:
groups:
- name: kafka_alerts
rules:
- alert: HighUnderReplicatedPartitions
expr: kafka_cluster_partition_under_replicated_partitions_value > 0
for: 5m
labels:
severity: critical
annotations:
summary: "Kafka分区副本不足"
description: "集群{{ $labels.cluster }}存在{{ $value }}个未充分复制的分区"
runbook_url: "https://kafka-ui.provectus.io/troubleshooting/underreplicated-partitions"
- alert: HighConsumerLag
expr: sum(kafka_consumer_group_lag_sum) by (group, topic) > 10000
for: 10m
labels:
severity: warning
annotations:
summary: "消费者组滞后严重"
description: "消费者组{{ $labels.group }}在主题{{ $labels.topic }}上滞后{{ $value }}条消息"
2.3 扩展Docker Compose配置
在原有docker-compose.yml中添加Prometheus服务:
prometheus:
image: prom/prometheus:v2.45.0
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus
- prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--web.enable-lifecycle' # 支持热加载配置
alertmanager:
image: prom/alertmanager:v0.25.0
ports:
- "9093:9093"
volumes:
- ./alertmanager:/etc/alertmanager
command:
- '--config.file=/etc/alertmanager/config.yml'
volumes:
prometheus-data:
2.4 启动监控服务并验证
# 启动新增服务
docker-compose up -d
# 热加载Prometheus配置(修改配置后使用)
curl -X POST http://localhost:9090/-/reload
访问http://localhost:9090,在Prometheus UI中:
- 进入"Status" → "Targets"
- 确认
kafka和kafka-uijob的状态为UP - 在"Graph"页面查询
kafka_broker_topic_messages_in_per_sec_count验证数据
步骤三:实现Kafka-UI与Prometheus联动
3.1 配置Kafka-UI连接Prometheus
修改Kafka-UI的环境变量(在docker-compose.yml中):
environment:
# 原有配置...
KAFKA_CLUSTERS_0_PROMETHEUS_URL: "http://prometheus:9090"
KAFKA_CLUSTERS_0_ALERTMANAGER_URL: "http://alertmanager:9093"
3.2 关键指标可视化配置
Kafka-UI支持通过Prometheus查询语言(PQL)自定义指标面板,以下是常用指标配置示例:
1. 吞吐量监控面板
| 指标名称 | PQL查询 | 图表类型 | 单位 | 阈值警告 |
|---|---|---|---|---|
| 消息入站速率 | sum(rate(kafka_broker_topic_messages_in_per_sec_count[5m])) by (topic) | 折线图 | msg/s | >1000 |
| 字节入站速率 | sum(rate(kafka_broker_topic_bytes_in_per_sec_count[5m])) by (topic) | 面积图 | B/s | >1MB/s |
| 消息出站速率 | sum(rate(kafka_broker_topic_messages_out_per_sec_count[5m])) by (topic) | 折线图 | msg/s | >800 |
| 字节出站速率 | sum(rate(kafka_broker_topic_bytes_out_per_sec_count[5m])) by (topic) | 面积图 | B/s | >800KB/s |
2. 消费者监控面板
3. Broker健康状态面板
# 主题分区不平衡告警
- alert: PartitionImbalance
expr: max(kafka_log_partition_count{partition!~"[0-9]+"} offset by (topic)) - min(kafka_log_partition_count{partition!~"[0-9]+"} offset by (topic)) > 1
for: 10m
labels:
severity: warning
annotations:
summary: "主题分区不平衡"
description: "主题{{ $labels.topic }}分区分布不平衡,最大{{ $value }}个分区"
3.3 在Kafka-UI中查看Prometheus指标
- 访问Kafka-UI:
http://localhost:8080 - 导航至"Metrics"标签页
- 选择"Prometheus"数据源
- 使用下拉菜单选择预设指标或输入自定义PQL查询
常用PQL查询示例:
# 按主题分组的消息吞吐量
sum(rate(kafka_broker_topic_messages_in_per_sec_count[5m])) by (topic)
# 消费者组滞后总量
sum(kafka_consumer_group_lag_sum) by (group)
# 分区ISR不足数量
sum(kafka_cluster_partition_under_min_isr_partitions_value)
# broker磁盘使用率
sum(kafka_log_dir_log_dir_size_bytes) by (broker, log_dir) / sum(kafka_log_dir_total_bytes) by (broker, log_dir) * 100
步骤四:高级配置与最佳实践
4.1 指标采集优化
JMX Exporter规则优化:
# 优化后的kafka-broker.yml
lowercaseOutputName: true
rules:
# 仅保留关键指标,减少暴露量
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=(BytesInPerSec|BytesOutPerSec|MessagesInPerSec), topic=(.+)>'
name: kafka_broker_topic_$1
labels:
topic: "$2"
- pattern: 'kafka.cluster<type=Partition, name=(UnderReplicatedPartitions|UnderMinIsrPartitions)>'
name: kafka_cluster_partition_$1
- pattern: 'kafka.consumer<type=ConsumerFetcherManager, name=MaxLag, clientId=(.+)>'
name: kafka_consumer_max_lag
labels:
client_id: "$1"
Prometheus抓取优化:
scrape_configs:
- job_name: 'kafka'
scrape_interval: 5s # 关键指标缩短抓取间隔
scrape_timeout: 3s
static_configs:
- targets: ['kafka:11001']
metric_relabel_configs:
# 过滤不需要的指标
- source_labels: [__name__]
regex: 'kafka_broker_.+'
action: keep
4.2 高可用部署架构
4.3 常见问题排查指南
| 问题现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| Kafka-UI无指标数据 | Prometheus URL配置错误 | 1. 检查Kafka-UI日志 2. 验证Prometheus API可达性 3. 测试PQL查询 | 修正PROMETHEUS_URL环境变量确保网络连通性 检查防火墙规则 |
| 指标数据延迟 >30s | 抓取间隔设置过大 | 1. 检查Prometheus scrape_interval2. 查看目标抓取耗时 3. 检查网络延迟 | 缩短关键指标抓取间隔 优化网络连接 增加Prometheus资源 |
| 部分指标缺失 | JMX规则配置问题 | 1. 检查JMX Exporter日志 2. 查看原始指标输出 3. 验证规则匹配 | 修改JMX Exporter规则 确保指标名称匹配 重启JMX Exporter |
| 内存占用过高 | 指标基数过大 | 1. 分析指标基数topk(10, count by (__name__)({__name__=~".+"}))2. 检查标签 cardinality 3. 审查抓取配置 | 实施指标过滤 减少不必要标签 增加Prometheus内存 |
总结与展望
通过本文的步骤,你已成功实现Kafka-UI与Prometheus的指标联动,构建了集监控、可视化和告警于一体的Kafka管理平台。关键成果包括:
- 建立了完整的监控数据采集链路(JMX → Exporter → Prometheus → Kafka-UI)
- 配置了核心Kafka指标的可视化与告警
- 掌握了性能优化和问题排查的实战技巧
未来扩展方向:
- 集成Grafana创建更复杂的指标仪表盘
- 实现指标数据的长期存储与趋势分析
- 开发自定义Kafka-UI插件扩展监控能力
- 构建基于机器学习的异常检测系统
附录:核心指标参考表
| 指标类别 | 关键指标 | 描述 | 正常范围 | 告警阈值 |
|---|---|---|---|---|
| 主题指标 | kafka_broker_topic_messages_in_per_sec_count | 主题消息入站总量 | 随负载变化 | - |
| 分区指标 | kafka_cluster_partition_under_replicated_partitions_value | 未充分复制分区数 | 0 | >0 |
| 消费者指标 | kafka_consumer_group_lag_sum | 消费者组总滞后消息数 | <100 | >500 |
| Broker指标 | kafka_server_broker_state | Broker状态(1=运行) | 1 | !=1 |
| JVM指标 | jvm_memory_heap_used_bytes | JVM堆内存使用量 | <70%最大堆 | >85%最大堆 |
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



