@Timed и @Metered не работают для методов для Dropwizard с metrics-jersey2 и сгенерированными интерфейсами API. - PullRequest
2 голосов
/ 31 марта 2020

У меня есть проект Dropwizard, у которого есть ресурсы на основе сгенерированных Java интерфейсов. Ресурс выглядит следующим образом:

@Path("/foo")
public class FooResource implements FooApi {

    @Override  // This method overrides the one from FooApi interface
    public Response fooGet() {
      ...
    }
}

FooApi - это интерфейс, который был сгенерирован из контракта OpenAPI:

@Path("/foo")
@Api(description = "Will list foos.")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2077-10-23T19:04:20.922+03:00[Europe/Kiev]")
public interface FooApi {

    @GET
    @Produces({ "application/json" })
    @ApiOperation(value = "Will list foos.", notes = "Will list foos.", tags={ "Foo" })
    @ApiResponses(value = { 
        @ApiResponse(code = 200, message = "OK", response = Foo.class, responseContainer = "List") })
    Response fooGet();
}

Так что теперь я пытаюсь интегрировать этот ресурс с метриками Джерси с помощью аннотированных методов с @Timed или @Metered, например

@Timed
@Override  // This method overrides the one from FooApi interface
public Response fooGet() {
  ...
}

Но в этом случае НИКАКИЕ метрики не будут получены.

Я также попытался аннотировать класс:

@Timed
@Path("/foo")
public class FooResource implements FooApi {

И на этот раз я вижу, что метрики были созданы, но они слишком обобщенные c для меня.

Я подозреваю, что проблема связана с InstrumentedResourceMethodApplicationListener и тем, как он извлекает аннотированные методы, но, может быть, есть более простое решение, а не переопределять этот слушатель?

...