我在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/