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

