ContainerResponseContext неверный код состояния - PullRequest
0 голосов
/ 02 июля 2019

Я развернул WS на Wildlfy Server 8.1.0.Final, и у меня возникла следующая проблема.

Я использую prometheus для метрик и пытаюсь получить код ответа http для запросов с ContainerResponseFilter.Проблема в том, что я получаю неправильный код состояния для некоторых запросов.

Например, мой WS использует конечную точку / ping для проверки работоспособности, и он отвечает с 201 вместо 200. Это происходит, когда есть много других запросов, которые отвечают с 201.

Возможно, что ContainerResponseFilterне может обрабатывать очень большое количество запросов в секунду и смешивает коды ответов.

 @Provider
public class CountAndLatencyMetrics implements ContainerResponseFilter, ContainerRequestFilter {

 @Context
ResourceInfo resourceInfo;

@Context
SecurityContext securityContext;

private static final Counter httpRequestsTotal = Counter
        .build("http_requests_total", "Total number of HTTP requests")
        .labelNames("request", "user", "responseCode")
        .register();

private static final Histogram httpRequestsLatency = Histogram
        .build("http_requests_latency", "Total latency of HTTP requests")
        .labelNames("request", "user")
        .register();

private Histogram.Timer timer;
private String userName;
private String javaMethodName;
private String endpointName;
private String request;
private int responseCode;

@Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
    timer.observeDuration();
    responseCode = responseContext.getStatus();
    httpRequestsTotal.labels(request, userName, String.valueOf(responseCode)).inc();

}

@Override
public void filter(ContainerRequestContext requestContext) {
    userName = securityContext.getUserPrincipal().getName();
    javaMethodName = resourceInfo.getResourceMethod().getName();
    endpointName = resourceInfo.getResourceMethod().getAnnotation(Path.class).value();
    request = javaMethodName + " - " + endpointName;
    timer = httpRequestsLatency.labels(request, userName).startTimer();

}
}
...