Merge branch '2.4.x'
Closes gh-26596
This commit is contained in:
@@ -23,6 +23,8 @@ import java.util.concurrent.TimeUnit;
|
||||
import io.micrometer.core.annotation.Timed;
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
import io.micrometer.core.instrument.Tag;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.reactivestreams.Publisher;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@@ -49,6 +51,8 @@ import org.springframework.web.server.WebFilterChain;
|
||||
@Order(Ordered.HIGHEST_PRECEDENCE + 1)
|
||||
public class MetricsWebFilter implements WebFilter {
|
||||
|
||||
private static Log logger = LogFactory.getLog(MetricsWebFilter.class);
|
||||
|
||||
private final MeterRegistry registry;
|
||||
|
||||
private final WebFluxTagsProvider tagsProvider;
|
||||
@@ -98,13 +102,19 @@ public class MetricsWebFilter implements WebFilter {
|
||||
}
|
||||
|
||||
private void record(ServerWebExchange exchange, Throwable cause, long start) {
|
||||
cause = (cause != null) ? cause : exchange.getAttribute(ErrorAttributes.ERROR_ATTRIBUTE);
|
||||
Object handler = exchange.getAttribute(HandlerMapping.BEST_MATCHING_HANDLER_ATTRIBUTE);
|
||||
Set<Timed> annotations = getTimedAnnotations(handler);
|
||||
Iterable<Tag> tags = this.tagsProvider.httpRequestTags(exchange, cause);
|
||||
long duration = System.nanoTime() - start;
|
||||
AutoTimer.apply(this.autoTimer, this.metricName, annotations,
|
||||
(builder) -> builder.tags(tags).register(this.registry).record(duration, TimeUnit.NANOSECONDS));
|
||||
try {
|
||||
cause = (cause != null) ? cause : exchange.getAttribute(ErrorAttributes.ERROR_ATTRIBUTE);
|
||||
Object handler = exchange.getAttribute(HandlerMapping.BEST_MATCHING_HANDLER_ATTRIBUTE);
|
||||
Set<Timed> annotations = getTimedAnnotations(handler);
|
||||
Iterable<Tag> tags = this.tagsProvider.httpRequestTags(exchange, cause);
|
||||
long duration = System.nanoTime() - start;
|
||||
AutoTimer.apply(this.autoTimer, this.metricName, annotations,
|
||||
(builder) -> builder.tags(tags).register(this.registry).record(duration, TimeUnit.NANOSECONDS));
|
||||
}
|
||||
catch (Exception ex) {
|
||||
logger.warn("Failed to record timer metrics", ex);
|
||||
// Allow exchange to continue, unaffected by metrics problem
|
||||
}
|
||||
}
|
||||
|
||||
private Set<Timed> getTimedAnnotations(Object handler) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
* Copyright 2012-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -30,6 +30,8 @@ import io.micrometer.core.annotation.Timed;
|
||||
import io.micrometer.core.instrument.LongTaskTimer;
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
import io.micrometer.core.instrument.Tag;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.core.annotation.MergedAnnotationCollectors;
|
||||
import org.springframework.core.annotation.MergedAnnotations;
|
||||
@@ -46,6 +48,8 @@ import org.springframework.web.servlet.HandlerInterceptor;
|
||||
*/
|
||||
public class LongTaskTimingHandlerInterceptor implements HandlerInterceptor {
|
||||
|
||||
private static final Log logger = LogFactory.getLog(LongTaskTimingHandlerInterceptor.class);
|
||||
|
||||
private final MeterRegistry registry;
|
||||
|
||||
private final WebMvcTagsProvider tagsProvider;
|
||||
@@ -90,12 +94,18 @@ public class LongTaskTimingHandlerInterceptor implements HandlerInterceptor {
|
||||
private Collection<LongTaskTimer.Sample> getLongTaskTimerSamples(HttpServletRequest request, Object handler,
|
||||
Set<Timed> annotations) {
|
||||
List<LongTaskTimer.Sample> samples = new ArrayList<>();
|
||||
annotations.stream().filter(Timed::longTask).forEach((annotation) -> {
|
||||
Iterable<Tag> tags = this.tagsProvider.getLongRequestTags(request, handler);
|
||||
LongTaskTimer.Builder builder = LongTaskTimer.builder(annotation).tags(tags);
|
||||
LongTaskTimer timer = builder.register(this.registry);
|
||||
samples.add(timer.start());
|
||||
});
|
||||
try {
|
||||
annotations.stream().filter(Timed::longTask).forEach((annotation) -> {
|
||||
Iterable<Tag> tags = this.tagsProvider.getLongRequestTags(request, handler);
|
||||
LongTaskTimer.Builder builder = LongTaskTimer.builder(annotation).tags(tags);
|
||||
LongTaskTimer timer = builder.register(this.registry);
|
||||
samples.add(timer.start());
|
||||
});
|
||||
}
|
||||
catch (Exception ex) {
|
||||
logger.warn("Failed to start long task timers", ex);
|
||||
// Allow request-response exchange to continue, unaffected by metrics problem
|
||||
}
|
||||
return samples;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ import io.micrometer.core.instrument.MeterRegistry;
|
||||
import io.micrometer.core.instrument.Timer;
|
||||
import io.micrometer.core.instrument.Timer.Builder;
|
||||
import io.micrometer.core.instrument.Timer.Sample;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.boot.actuate.metrics.AutoTimer;
|
||||
import org.springframework.boot.actuate.metrics.annotation.TimedAnnotations;
|
||||
@@ -52,6 +54,8 @@ import org.springframework.web.util.NestedServletException;
|
||||
*/
|
||||
public class WebMvcMetricsFilter extends OncePerRequestFilter {
|
||||
|
||||
private static final Log logger = LogFactory.getLog(WebMvcMetricsFilter.class);
|
||||
|
||||
private final MeterRegistry registry;
|
||||
|
||||
private final WebMvcTagsProvider tagsProvider;
|
||||
@@ -127,11 +131,17 @@ public class WebMvcMetricsFilter extends OncePerRequestFilter {
|
||||
|
||||
private void record(TimingContext timingContext, HttpServletRequest request, HttpServletResponse response,
|
||||
Throwable exception) {
|
||||
Object handler = getHandler(request);
|
||||
Set<Timed> annotations = getTimedAnnotations(handler);
|
||||
Timer.Sample timerSample = timingContext.getTimerSample();
|
||||
AutoTimer.apply(this.autoTimer, this.metricName, annotations,
|
||||
(builder) -> timerSample.stop(getTimer(builder, handler, request, response, exception)));
|
||||
try {
|
||||
Object handler = getHandler(request);
|
||||
Set<Timed> annotations = getTimedAnnotations(handler);
|
||||
Timer.Sample timerSample = timingContext.getTimerSample();
|
||||
AutoTimer.apply(this.autoTimer, this.metricName, annotations,
|
||||
(builder) -> timerSample.stop(getTimer(builder, handler, request, response, exception)));
|
||||
}
|
||||
catch (Exception ex) {
|
||||
logger.warn("Failed to record timer metrics", ex);
|
||||
// Allow request-response exchange to continue, unaffected by metrics problem
|
||||
}
|
||||
}
|
||||
|
||||
private Object getHandler(HttpServletRequest request) {
|
||||
|
||||
Reference in New Issue
Block a user