-
Notifications
You must be signed in to change notification settings - Fork 41.4k
Closed
Closed
Copy link
Description
I recently ran into an issue with a misconfigured MeterFilter
. The filter threw exceptions causing in requests failing. I'm adding the filter like this:
@Bean
public MeterFilter taggingMeterFilter(MetricsProperties props) {
return new TaggingMeterFilter(props);
}
static class TaggingMeterFilter implements MeterFilter {
I first observed that this is not causing issues (other than a cluttered log) when recording http.server.requests
metrics. This is due to the MetricsWebFilter
catching Exceptions and logging them away:
private void record(ServerWebExchange exchange, Throwable cause, long start) {
try {
[...]
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
}
}
I then discovered that when the exception occurs in recording http.client.requests
this is not handled similarly and I get failed requests. Apparently this is due to code in MetricsWebClientFilterFunction
that doesn't do any exception handling.
private void recordTimer(Iterable<Tag> tags, Long startTime) {
this.autoTimer.builder(this.metricName).tags(tags).description("Timer of WebClient operation")
.register(this.meterRegistry).record(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);
}
While I will add additional resilience to my code, I'd also suggest to add exception handling here. Any thoughts?
Metadata
Metadata
Assignees
Labels
type: bugA general bugA general bug