diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaDiscoveryClientConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaDiscoveryClientConfiguration.java index 1a58bb5b..05732cf1 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaDiscoveryClientConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaDiscoveryClientConfiguration.java @@ -17,6 +17,8 @@ package org.springframework.cloud.netflix.eureka; import java.lang.reflect.Field; +import java.util.Collections; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -26,6 +28,7 @@ import lombok.extern.apachecommons.CommonsLog; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.endpoint.Endpoint; +import org.springframework.boot.actuate.metrics.reader.CompositeMetricReader; import org.springframework.boot.actuate.metrics.reader.MetricReader; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -220,11 +223,15 @@ public class EurekaDiscoveryClientConfiguration implements SmartLifecycle, Order @ConditionalOnClass(Endpoint.class) @ConditionalOnBean(MetricReader.class) protected static class EurekaHealthIndicatorConfiguration { + + @Autowired + private List metricReaders = Collections.emptyList(); + @Bean @ConditionalOnMissingBean public EurekaHealthIndicator eurekaHealthIndicator( - com.netflix.discovery.DiscoveryClient eurekaDiscoveryClient, - MetricReader metrics, EurekaInstanceConfig config) { + com.netflix.discovery.DiscoveryClient eurekaDiscoveryClient, EurekaInstanceConfig config) { + CompositeMetricReader metrics = new CompositeMetricReader(metricReaders.toArray(new MetricReader[0])); return new EurekaHealthIndicator(eurekaDiscoveryClient, metrics, config); } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/servo/ServoMetricsAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/servo/ServoMetricsAutoConfiguration.java index 52eac58d..e60ac1af 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/servo/ServoMetricsAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/servo/ServoMetricsAutoConfiguration.java @@ -18,7 +18,10 @@ package org.springframework.cloud.netflix.servo; import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration; +import org.springframework.boot.actuate.metrics.GaugeService; +import org.springframework.boot.actuate.metrics.Metric; import org.springframework.boot.actuate.metrics.reader.MetricReader; +import org.springframework.boot.actuate.metrics.writer.Delta; import org.springframework.boot.actuate.metrics.writer.MetricWriter; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; @@ -38,7 +41,7 @@ import com.netflix.servo.monitor.Monitors; */ @Configuration @ConditionalOnClass({ Monitors.class, MetricReader.class }) -@ConditionalOnBean(MetricReader.class) +@ConditionalOnBean(GaugeService.class) @AutoConfigureBefore(EndpointAutoConfiguration.class) @AutoConfigureAfter({ MetricRepositoryAutoConfiguration.class }) public class ServoMetricsAutoConfiguration { @@ -51,9 +54,34 @@ public class ServoMetricsAutoConfiguration { @Bean @ConditionalOnMissingBean - public ServoMetricCollector servoMetricCollector(MetricWriter metrics, - ServoMetricNaming naming) { - return new ServoMetricCollector(metrics, naming); + public ServoMetricCollector servoMetricCollector(GaugeService gauges, + ServoMetricNaming naming) { + return new ServoMetricCollector(new ActuatorMetricWriter(gauges), naming); + } + + // TODO: refactor this when Spring Boot 1.3 is mandatory + private static class ActuatorMetricWriter implements MetricWriter { + + private GaugeService gauges; + + public ActuatorMetricWriter(GaugeService gauges) { + this.gauges = gauges; + } + + @Override + public void increment(Delta delta) { + } + + @Override + public void set(Metric value) { + gauges.submit(value.getName(), value.getValue().doubleValue()); + } + + @Override + public void reset(String metricName) { + gauges.submit(metricName, 0.); + } + } }