Commit d8c5c326 authored by Phillip Webb's avatar Phillip Webb

Co-locate PublicMetrics auto-configuration

Fixes gh-1900
parent 8cac63e2
...@@ -18,6 +18,7 @@ package org.springframework.boot.actuate.autoconfigure; ...@@ -18,6 +18,7 @@ package org.springframework.boot.actuate.autoconfigure;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
...@@ -34,18 +35,14 @@ import org.springframework.boot.actuate.endpoint.Endpoint; ...@@ -34,18 +35,14 @@ import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.EnvironmentEndpoint; import org.springframework.boot.actuate.endpoint.EnvironmentEndpoint;
import org.springframework.boot.actuate.endpoint.HealthEndpoint; import org.springframework.boot.actuate.endpoint.HealthEndpoint;
import org.springframework.boot.actuate.endpoint.InfoEndpoint; import org.springframework.boot.actuate.endpoint.InfoEndpoint;
import org.springframework.boot.actuate.endpoint.MetricReaderPublicMetrics;
import org.springframework.boot.actuate.endpoint.MetricsEndpoint; import org.springframework.boot.actuate.endpoint.MetricsEndpoint;
import org.springframework.boot.actuate.endpoint.PublicMetrics; import org.springframework.boot.actuate.endpoint.PublicMetrics;
import org.springframework.boot.actuate.endpoint.RequestMappingEndpoint; import org.springframework.boot.actuate.endpoint.RequestMappingEndpoint;
import org.springframework.boot.actuate.endpoint.ShutdownEndpoint; import org.springframework.boot.actuate.endpoint.ShutdownEndpoint;
import org.springframework.boot.actuate.endpoint.SystemPublicMetrics;
import org.springframework.boot.actuate.endpoint.TraceEndpoint; import org.springframework.boot.actuate.endpoint.TraceEndpoint;
import org.springframework.boot.actuate.health.HealthAggregator; import org.springframework.boot.actuate.health.HealthAggregator;
import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.actuate.health.OrderedHealthAggregator; import org.springframework.boot.actuate.health.OrderedHealthAggregator;
import org.springframework.boot.actuate.metrics.reader.MetricReader;
import org.springframework.boot.actuate.metrics.repository.InMemoryMetricRepository;
import org.springframework.boot.actuate.trace.InMemoryTraceRepository; import org.springframework.boot.actuate.trace.InMemoryTraceRepository;
import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.actuate.trace.TraceRepository;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
...@@ -58,6 +55,7 @@ import org.springframework.boot.bind.PropertiesConfigurationFactory; ...@@ -58,6 +55,7 @@ import org.springframework.boot.bind.PropertiesConfigurationFactory;
import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData; import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.StandardEnvironment; import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
...@@ -86,9 +84,6 @@ public class EndpointAutoConfiguration { ...@@ -86,9 +84,6 @@ public class EndpointAutoConfiguration {
@Autowired(required = false) @Autowired(required = false)
Map<String, HealthIndicator> healthIndicators = new HashMap<String, HealthIndicator>(); Map<String, HealthIndicator> healthIndicators = new HashMap<String, HealthIndicator>();
@Autowired(required = false)
private MetricReader metricReader = new InMemoryMetricRepository();
@Autowired(required = false) @Autowired(required = false)
private Collection<PublicMetrics> publicMetrics; private Collection<PublicMetrics> publicMetrics;
...@@ -132,11 +127,10 @@ public class EndpointAutoConfiguration { ...@@ -132,11 +127,10 @@ public class EndpointAutoConfiguration {
@ConditionalOnMissingBean @ConditionalOnMissingBean
public MetricsEndpoint metricsEndpoint() { public MetricsEndpoint metricsEndpoint() {
List<PublicMetrics> publicMetrics = new ArrayList<PublicMetrics>(); List<PublicMetrics> publicMetrics = new ArrayList<PublicMetrics>();
publicMetrics.add(new SystemPublicMetrics());
publicMetrics.add(new MetricReaderPublicMetrics(this.metricReader));
if (this.publicMetrics != null) { if (this.publicMetrics != null) {
publicMetrics.addAll(this.publicMetrics); publicMetrics.addAll(this.publicMetrics);
} }
Collections.sort(publicMetrics, AnnotationAwareOrderComparator.INSTANCE);
return new MetricsEndpoint(publicMetrics); return new MetricsEndpoint(publicMetrics);
} }
......
...@@ -23,14 +23,12 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -23,14 +23,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.actuate.endpoint.MetricReaderPublicMetrics; import org.springframework.boot.actuate.endpoint.MetricReaderPublicMetrics;
import org.springframework.boot.actuate.endpoint.PublicMetrics; import org.springframework.boot.actuate.endpoint.PublicMetrics;
import org.springframework.boot.actuate.endpoint.RichGaugeReaderPublicMetrics;
import org.springframework.boot.actuate.metrics.CounterService; import org.springframework.boot.actuate.metrics.CounterService;
import org.springframework.boot.actuate.metrics.GaugeService; import org.springframework.boot.actuate.metrics.GaugeService;
import org.springframework.boot.actuate.metrics.export.Exporter; import org.springframework.boot.actuate.metrics.export.Exporter;
import org.springframework.boot.actuate.metrics.reader.MetricRegistryMetricReader; import org.springframework.boot.actuate.metrics.reader.MetricRegistryMetricReader;
import org.springframework.boot.actuate.metrics.repository.InMemoryMetricRepository; import org.springframework.boot.actuate.metrics.repository.InMemoryMetricRepository;
import org.springframework.boot.actuate.metrics.repository.MetricRepository; import org.springframework.boot.actuate.metrics.repository.MetricRepository;
import org.springframework.boot.actuate.metrics.rich.RichGaugeReader;
import org.springframework.boot.actuate.metrics.writer.CodahaleMetricWriter; import org.springframework.boot.actuate.metrics.writer.CodahaleMetricWriter;
import org.springframework.boot.actuate.metrics.writer.CompositeMetricWriter; import org.springframework.boot.actuate.metrics.writer.CompositeMetricWriter;
import org.springframework.boot.actuate.metrics.writer.DefaultCounterService; import org.springframework.boot.actuate.metrics.writer.DefaultCounterService;
...@@ -39,7 +37,6 @@ import org.springframework.boot.actuate.metrics.writer.MessageChannelMetricWrite ...@@ -39,7 +37,6 @@ import org.springframework.boot.actuate.metrics.writer.MessageChannelMetricWrite
import org.springframework.boot.actuate.metrics.writer.MetricWriter; import org.springframework.boot.actuate.metrics.writer.MetricWriter;
import org.springframework.boot.actuate.metrics.writer.MetricWriterMessageHandler; import org.springframework.boot.actuate.metrics.writer.MetricWriterMessageHandler;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
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.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
...@@ -124,12 +121,6 @@ public class MetricRepositoryAutoConfiguration { ...@@ -124,12 +121,6 @@ public class MetricRepositoryAutoConfiguration {
} }
@Bean
@ConditionalOnBean(RichGaugeReader.class)
public PublicMetrics richGaugePublicMetrics(RichGaugeReader richGaugeReader) {
return new RichGaugeReaderPublicMetrics(richGaugeReader);
}
@Configuration @Configuration
@ConditionalOnClass(MessageChannel.class) @ConditionalOnClass(MessageChannel.class)
static class MetricsChannelConfiguration { static class MetricsChannelConfiguration {
...@@ -186,10 +177,11 @@ public class MetricRepositoryAutoConfiguration { ...@@ -186,10 +177,11 @@ public class MetricRepositoryAutoConfiguration {
public MetricWriter primaryMetricWriter(List<MetricWriter> writers) { public MetricWriter primaryMetricWriter(List<MetricWriter> writers) {
return new CompositeMetricWriter(writers); return new CompositeMetricWriter(writers);
} }
@Bean @Bean
public PublicMetrics codahalePublicMetrics(MetricRegistry metricRegistry) { public PublicMetrics codahalePublicMetrics(MetricRegistry metricRegistry) {
MetricRegistryMetricReader reader = new MetricRegistryMetricReader(metricRegistry); MetricRegistryMetricReader reader = new MetricRegistryMetricReader(
metricRegistry);
return new MetricReaderPublicMetrics(reader); return new MetricReaderPublicMetrics(reader);
} }
......
...@@ -18,31 +18,71 @@ package org.springframework.boot.actuate.autoconfigure; ...@@ -18,31 +18,71 @@ package org.springframework.boot.actuate.autoconfigure;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.DataSourcePublicMetrics; import org.springframework.boot.actuate.endpoint.DataSourcePublicMetrics;
import org.springframework.boot.actuate.endpoint.MetricReaderPublicMetrics;
import org.springframework.boot.actuate.endpoint.PublicMetrics;
import org.springframework.boot.actuate.endpoint.RichGaugeReaderPublicMetrics;
import org.springframework.boot.actuate.endpoint.SystemPublicMetrics;
import org.springframework.boot.actuate.metrics.reader.MetricReader;
import org.springframework.boot.actuate.metrics.repository.InMemoryMetricRepository;
import org.springframework.boot.actuate.metrics.rich.RichGaugeReader;
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
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.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvider; import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvider;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/** /**
* {@link EnableAutoConfiguration Auto-configuration} that provides metrics on dataSource * {@link EnableAutoConfiguration Auto-configuration} for {@link PublicMetrics}.
* usage.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Phillip Webb
* @since 1.2.0 * @since 1.2.0
*/ */
@ConditionalOnBean(DataSource.class) @Configuration
@AutoConfigureAfter(DataSourceAutoConfiguration.class) @AutoConfigureAfter({ DataSourceAutoConfiguration.class,
public class DataSourceMetricsAutoConfiguration { MetricRepositoryAutoConfiguration.class })
@AutoConfigureBefore(EndpointAutoConfiguration.class)
public class PublicMetricsAutoConfiguration {
@Autowired(required = false)
private MetricReader metricReader = new InMemoryMetricRepository();
@Bean
public SystemPublicMetrics systemPublicMetrics() {
return new SystemPublicMetrics();
}
@Bean @Bean
@ConditionalOnBean(DataSourcePoolMetadataProvider.class) public MetricReaderPublicMetrics metricReaderPublicMetrics() {
@ConditionalOnMissingBean return new MetricReaderPublicMetrics(this.metricReader);
public DataSourcePublicMetrics dataSourcePublicMetrics() { }
return new DataSourcePublicMetrics();
@Bean
@ConditionalOnBean(RichGaugeReader.class)
public RichGaugeReaderPublicMetrics richGaugePublicMetrics(
RichGaugeReader richGaugeReader) {
return new RichGaugeReaderPublicMetrics(richGaugeReader);
}
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnBean(DataSource.class)
static class DataSourceMetricsConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnBean(DataSourcePoolMetadataProvider.class)
public DataSourcePublicMetrics dataSourcePublicMetrics() {
return new DataSourcePublicMetrics();
}
} }
} }
...@@ -121,4 +121,5 @@ public class DataSourcePublicMetrics implements PublicMetrics { ...@@ -121,4 +121,5 @@ public class DataSourcePublicMetrics implements PublicMetrics {
return null; return null;
} }
} }
} }
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.actuate.autoconfigure.AuditAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.AuditAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.DataSourceMetricsAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.EndpointMBeanExportAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.EndpointMBeanExportAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration,\
...@@ -11,5 +10,6 @@ org.springframework.boot.actuate.autoconfigure.ManagementSecurityAutoConfigurati ...@@ -11,5 +10,6 @@ org.springframework.boot.actuate.autoconfigure.ManagementSecurityAutoConfigurati
org.springframework.boot.actuate.autoconfigure.ManagementServerPropertiesAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.ManagementServerPropertiesAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.PublicMetricsAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration,\
org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration
...@@ -103,7 +103,7 @@ public class EndpointAutoConfigurationTests { ...@@ -103,7 +103,7 @@ public class EndpointAutoConfigurationTests {
@Test @Test
public void metricEndpointsHasSystemMetricsByDefault() { public void metricEndpointsHasSystemMetricsByDefault() {
load(EndpointAutoConfiguration.class); load(PublicMetricsAutoConfiguration.class, EndpointAutoConfiguration.class);
MetricsEndpoint endpoint = this.context.getBean(MetricsEndpoint.class); MetricsEndpoint endpoint = this.context.getBean(MetricsEndpoint.class);
Map<String, Object> metrics = endpoint.invoke(); Map<String, Object> metrics = endpoint.invoke();
assertTrue(metrics.containsKey("mem")); assertTrue(metrics.containsKey("mem"));
...@@ -112,7 +112,8 @@ public class EndpointAutoConfigurationTests { ...@@ -112,7 +112,8 @@ public class EndpointAutoConfigurationTests {
@Test @Test
public void metricEndpointCustomPublicMetrics() { public void metricEndpointCustomPublicMetrics() {
load(CustomPublicMetricsConfig.class, EndpointAutoConfiguration.class); load(CustomPublicMetricsConfig.class, PublicMetricsAutoConfiguration.class,
EndpointAutoConfiguration.class);
MetricsEndpoint endpoint = this.context.getBean(MetricsEndpoint.class); MetricsEndpoint endpoint = this.context.getBean(MetricsEndpoint.class);
Map<String, Object> metrics = endpoint.invoke(); Map<String, Object> metrics = endpoint.invoke();
......
...@@ -16,18 +16,13 @@ ...@@ -16,18 +16,13 @@
package org.springframework.boot.actuate.autoconfigure; package org.springframework.boot.actuate.autoconfigure;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.actuate.endpoint.RichGaugeReaderPublicMetrics;
import org.springframework.boot.actuate.metrics.CounterService; import org.springframework.boot.actuate.metrics.CounterService;
import org.springframework.boot.actuate.metrics.GaugeService; import org.springframework.boot.actuate.metrics.GaugeService;
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.rich.RichGauge;
import org.springframework.boot.actuate.metrics.rich.RichGaugeReader;
import org.springframework.boot.actuate.metrics.writer.DefaultCounterService; import org.springframework.boot.actuate.metrics.writer.DefaultCounterService;
import org.springframework.boot.actuate.metrics.writer.DefaultGaugeService; import org.springframework.boot.actuate.metrics.writer.DefaultGaugeService;
import org.springframework.boot.actuate.metrics.writer.MetricWriter; import org.springframework.boot.actuate.metrics.writer.MetricWriter;
...@@ -46,8 +41,6 @@ import static org.junit.Assert.assertEquals; ...@@ -46,8 +41,6 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
...@@ -122,44 +115,6 @@ public class MetricRepositoryAutoConfigurationTests { ...@@ -122,44 +115,6 @@ public class MetricRepositoryAutoConfigurationTests {
context.close(); context.close();
} }
@Test
public void richGaugePublicMetrics() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
RichGaugeReaderConfig.class, MetricRepositoryAutoConfiguration.class);
RichGaugeReader richGaugeReader = context.getBean(RichGaugeReader.class);
assertNotNull(richGaugeReader);
given(richGaugeReader.findAll()).willReturn(
Collections.singletonList(new RichGauge("bar", 3.7d)));
RichGaugeReaderPublicMetrics publicMetrics = context
.getBean(RichGaugeReaderPublicMetrics.class);
assertNotNull(publicMetrics);
Collection<Metric<?>> metrics = publicMetrics.metrics();
assertNotNull(metrics);
assertEquals(metrics.size(), 6);
assertHasMetric(metrics, new Metric<Double>("bar.val", 3.7d));
assertHasMetric(metrics, new Metric<Double>("bar.avg", 3.7d));
assertHasMetric(metrics, new Metric<Double>("bar.min", 3.7d));
assertHasMetric(metrics, new Metric<Double>("bar.max", 3.7d));
assertHasMetric(metrics, new Metric<Double>("bar.alpha", -1.d));
assertHasMetric(metrics, new Metric<Long>("bar.count", 1L));
context.close();
}
private void assertHasMetric(Collection<Metric<?>> metrics, Metric<?> metric) {
for (Metric<?> m : metrics) {
if (m.getValue().equals(metric.getValue())
&& m.getName().equals(metric.getName())) {
return;
}
}
fail("Metric " + metric.toString() + " not found in " + metrics.toString());
}
@Configuration @Configuration
public static class SyncTaskExecutorConfiguration { public static class SyncTaskExecutorConfiguration {
...@@ -195,11 +150,4 @@ public class MetricRepositoryAutoConfigurationTests { ...@@ -195,11 +150,4 @@ public class MetricRepositoryAutoConfigurationTests {
} }
@Configuration
static class RichGaugeReaderConfig {
@Bean
public RichGaugeReader richGaugeReader() {
return mock(RichGaugeReader.class);
}
}
} }
...@@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure; ...@@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -28,8 +29,13 @@ import org.apache.commons.dbcp.BasicDataSource; ...@@ -28,8 +29,13 @@ import org.apache.commons.dbcp.BasicDataSource;
import org.junit.After; import org.junit.After;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.actuate.endpoint.DataSourcePublicMetrics; import org.springframework.boot.actuate.endpoint.DataSourcePublicMetrics;
import org.springframework.boot.actuate.endpoint.MetricReaderPublicMetrics;
import org.springframework.boot.actuate.endpoint.PublicMetrics; import org.springframework.boot.actuate.endpoint.PublicMetrics;
import org.springframework.boot.actuate.endpoint.RichGaugeReaderPublicMetrics;
import org.springframework.boot.actuate.endpoint.SystemPublicMetrics;
import org.springframework.boot.actuate.metrics.Metric; import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.boot.actuate.metrics.rich.RichGauge;
import org.springframework.boot.actuate.metrics.rich.RichGaugeReader;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvidersConfiguration; import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvidersConfiguration;
...@@ -44,14 +50,20 @@ import org.springframework.jdbc.core.JdbcTemplate; ...@@ -44,14 +50,20 @@ import org.springframework.jdbc.core.JdbcTemplate;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
/** /**
* Tests for {@link DataSourceMetricsAutoConfiguration}. * Tests for {@link PublicMetricsAutoConfiguration}.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Dave Syer
* @author Phillip Webb
*/ */
public class DataSourceMetricsAutoConfigurationTests { public class PublicMetricsAutoConfigurationTests {
private AnnotationConfigApplicationContext context; private AnnotationConfigApplicationContext context;
...@@ -62,16 +74,58 @@ public class DataSourceMetricsAutoConfigurationTests { ...@@ -62,16 +74,58 @@ public class DataSourceMetricsAutoConfigurationTests {
} }
} }
@Test
public void systemPublicMetrics() throws Exception {
load();
assertEquals(1, this.context.getBeansOfType(SystemPublicMetrics.class).size());
}
@Test
public void metricReaderPublicMetrics() throws Exception {
load();
assertEquals(1, this.context.getBeansOfType(MetricReaderPublicMetrics.class)
.size());
}
@Test
public void richGaugePublicMetrics() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
RichGaugeReaderConfig.class, MetricRepositoryAutoConfiguration.class,
PublicMetricsAutoConfiguration.class);
RichGaugeReader richGaugeReader = context.getBean(RichGaugeReader.class);
assertNotNull(richGaugeReader);
given(richGaugeReader.findAll()).willReturn(
Collections.singletonList(new RichGauge("bar", 3.7d)));
RichGaugeReaderPublicMetrics publicMetrics = context
.getBean(RichGaugeReaderPublicMetrics.class);
assertNotNull(publicMetrics);
Collection<Metric<?>> metrics = publicMetrics.metrics();
assertNotNull(metrics);
assertEquals(metrics.size(), 6);
assertHasMetric(metrics, new Metric<Double>("bar.val", 3.7d));
assertHasMetric(metrics, new Metric<Double>("bar.avg", 3.7d));
assertHasMetric(metrics, new Metric<Double>("bar.min", 3.7d));
assertHasMetric(metrics, new Metric<Double>("bar.max", 3.7d));
assertHasMetric(metrics, new Metric<Double>("bar.alpha", -1.d));
assertHasMetric(metrics, new Metric<Long>("bar.count", 1L));
context.close();
}
@Test @Test
public void noDataSource() { public void noDataSource() {
load(); load();
assertEquals(0, this.context.getBeansOfType(PublicMetrics.class).size()); assertEquals(0, this.context.getBeansOfType(DataSourcePublicMetrics.class).size());
} }
@Test @Test
public void autoDataSource() { public void autoDataSource() {
load(DataSourceAutoConfiguration.class); load(DataSourceAutoConfiguration.class);
PublicMetrics bean = this.context.getBean(PublicMetrics.class); PublicMetrics bean = this.context.getBean(DataSourcePublicMetrics.class);
Collection<Metric<?>> metrics = bean.metrics(); Collection<Metric<?>> metrics = bean.metrics();
assertMetrics(metrics, "datasource.primary.active", "datasource.primary.usage"); assertMetrics(metrics, "datasource.primary.active", "datasource.primary.usage");
} }
...@@ -79,7 +133,7 @@ public class DataSourceMetricsAutoConfigurationTests { ...@@ -79,7 +133,7 @@ public class DataSourceMetricsAutoConfigurationTests {
@Test @Test
public void multipleDataSources() { public void multipleDataSources() {
load(MultipleDataSourcesConfig.class); load(MultipleDataSourcesConfig.class);
PublicMetrics bean = this.context.getBean(PublicMetrics.class); PublicMetrics bean = this.context.getBean(DataSourcePublicMetrics.class);
Collection<Metric<?>> metrics = bean.metrics(); Collection<Metric<?>> metrics = bean.metrics();
assertMetrics(metrics, "datasource.tomcat.active", "datasource.tomcat.usage", assertMetrics(metrics, "datasource.tomcat.active", "datasource.tomcat.usage",
"datasource.commonsDbcp.active", "datasource.commonsDbcp.usage"); "datasource.commonsDbcp.active", "datasource.commonsDbcp.usage");
...@@ -105,7 +159,7 @@ public class DataSourceMetricsAutoConfigurationTests { ...@@ -105,7 +159,7 @@ public class DataSourceMetricsAutoConfigurationTests {
@Test @Test
public void multipleDataSourcesWithPrimary() { public void multipleDataSourcesWithPrimary() {
load(MultipleDataSourcesWithPrimaryConfig.class); load(MultipleDataSourcesWithPrimaryConfig.class);
PublicMetrics bean = this.context.getBean(PublicMetrics.class); PublicMetrics bean = this.context.getBean(DataSourcePublicMetrics.class);
Collection<Metric<?>> metrics = bean.metrics(); Collection<Metric<?>> metrics = bean.metrics();
assertMetrics(metrics, "datasource.primary.active", "datasource.primary.usage", assertMetrics(metrics, "datasource.primary.active", "datasource.primary.usage",
"datasource.commonsDbcp.active", "datasource.commonsDbcp.usage"); "datasource.commonsDbcp.active", "datasource.commonsDbcp.usage");
...@@ -115,11 +169,20 @@ public class DataSourceMetricsAutoConfigurationTests { ...@@ -115,11 +169,20 @@ public class DataSourceMetricsAutoConfigurationTests {
public void customPrefix() { public void customPrefix() {
load(MultipleDataSourcesWithPrimaryConfig.class, load(MultipleDataSourcesWithPrimaryConfig.class,
CustomDataSourcePublicMetrics.class); CustomDataSourcePublicMetrics.class);
PublicMetrics bean = this.context.getBean(PublicMetrics.class); PublicMetrics bean = this.context.getBean(DataSourcePublicMetrics.class);
Collection<Metric<?>> metrics = bean.metrics(); Collection<Metric<?>> metrics = bean.metrics();
assertMetrics(metrics, "ds.first.active", "ds.first.usage", "ds.second.active", assertMetrics(metrics, "ds.first.active", "ds.first.usage", "ds.second.active",
"ds.second.usage"); "ds.second.usage");
}
private void assertHasMetric(Collection<Metric<?>> metrics, Metric<?> metric) {
for (Metric<?> m : metrics) {
if (m.getValue().equals(metric.getValue())
&& m.getName().equals(metric.getName())) {
return;
}
}
fail("Metric " + metric.toString() + " not found in " + metrics.toString());
} }
private void assertMetrics(Collection<Metric<?>> metrics, String... keys) { private void assertMetrics(Collection<Metric<?>> metrics, String... keys) {
...@@ -138,7 +201,7 @@ public class DataSourceMetricsAutoConfigurationTests { ...@@ -138,7 +201,7 @@ public class DataSourceMetricsAutoConfigurationTests {
this.context.register(config); this.context.register(config);
} }
this.context.register(DataSourcePoolMetadataProvidersConfiguration.class, this.context.register(DataSourcePoolMetadataProvidersConfiguration.class,
DataSourceMetricsAutoConfiguration.class); PublicMetricsAutoConfiguration.class);
this.context.refresh(); this.context.refresh();
} }
...@@ -198,4 +261,14 @@ public class DataSourceMetricsAutoConfigurationTests { ...@@ -198,4 +261,14 @@ public class DataSourceMetricsAutoConfigurationTests {
.url("jdbc:hsqldb:mem:test").username("sa"); .url("jdbc:hsqldb:mem:test").username("sa");
} }
@Configuration
static class RichGaugeReaderConfig {
@Bean
public RichGaugeReader richGaugeReader() {
return mock(RichGaugeReader.class);
}
}
} }
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