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

Spring Actuator与Micrometer能否配置多Prometheus差异化端点?

当然可以实现,借助Spring Actuator的自定义端点能力+Micrometer的指标收集能力,完全能满足你要的两个独立Prometheus端点需求,下面是具体的实现步骤和代码示例:

实现方案

1. 基础依赖配置

首先确保项目引入Spring Actuator和Micrometer Prometheus的核心依赖:

  • Maven依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
  • Gradle依赖:
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'

2. 保留原生API指标端点

默认的/actuator/prometheus端点会自动收集并暴露Spring应用的原生指标(包括JVM、Tomcat、业务接口的请求耗时/错误率等),只需在配置文件中开启并暴露该端点:
在application.yml中添加:

management:
  endpoints:
    web:
      exposure:
        include: prometheus, prometheus-thingworx # 包含默认端点和自定义端点ID
  endpoint:
    prometheus:
      enabled: true

3. 创建自定义ThingWorx指标端点

通过@Endpoint注解创建自定义Actuator端点,专门暴露从外部ThingWorx服务拉取的指标,同时通过过滤规则避免混入原生指标。

3.1 自定义端点代码

import io.micrometer.prometheus.PrometheusMeterRegistry;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.stereotype.Component;

@Component
@Endpoint(id = "prometheus-thingworx") // 对应访问路径/actuator/prometheus-thingworx
public class ThingWorxPrometheusEndpoint {

    private final PrometheusMeterRegistry prometheusRegistry;

    public ThingWorxPrometheusEndpoint(PrometheusMeterRegistry prometheusRegistry) {
        this.prometheusRegistry = prometheusRegistry;
    }

    @ReadOperation
    public String thingWorxMetrics() {
        // 仅导出名称以"thingworx."开头的自定义指标
        return prometheusRegistry.scrape(meter -> meter.getId().getName().startsWith("thingworx."));
    }
}

3.2 定期拉取外部数据并更新指标

用Spring的@Scheduled定时任务,定期调用外部ThingWorx接口获取数据,再更新Micrometer的指标(示例用Gauge保存数值型指标):

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicInteger;

@Component
public class ThingWorxMetricsCollector {

    private final AtomicInteger deviceOnlineCount = new AtomicInteger(0);
    private final AtomicInteger apiRequestCount = new AtomicInteger(0);

    public ThingWorxMetricsCollector(MeterRegistry registry) {
        // 注册自定义指标
        Gauge.builder("thingworx.device.online.count", deviceOnlineCount, AtomicInteger::get)
                .description("在线设备数量(来自ThingWorx)")
                .register(registry);

        Gauge.builder("thingworx.api.request.count", apiRequestCount, AtomicInteger::get)
                .description("ThingWorx接口请求总量(最近一次拉取周期)")
                .register(registry);
    }

    @Scheduled(fixedRate = 60000) // 每分钟拉取一次,可按需调整
    public void fetchThingWorxMetrics() {
        // 替换为实际调用ThingWorx服务的逻辑(比如用RestTemplate/WebClient)
        int onlineDevices = callThingWorxOnlineDeviceApi();
        int requestCount = callThingWorxApiRequestCountApi();

        // 更新指标值
        deviceOnlineCount.set(onlineDevices);
        apiRequestCount.set(requestCount);
    }

    // 模拟外部服务调用
    private int callThingWorxOnlineDeviceApi() {
        return 42;
    }

    private int callThingWorxApiRequestCountApi() {
        return 1234;
    }
}

4. 验证效果

启动应用后,可访问两个端点验证:

  • http://your-server:port/actuator/prometheus:返回应用原生指标(JVM、Tomcat、业务API等)
  • http://your-server:port/actuator/prometheus-thingworx:仅返回以thingworx.开头的自定义指标

注意事项

  • 自定义指标建议加专属前缀(如thingworx.),方便区分原生指标
  • 定时任务频率根据外部服务的承受能力和监控精度调整
  • 若外部服务需要认证,需在调用逻辑中添加对应的请求头或Token
  • 确保自定义端点ID已加入Actuator的暴露列表(配置文件中的include字段)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:20:22