Commit 27da0bc1 by Dave Syer

Simplify implementation of servo metrics

parent 64c447f0
...@@ -18,12 +18,12 @@ package org.springframework.cloud.netflix.eureka; ...@@ -18,12 +18,12 @@ package org.springframework.cloud.netflix.eureka;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.metrics.reader.MetricReader;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.netflix.servo.ServoMetricReader;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -69,8 +69,9 @@ public class EurekaClientAutoConfiguration { ...@@ -69,8 +69,9 @@ public class EurekaClientAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public EurekaHealthIndicator eurekaHealthIndicator(EurekaInstanceConfig config) { @ConditionalOnBean(MetricReader.class)
return new EurekaHealthIndicator(discoveryClient, new ServoMetricReader(), config); public EurekaHealthIndicator eurekaHealthIndicator(EurekaInstanceConfig config, MetricReader metrics) {
return new EurekaHealthIndicator(discoveryClient, metrics, config);
} }
} }
...@@ -17,15 +17,13 @@ ...@@ -17,15 +17,13 @@
package org.springframework.cloud.netflix.servo; package org.springframework.cloud.netflix.servo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.springframework.boot.actuate.metrics.Metric; import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.boot.actuate.metrics.reader.MetricReader; import org.springframework.boot.actuate.metrics.reader.MetricReader;
import org.springframework.boot.actuate.metrics.writer.MetricWriter;
import com.netflix.servo.monitor.MonitorConfig; import com.netflix.servo.monitor.MonitorConfig;
import com.netflix.servo.publish.BaseMetricObserver; import com.netflix.servo.publish.BaseMetricObserver;
...@@ -37,23 +35,19 @@ import com.netflix.servo.publish.PollScheduler; ...@@ -37,23 +35,19 @@ import com.netflix.servo.publish.PollScheduler;
/** /**
* {@link MetricReader} implementation that registers a {@link MetricObserver} with the * {@link MetricReader} implementation that registers a {@link MetricObserver} with the
* Netflix Servo library and exposes Servo metrics to the <code>/metric</code> endpoint. * Netflix Servo library and exposes Servo metrics to the <code>/metric</code> endpoint.
* *
* @author Dave Syer * @author Dave Syer
* @author Christian Dupuis * @author Christian Dupuis
*/ */
public class ServoMetricReader implements MetricReader { public class ServoMetricCollector {
private static final Object monitor = new Object(); public ServoMetricCollector(MetricWriter metrics) {
private final Map<String, Metric<?>> metrics = new HashMap<String, Metric<?>>();
public ServoMetricReader() {
List<MetricObserver> observers = new ArrayList<MetricObserver>(); List<MetricObserver> observers = new ArrayList<MetricObserver>();
observers.add(new ServoMetricObserver(this.metrics)); observers.add(new ServoMetricObserver(metrics));
PollRunnable task = new PollRunnable(new MonitorRegistryMetricPoller(), PollRunnable task = new PollRunnable(new MonitorRegistryMetricPoller(),
BasicMetricFilter.MATCH_ALL, true, observers); BasicMetricFilter.MATCH_ALL, true, observers);
if (!PollScheduler.getInstance().isStarted()) { if (!PollScheduler.getInstance().isStarted()) {
PollScheduler.getInstance().start(); PollScheduler.getInstance().start();
} }
...@@ -61,58 +55,32 @@ public class ServoMetricReader implements MetricReader { ...@@ -61,58 +55,32 @@ public class ServoMetricReader implements MetricReader {
PollScheduler.getInstance().addPoller(task, 5, TimeUnit.SECONDS); PollScheduler.getInstance().addPoller(task, 5, TimeUnit.SECONDS);
} }
@Override
public Metric<?> findOne(String metricName) {
synchronized (monitor) {
return this.metrics.get(metricName);
}
}
@Override
public Iterable<Metric<?>> findAll() {
synchronized (monitor) {
return Collections.unmodifiableCollection(this.metrics.values());
}
}
@Override
public long count() {
synchronized (monitor) {
return this.metrics.size();
}
}
/** /**
* {@link MetricObserver} to convert Servo metrics into Spring Boot {@link Metric} instances. * {@link MetricObserver} to convert Servo metrics into Spring Boot {@link Metric}
* instances.
*/ */
private static final class ServoMetricObserver extends BaseMetricObserver { private static final class ServoMetricObserver extends BaseMetricObserver {
private final Map<String, Metric<?>> metrics; private final MetricWriter metrics;
public ServoMetricObserver(Map<String, Metric<?>> metrics) { public ServoMetricObserver(MetricWriter metrics) {
super("spring-boot"); super("spring-boot");
this.metrics = metrics; this.metrics = metrics;
} }
@Override @Override
public void updateImpl(List<com.netflix.servo.Metric> servoMetrics) { public void updateImpl(List<com.netflix.servo.Metric> servoMetrics) {
Map<String, Metric<?>> newMetrics = new HashMap<String, Metric<?>>();
for (com.netflix.servo.Metric servoMetric : servoMetrics) { for (com.netflix.servo.Metric servoMetric : servoMetrics) {
MonitorConfig config = servoMetric.getConfig(); MonitorConfig config = servoMetric.getConfig();
String type = config.getTags().getValue("type"); String type = config.getTags().getValue("type");
String key = new StringBuilder(type).append(".servo.").append(config.getName()) String key = new StringBuilder(type).append(".servo.")
.toString().toLowerCase(); .append(config.getName()).toString().toLowerCase();
if (servoMetric.hasNumberValue()) { if (servoMetric.hasNumberValue()) {
newMetrics.put(key, new Metric<Number>(key, servoMetric.getNumberValue(), metrics.set(new Metric<Number>(key, servoMetric.getNumberValue(),
new Date(servoMetric.getTimestamp()))); new Date(servoMetric.getTimestamp())));
} }
} }
synchronized (monitor) {
this.metrics.clear();
this.metrics.putAll(newMetrics);
}
} }
} }
......
...@@ -18,8 +18,8 @@ package org.springframework.cloud.netflix.servo; ...@@ -18,8 +18,8 @@ package org.springframework.cloud.netflix.servo;
import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration;
import org.springframework.boot.actuate.endpoint.MetricReaderPublicMetrics;
import org.springframework.boot.actuate.metrics.reader.MetricReader; import org.springframework.boot.actuate.metrics.reader.MetricReader;
import org.springframework.boot.actuate.metrics.writer.MetricWriter;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
...@@ -45,7 +45,7 @@ public class ServoMetricsAutoConfiguration { ...@@ -45,7 +45,7 @@ public class ServoMetricsAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public MetricReaderPublicMetrics servoPublicMetrics() { public ServoMetricCollector servoMetricCollector(MetricWriter metrics) {
return new MetricReaderPublicMetrics(new ServoMetricReader()); return new ServoMetricCollector(metrics);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment