简单 public 和私有(服务)方法上的 Micrometer @Timed 注释

Micrometer @Timed annotation on simple public and private (service) methods

我正在尝试使用千分尺 @Timed 注释来应用 Prometheus 指标。 我发现它们只适用于控制器端点,而不适用于“简单”public 和私有方法。

给出这个例子:

@RestController
public class TestController {

    @GetMapping("/test")
    @Timed("test-endpoint") //does create prometheus metrics
    public String test() {
        privateMethod();
        publicMethod();
        return "test";
    }

    @Timed("test-private") //does NOT create prometheus metrics
    private void privateMethod() {System.out.println("private stuff");}

    @Timed("test-public") //does NOT create prometheus metrics
    public void publicMethod() {System.out.println("public stuff");}
}

创建以下指标:

...
# HELP test_endpoint_seconds  
# TYPE test_endpoint_seconds summary
test_endpoint_seconds_count{class="com.example.micrometerannotationexample.TestController",exception="none",method="test",} 1.0
test_endpoint_seconds_sum{class="com.example.micrometerannotationexample.TestController",exception="none",method="test",} 0.0076286
# HELP test_endpoint_seconds_max  
# TYPE test_endpoint_seconds_max gauge
test_endpoint_seconds_max{class="com.example.micrometerannotationexample.TestController",exception="none",method="test",} 0.0076286
...

未找到 @Timed("test-private")@Timed("test-public") 的指标,这是为什么?


注意:我在 this github thread 上读到 Spring Boot 无法识别任意方法上的 @Timed 注释,您需要手动配置一个 TimedAspect Bean 以便它工作。我已经试过了,但仍然没有结果。

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

要在本地尝试此操作,请参阅必要的要点 here

@Timed 仅适用于另一个 class.

调用的 public 方法

Spring 像@timed / @transactional 这样的引导注释需要所谓的代理,它只发生在 public 方法调用之间。

这个解释很好