Spring Boot 3监控(Observation、Metrics)自定义标签与上下文访问问题
Spring Boot 3 观测(Observation)自定义标签配置实践与疑问
背景
Spring Boot 3的观测(Observation)能力涉及Spring框架、Micrometer及自动配置体系,逻辑较为复杂。以添加Prometheus依赖的@RestController应用为例,无需额外观测配置,即可自动采集到http.server.requests、http.client.requests、spring.data.repository.invocations、mongodb.driver.commands/pool、tasks.scheduled.execution等多类指标。
根据官方文档,通过重写默认约定可在运行时添加自定义标签——比如创建继承DefaultServerRequestObservationConvention的@Component类,但这种方式仅对http.server和http.client请求指标生效。对于mongodb.driver、定时任务等指标,其默认约定多通过new直接实例化(例如MongoObservationCommandListener、ScheduledMethodRunnable中的实现),甚至部分指标(如mongodb.driver.commands)初期找不到可重写的默认约定。
核心问题
- 如何为
mongodb.driver、定时任务等非HTTP类指标添加自定义标签? - 能否在业务代码中注入
ObservationRegistry,直接访问对应观测上下文添加标签?在RestController方法中尝试时,获取到的是spring.security.http.secured.requests上下文而非http.server.requests。
已探索的部分指标配置方案
后续实践中,已找到部分指标的自定义标签配置方式:
- spring.data.repository.invocations指标:继承
DefaultRepositoryTagsProvider并将其注册为Spring Bean - mongodb.driver相关指标:分别继承
DefaultMongoCommandTagsProvider、DefaultMongoConnectionPoolTagsProvider并注册为Spring Bean - tasks.scheduled.execution指标:实现
GlobalObservationConvention<ScheduledTaskObservationContext>接口,再通过ObservationRegistryCustomizer手动将该约定注册到观测注册表中
新疑问
- 如何访问观测所包装的业务数据(例如Repository操作的实体对象)?目前找到的方式包括上下文映射、
HttpServletRequest属性传递、父观测映射等,但不确定这类方式的稳定性。 - 不同指标的自定义方式差异较大,背后的设计原因是什么?
内容的提问来源于stack exchange,提问作者radio
相关产品推荐
相关产品推荐

