JMX Exporter+Prometheus采集Kafka集群指标失败,配置问题排查
问题分析与解决方案
核心问题排查
你的配置存在几个关键错误,导致JMX Exporter无法连接并采集Kafka的JMX指标:
1. JMX Exporter配置文件中的hostPort指向错误
你最初的config.yml中hostPort: jmx-kafka:5556完全错误——这个参数是用来指定要采集的目标JMX服务地址,也就是Kafka的JMX端口,而非JMX Exporter自身的端口。
正确配置应指向Kafka容器的JMX端口:
hostPort: kafka:9991 lowercaseOutputName: true rules: - pattern: 'kafka\.(.*)' name: 'kafka_$1'
2. JMX Exporter容器的环境变量路径错误
你在docker-compose.yaml中给jmx-kafka容器设置的CONFIG_YML: "./config.yml"是相对路径,但容器内部工作目录未必匹配该路径,应直接使用挂载后的绝对路径:
environment: CONFIG_YML: "/config.yml"
3. Kafka的JMX远程访问未正确配置
Bitnami Kafka默认JMX配置可能限制本地访问,需确保允许远程连接:
- 编辑
kafka-jmx.properties,添加以下内容:
com.sun.management.jmxremote=true com.sun.management.jmxremote.authenticate=false com.sun.management.jmxremote.ssl=false com.sun.management.jmxremote.port=9991 com.sun.management.jmxremote.rmi.port=9991 java.rmi.server.hostname=kafka
- 在
docker-compose.yaml的Kafka环境变量中添加JMX参数:
environment: # 保留原有配置,新增以下内容 KAFKA_JMX_OPTS: "-Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote.port=9991 -Dcom.sun.management.jmxremote.rmi.port=9991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka"
4. 指标规则配置的占位符错误
你修改后的config.yml中value: 'ValueToCollect'是无效占位符,JMX Exporter无法识别。应移除该字段,或使用正则捕获组映射指标值,简化后的规则可直接匹配Kafka JMX指标并转换为Prometheus格式。
修正后的完整配置示例
docker-compose.yaml
version: "3" services: prometheus: image: "prom/prometheus:latest" ports: - "9090:9090" volumes: - ./prometheus.yml:/prometheus.yml command: "--config.file=/prometheus.yml" container_name: prometheus jmx-kafka: image: "sscaling/jmx-prometheus-exporter" ports: - "5556:5556" environment: CONFIG_YML: "/config.yml" volumes: - ./config.yml:/config.yml container_name: jmx_kafka depends_on: - kafka zookeeper: image: 'bitnami/zookeeper:latest' ports: - '2181:2181' environment: - ALLOW_ANONYMOUS_LOGIN=yes kafka: image: bitnami/kafka:latest container_name: "kafka" ports: - '9092:9092' environment: KAFKA_BROKER_ID: 1 KAFKA_LISTENERS: PLAINTEXT://:9092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://127.0.0.1:9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 ALLOW_PLAINTEXT_LISTENER: yes KAFKA_JMX_PORT: 9991 KAFKA_JMX_OPTS: "-Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote.port=9991 -Dcom.sun.management.jmxremote.rmi.port=9991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=kafka" depends_on: - zookeeper volumes: - ./kafka-jmx.properties:/opt/bitnami/kafka/conf/kafka-jmx.properties
config.yml
hostPort: kafka:9991 lowercaseOutputName: true rules: - pattern: 'kafka\.(.*)' name: 'kafka_$1' - pattern: 'java.lang.*' name: 'jvm_$1'
prometheus.yml
global: scrape_interval: 30s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'jmx-kafka' static_configs: - targets: ['jmx-kafka:5556']
验证步骤
- 重启所有容器:
docker-compose down && docker-compose up -d - 访问JMX Exporter指标端点:
http://localhost:5556/metrics,检查是否存在Kafka相关指标 - 访问Prometheus UI(
http://localhost:9090),在Graph页面查询kafka_开头的指标,确认数据已采集
内容的提问来源于stack exchange,提问作者Allen Hui
相关产品推荐
相关产品推荐

