非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
相关产品推荐
相关产品推荐

