Browse Source

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
pull/4984/head
Andy Wilkinson 10 years ago
parent
commit
00f4538529
  1. 21
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/reader/MetricRegistryMetricReader.java
  2. 2
      spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/reader/MetricRegistryMetricReaderTests.java

21
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/reader/MetricRegistryMetricReader.java

@ -1,5 +1,5 @@ @@ -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 @@ -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 @@ -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);

2
spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/reader/MetricRegistryMetricReaderTests.java

@ -1,5 +1,5 @@ @@ -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.

Loading…
Cancel
Save