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

非Spring应用中使用Micrometer Observation API的可行性及Registry获取方法

在非Spring应用中使用Micrometer Observation API的实现方案

可行性说明

完全可以在非Spring应用中使用Micrometer Observation API,Micrometer核心组件(包括Observation模块)本身不依赖Spring框架,仅需引入对应的Micrometer依赖即可。

Observation全局注册表的存在性

和Metrics提供全局指标注册表类似,Observation API也提供了全局注册表:ObservationRegistry.globalRegistry()。你可以像之前管理PrometheusMeterRegistry一样,自定义ObservationRegistry实例并注册到全局,或者直接使用全局实例。

沿用类似逻辑的实现示例

1. 依赖准备

确保引入Micrometer Observation和Prometheus相关依赖(以Maven为例):

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-observation</artifactId>
    <version>最新稳定版</version>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>最新稳定版</version>
</dependency>

2. 改造监控Servlet

你可以沿用之前的Servlet逻辑,同时整合ObservationRegistry:

public class AppMonitoringServlet extends HttpServlet {
    // 初始化Prometheus指标注册表
    private final PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
    // 初始化Observation注册表并配置Handler
    private final ObservationRegistry observationRegistry = ObservationRegistry.create();

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // 将Prometheus注册表添加到全局Metrics
        Metrics.addRegistry(prometheusRegistry);
        
        // 给ObservationRegistry添加指标转换Handler(让观测生成Metrics)
        observationRegistry.observationConfig().observationHandler(new MetricsObservationHandler(prometheusRegistry.getMeterRegistry()));
        
        // 将自定义ObservationRegistry注册到全局
        ObservationRegistry.globalRegistry().configure(observationRegistry.observationConfig());
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(HttpServletResponse.SC_OK);
        String contentType = TextFormat.chooseContentType(req.getHeader("Accept"));
        resp.setContentType(contentType);

        try (Writer writer = new BufferedWriter(resp.getWriter())) {
            // 依然通过Prometheus注册表scrape指标(包含Observation生成的指标)
            writer.write(prometheusRegistry.scrape(contentType));
            writer.flush();
        }
    }
}

3. 在其他类中使用ObservationRegistry

在业务类中,你可以直接获取全局注册表来创建观测:

public class BusinessService {
    public void doBusiness() {
        // 从全局注册表获取ObservationRegistry
        ObservationRegistry registry = ObservationRegistry.globalRegistry();
        
        // 创建并启动观测
        Observation.createNotStarted("business.operation", registry)
                .tag("operation.type", "process")
                .observe(() -> {
                    // 业务逻辑
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
    }
}

关键注意事项

  • 如果不需要全局注册表,也可以通过构造函数或其他方式将自定义的ObservationRegistry实例注入到业务类中,避免依赖全局实例。
  • MetricsObservationHandler是Observation和Metrics的桥梁,只有添加这个Handler,观测数据才会被转换成Prometheus可采集的指标。如果需要其他观测输出(比如日志),可以添加对应的ObservationHandler实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:25:31