Я развернул 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();
}
}