从零到一:Kafka-UI与Prometheus指标联动实战指南

从零到一:Kafka-UI与Prometheus指标联动实战指南

【免费下载链接】kafka-ui provectus/kafka-ui: Kafka-UI 是一个用于管理和监控Apache Kafka集群的开源Web UI工具,提供诸如主题管理、消费者组查看、生产者测试等功能,便于对Kafka集群进行日常运维工作。 【免费下载链接】kafka-ui 项目地址: https://gitcode.com/GitHub_Trending/ka/kafka-ui

引言:为什么需要Kafka监控集成?

你是否还在为Kafka集群的监控头疼?当消息积压、broker宕机或消费者滞后时,是否需要在多个工具间切换才能定位问题?本文将带你实现Kafka-UI与Prometheus的无缝集成,构建统一的监控可视化平台,让你通过一个界面掌握集群健康状态、性能瓶颈和实时数据流。

读完本文你将学会:

  • 使用JMX Exporter暴露Kafka指标
  • 配置Prometheus抓取Kafka监控数据
  • 实现Kafka-UI与Prometheus的指标联动
  • 定制关键指标仪表盘与告警规则
  • 排查常见集成问题的实战技巧

架构解析:Kafka监控数据流向

mermaid

数据流向说明

  1. Kafka Broker通过JMX暴露原生指标
  2. JMX Exporter将JMX指标转换为Prometheus格式
  3. Prometheus定期抓取Exporter暴露的指标数据
  4. Kafka-UI从Prometheus查询并可视化指标
  5. 异常指标触发AlertManager发送告警通知

准备工作:环境与工具版本要求

组件最低版本推荐版本作用
Apache Kafka2.8.03.4.0+消息队列核心组件
Kafka-UI0.4.00.7.1+Kafka可视化管理界面
Prometheus2.30.02.45.0+时序数据监控系统
JMX Exporter0.16.00.17.2+JMX指标转换工具
Docker20.10.024.0.0+容器化部署环境
Docker Compose2.0.02.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中:

  1. 进入"Status" → "Targets"
  2. 确认kafkakafka-ui job的状态为UP
  3. 在"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. 消费者监控面板

mermaid

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指标

  1. 访问Kafka-UI: http://localhost:8080
  2. 导航至"Metrics"标签页
  3. 选择"Prometheus"数据源
  4. 使用下拉菜单选择预设指标或输入自定义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 高可用部署架构

mermaid

4.3 常见问题排查指南

问题现象可能原因排查步骤解决方案
Kafka-UI无指标数据Prometheus URL配置错误1. 检查Kafka-UI日志
2. 验证Prometheus API可达性
3. 测试PQL查询
修正PROMETHEUS_URL环境变量
确保网络连通性
检查防火墙规则
指标数据延迟 >30s抓取间隔设置过大1. 检查Prometheus scrape_interval
2. 查看目标抓取耗时
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管理平台。关键成果包括:

  1. 建立了完整的监控数据采集链路(JMX → Exporter → Prometheus → Kafka-UI)
  2. 配置了核心Kafka指标的可视化与告警
  3. 掌握了性能优化和问题排查的实战技巧

未来扩展方向

  • 集成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_stateBroker状态(1=运行)1!=1
JVM指标jvm_memory_heap_used_bytesJVM堆内存使用量<70%最大堆>85%最大堆

【免费下载链接】kafka-ui provectus/kafka-ui: Kafka-UI 是一个用于管理和监控Apache Kafka集群的开源Web UI工具,提供诸如主题管理、消费者组查看、生产者测试等功能,便于对Kafka集群进行日常运维工作。 【免费下载链接】kafka-ui 项目地址: https://gitcode.com/GitHub_Trending/ka/kafka-ui

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值