Как автоматически добавить метрики Dropwizard @Timed во все методы API в приложении весенней загрузки? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть приложение Spring Boot, интегрированное с Dropwizard Metrics по этой ссылке .

Когда я добавил аннотацию @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();
    }
}

Как я могу этого добиться?

1 Ответ

0 голосов
/ 26 мая 2020

@Timed метри c инструментарий не поддерживается на уровне Class (Controller) . Вот выдержка из рекомендованного pointcut (из библиотеки интеграции 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.

Затем вам нужно будет либо адаптировать исходные коды библиотеки и использовать для нее собственную сборку ( примите к сведению лицензию библиотеки ) или добавить аннотация таймера metri c явно для всех ваших методов API.

...