【问题标题】:@Timed annotation does not work with request scoped beans?@Timed 注释不适用于请求范围的 bean?
【发布时间】:2019-06-04 19:48:27
【问题描述】:

我有一个具有请求范围的 bean,其中有一个用 micrometer(io.micrometer.core.annotation) @Timed 注释的方法,但它没有显示在指标中。它显示 bean 是否在默认范围内(单例)。

@RequestScope
@Component
public class MyTask {
 //some local variables here
public MyTask() {
  //some unhelpful stuff
}
    @Timed(value = "mappingTask")
    @Override
    public void map(List<MyPojo> myApps) {
      //Some process
}

}

它不应该与请求范围一起使用还是我缺少什么。

【问题讨论】:

    标签: spring-boot spring-aop prometheus spring-micrometer requestscope


    【解决方案1】:

    取自:Micrometer github issues

    原始问题/问题:

    @Timed 对任意 Spring 管理的 bean 的方法进行静默 忽略。

    这是 Micrometer 的回复:

    TimedAspect 方面现在存在于 micrometer-core 中,但不会 在 Spring Boot 2 或 micrometer-spring-legacy 中自动配置。我们可以 在 Boot 2.1 中通过 AOP 或 BPP 重新访问 @Timed 的应用程序,具体取决于 关于社区对该功能的反应。

    手动配置:

    @Configuration
    @EnableAspectJAutoProxy
    public class AutoTimingConfiguration {
       @Bean
       public TimedAspect timedAspect(MeterRegistry registry) {
          return new TimedAspect(registry);
       }
    }
    

    我不确定这是您的问题,但值得一试。

    【讨论】:

    • 我试过了,但是没有用。我认为问题在于 @Timed 注释的编织时间,以防 @RequestScope 注释 bean。正如我所说,如果 bean 具有默认范围,这一切都可以工作。(单例)
    • Aspectj 是编译时编织,而 Spring AOP 是代理 bean(运行时)编织。那么抱歉不能帮助你
    • Thomas,稍微更正一下:AspectJ 可以通过编译时编织使用,但在 Spring 内部通常通过加载时编织使用。后者也是Spring手册中记载的方式。 @dawit,您的问题仍未解决。也许您想考虑发布一个真实的MCVE,这会让其他人不仅仅是猜测。给我们一些我们可以运行和分析的东西。我很确定你会得到一个有用的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2013-01-21
    • 2011-11-11
    相关资源
    最近更新 更多