我有一个集成了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
度量工具 目前不支持 Class
(Controller
)水平. 以下是建议的节选。切点 (来自 度量衡-春季 集成库)。)
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
级别。
然后,你将不得不调整库源,并为它使用自定义构建 (记好库牌)或在所有的API方法上显式添加定时器度量注解。