如何设置 Spring 启动以使组件计量而不向每个 class 添加 @Timed,而是指定已使用的注释,如 @Service

How to set up Spring Boot to make component metered without adding @Timed to each class, but rather specifying already used annotations like @Service

我有一个 Spring 引导应用程序,其中充满了端点(即 @Controller)和 @Service,后面还有 @Repository。我想让它们全部将定时指标导出到 Micrometer。在某些时候,我也想禁用它们。在某些时候,我需要测量,例如,所有标记为 classes 的 @Service 方法或测量 @Repository 的时间。所以我不喜欢所有已经保留 @Service 注释的 class 插入和删除 @Timed,我必须考虑如何使用 Spring 存储库的数据接口。

我应该设置什么样的bean MeterRegistry考虑到所有@RestController标记的代码已经有@Timed注释,使这个配置易于打开和打开关掉 属性?我知道,对于传入的 http 请求 management.metrics.web.server.request.autotime.enabled=true 会使用这个技巧来获取传入的 http 请求的时间,这对我有用。

但是,如果可能的话,我可能希望将同样的内容应用于服务和存储库层。但是没有办法确定什么是真正的服务,而不是 @Service 注释。因此,由于我不喜欢在那里明确添加 @Timed,可以进行什么样的设置来使 MeterRegistry 考虑标记为 class 的 @Service 中的任何方法以及任何Spring 应用程序中的数据存储库?

没有out-of-the-box解决方案,但你可以自己实现,例如,使用Spring AOP。

您可以查看 TimedAspect 源代码,尤其是 @Around 方面的 @Timed 注释,并为 @Service@Repository 重新创建它。