Don’t check that a Gauge’s value is a Number until it’s being read

Spring Boot’s metrics require all values to be Numbers. A Dropwizard
Gauge can have a non-Number value. Previously, to prevent this causing
a problem, MetricRegistryMetricReader would check the value of a Gauge
when it’s being added and ignore it if it had a non-Number value.
Unfortunately, retrieving the value of a Gauge can take a non-trivial
amount of time (hence CachedGauge) so this approach, while functional,
could be improved.

This commit updates the filtering to happen when a Metric is being
retrieved from MetricRegistryMetricReader (via findOne or findAll)
when its value is required anyway. At this point, any Gauge with a
non-Number value is ignored.

Closes gh-4874
This commit is contained in:
Andy Wilkinson 2016-01-20 11:06:58 +00:00
parent d7fbe9efbb
commit 00f4538529
2 changed files with 11 additions and 12 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2013-2015 the original author or authors.
* Copyright 2013-2016 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.
@ -87,9 +87,15 @@ public class MetricRegistryMetricReader implements MetricReader, MetricRegistryL
return new Metric<Number>(metricName, counter.getCount());
}
if (metric instanceof Gauge) {
@SuppressWarnings("unchecked")
Gauge<Number> value = (Gauge<Number>) metric;
return new Metric<Number>(metricName, value.getValue());
Object value = ((Gauge<?>) metric).getValue();
if (value instanceof Number) {
return new Metric<Number>(metricName, (Number) value);
}
if (logger.isDebugEnabled()) {
logger.debug("Ignoring gauge '" + name + "' (" + metric
+ ") as its value is not a Number");
}
return null;
}
if (metric instanceof Sampling) {
if (metricName.contains(".snapshot.")) {
@ -129,13 +135,6 @@ public class MetricRegistryMetricReader implements MetricReader, MetricRegistryL
@Override
public void onGaugeAdded(String name, Gauge<?> gauge) {
if (!(gauge.getValue() instanceof Number)) {
if (logger.isDebugEnabled()) {
logger.debug("Ignoring gauge '" + name + "' (" + gauge
+ ") as its value is not a Number");
}
return;
}
this.names.put(name, name);
synchronized (this.monitor) {
this.reverse.add(name, name);

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2015 the original author or authors.
* Copyright 2012-2016 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.