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

非Spring Boot应用集成Micrometer后不使用Actuator暴露指标Rest API的方法

非Spring Boot项目暴露Micrometer指标的实现方案

核心思路

无需引入Spring Boot Actuator及其自动配置,直接复用项目中已初始化完成的MeterRegistry实例(你当前正在使用的LoggingRegistry也可直接复用),自定义Spring MVC Rest接口从Registry中拉取指标数据格式化后返回即可,原有日志输出逻辑完全不受影响。

前置依赖确认

项目需已经引入以下依赖,无需额外新增其他第三方包:

  • Spring Web MVC(用于开发Rest接口)
  • Micrometer Core(已集成则无需重复引入)

实现步骤

1. 自定义指标Rest Controller

直接注入容器中的MeterRegistry实例,编写接口读取指标:

import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/metrics")
public class MicrometerMetricsController {

    private final MeterRegistry meterRegistry;

    // 直接注入容器中已存在的MeterRegistry实例,包含你已配置的所有采集规则
    public MicrometerMetricsController(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
    }

    // 全量指标查询接口,返回JSON格式数据
    @GetMapping
    public Map<String, Object> getAllMetrics() {
        Map<String, Object> metrics = new HashMap<>();
        for (Meter meter : meterRegistry.getMeters()) {
            String meterName = meter.getId().getName();
            Map<String, String> tags = meter.getId().getTags().stream()
                    .collect(Collectors.toMap(Tag::getKey, Tag::getValue));
            Object value = meter.measure().iterator().next().getValue();
            if (tags.isEmpty()) {
                metrics.put(meterName, value);
            } else {
                metrics.put(String.format("%s_%s", meterName, tags.hashCode()), Map.of(
                        "tags", tags,
                        "value", value
                ));
            }
        }
        return metrics;
    }

    // 单指标查询接口,按指标名称过滤返回
    @GetMapping("/{meterName}")
    public Map<String, Object> getMetricByName(@PathVariable String meterName) {
        return meterRegistry.find(meterName).meters().stream()
                .collect(Collectors.toMap(
                        meter -> meter.getId().getName(),
                        meter -> Map.of(
                                "tags", meter.getId().getTags().stream()
                                        .collect(Collectors.toMap(Tag::getKey, Tag::getValue)),
                                "value", meter.measure().iterator().next().getValue()
                        )
                ));
    }
}

2. 注册Controller到Spring容器

  • 若使用XML配置Spring,在配置文件中新增Bean定义:
<bean class="替换为你实际的包路径.MicrometerMetricsController" />
  • 若使用注解配置Spring,确保Controller所在包被@ComponentScan扫描到即可。

扩展适配

如果需要输出Prometheus格式的指标,可额外引入micrometer-registry-prometheus依赖,将PrometheusMeterRegistry注册为容器Bean后,新增以下接口:

@GetMapping(value = "/prometheus", produces = "text/plain; version=0.0.4; charset=utf-8")
public String getPrometheusMetrics() {
    // 直接调用scrape方法返回符合Prometheus规范的指标文本
    return prometheusMeterRegistry.scrape();
}

该方案完全自主可控,可按需添加权限校验、指标过滤、频率限制等逻辑,不会引入Actuator自动配置带来的兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:36:10