You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非Spring Boot应用配置Micrometer将Spring Kafka JMX指标导入InfluxDB

问题描述

我使用以下Spring Integration Kafka配置,通过JConsole可以看到生产者服务器的大量JMX指标:

<int-kafka:outbound-channel-adapter kafka-template="kafkaTemplate" id="kafkaOutboundChannelAdapter" 
    topic="learning-topic" channel="KafkaAdapterChan" 
    send-failure-channel="FailureChan">
</int-kafka:outbound-channel-adapter>

<bean id="kafkaTemplate" class="org.springframework.kafka.core.KafkaTemplate">
    <constructor-arg>
        <bean class="org.springframework.kafka.core.DefaultKafkaProducerFactory">
            <constructor-arg>
                <map>
                    <entry key="bootstrap.servers" value="xyz:9092" />
                    ... <!-- more producer properties -->
                </map>
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean> 

在Spring Boot环境下,这些指标默认会自动接入InfluxDB的Micrometer注册表,但当前非Spring Boot环境下默认未启用。我已尝试创建以下Influx相关Bean:

<bean id="customInfluxConfigs" class="CustomImplemtation">
    <!-- all the properties -->
</bean>

<bean id="influxRegistry" class="io.micrometer.influx.InfluxRegistry">
    <constructor-arg name="config" ref="customInfluxConfigs"/>
    <constructor-arg name="clock" ref="micrometerClock"/>
</bean>

但这样并未成功上报现有的默认JMX指标,同时我也尝试了以下代码:

private DefaultKafkaProducerFactory defaultProducerFactory;
private InfluxMeterRegistry influxMeterRegistry;

@Override
public void start(){
    defaultProducerFactory.createProducer();
    defaultProducerFactory.addListener(new MicrometerProducerListener(influxMeterRegistry));
}

现在需要实现通过Micrometer将JMX指标上报到InfluxDB,以便在Grafana中使用,寻求帮助。


解决方案

1. 补全核心依赖

确保项目中包含以下依赖(根据构建工具调整,以Maven为例):

<!-- Spring Kafka -->
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
    <version>你的对应版本</version>
</dependency>
<!-- Micrometer核心 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-core</artifactId>
    <version>1.12.x</version>
</dependency>
<!-- InfluxDB适配 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-influx</artifactId>
    <version>1.12.x</version>
</dependency>
<!-- JMX指标抓取 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-jmx</artifactId>
    <version>1.12.x</version>
</dependency>

2. 手动配置JMX指标转发到InfluxDB

非Spring Boot环境下,需要手动注册JMX指标抓取器,并将指标同步到InfluxRegistry:

import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.binder.jmx.JmxMeterRegistry;
import io.micrometer.influx.InfluxConfig;
import io.micrometer.influx.InfluxMeterRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MonitoringConfig {

    @Bean
    public InfluxConfig influxConfig() {
        return new InfluxConfig() {
            @Override
            public String get(String key) {
                // 按需返回Influx配置项,例如:
                if (key.equals("influx.url")) return "http://你的Influx地址:8086";
                if (key.equals("influx.username")) return "admin";
                if (key.equals("influx.password")) return "password";
                return null;
            }

            @Override
            public String db() {
                return "kafka_monitor"; // 指定存储指标的数据库名
            }
        };
    }

    @Bean
    public MeterRegistry influxMeterRegistry(InfluxConfig config, Clock clock) {
        return new InfluxMeterRegistry(config, clock);
    }

    @Bean
    public JmxMeterRegistry jmxMeterRegistry(MeterRegistry influxRegistry, Clock clock) {
        JmxMeterRegistry jmxRegistry = new JmxMeterRegistry(JmxConfig.DEFAULT, clock);
        // 将JMX抓取的指标转发到InfluxDB注册表
        influxRegistry.config().meterFilter(jmxRegistry.getMeterFilter());
        jmxRegistry.start();
        return jmxRegistry;
    }
}

3. 修复Kafka生产者指标绑定

你之前的代码顺序有误,需要先添加监听器,再创建生产者,否则已生成的生产者实例不会绑定指标监听:

@Override
public void start(){
    // 先绑定监听器
    defaultProducerFactory.addListener(new MicrometerProducerListener<>(influxMeterRegistry));
    // 再创建生产者
    defaultProducerFactory.createProducer();
}

4. 验证指标上报

  • 启动应用后,登录InfluxDB查看是否生成kafka.producer、jmx.*开头的measurement
  • 若指标未上报,开启Micrometer debug日志排查:
    <logger name="io.micrometer" level="DEBUG"/>
    

内容的提问来源于stack exchange,提问作者Teja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:05:08