我在link之后有一个与Dropwizard Metrics集成的Spring Boot应用程序。

当我将@Timed批注添加到某些API(控制器方法)时,它会显示在指标链接上。

例如,对于RestController以下:

@RestController
public class TestController {
    @GET
    @Path("/ping")
    @Timed
    @ApiOperation("Ping server")
    public Response Ping() {
        return Response.ok().build();
    }
}


那么结果如下:

"timers": {
    "com.test.testcontroller.Ping": {
        "count": 0,
        "max": 0.0,
        "mean": 0.0,
        "min": 0.0,
        "p50": 0.0,
        "p75": 0.0,
        "p95": 0.0,
        "p98": 0.0,
        "p99": 0.0,
        "p999": 0.0,
        "stddev": 0.0,
        "m15_rate": 0.0,
        "m1_rate": 0.0,
        "m5_rate": 0.0,
        "mean_rate": 0.0,
        "duration_units": "seconds",
        "rate_units": "calls/second"
    }
}


我大约有20个控制器,总共有130个API(方法),因此我想配置一个宽注释或自动注入@Timed注释。就像是:

@RestController
@Timed
public class TestController {
    @GET
    @Path("/ping")
    @ApiOperation("Ping server")
    // timed will auto applied in here
    public Response Ping() {
        return Response.ok().build();
    }
}


我该如何实现?

最佳答案

@Timed度量工具is not supported at Class (Controller) level。这里提供了建议切入点的摘录(来自metrics-spring集成库):

class TimedMethodInterceptor extends AbstractMetricMethodInterceptor<Timed, Timer> implements Ordered {

    public static final Class<Timed> ANNOTATION = Timed.class;
    public static final Pointcut POINTCUT = new AnnotationMatchingPointcut(null, ANNOTATION);
    public static final MethodFilter METHOD_FILTER = new AnnotationFilter(ANNOTATION, PROXYABLE_METHODS);

    public TimedMethodInterceptor(final MetricRegistry metricRegistry, final Class<?> targetClass) {
        super(metricRegistry, targetClass, ANNOTATION, METHOD_FILTER);
    }
//...
}


从上面的摘录中可以看到,@Timed注释仅在method级别匹配。

然后,您将不得不调整库源并为其使用自定义版本(take good note of the library licence),或者在所有API方法上显式添加计时器度量标准注释。

关于java - 如何在Spring Boot应用程序的所有API方法中自动添加Dropwizard指标@Timed?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62021381/

10-10 03:17