From d8c5c3262afaf144452aeae10a4481875c1a982a Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 11 Nov 2014 14:07:03 -0800 Subject: [PATCH] Co-locate PublicMetrics auto-configuration Fixes gh-1900 --- .../DataSourceMetricsAutoConfiguration.java | 48 ---------- .../EndpointAutoConfiguration.java | 12 +-- .../MetricRepositoryAutoConfiguration.java | 14 +-- .../PublicMetricsAutoConfiguration.java | 88 ++++++++++++++++++ .../endpoint/DataSourcePublicMetrics.java | 1 + .../main/resources/META-INF/spring.factories | 2 +- .../EndpointAutoConfigurationTests.java | 5 +- ...etricRepositoryAutoConfigurationTests.java | 52 ----------- ... PublicMetricsAutoConfigurationTests.java} | 89 +++++++++++++++++-- 9 files changed, 180 insertions(+), 131 deletions(-) delete mode 100644 spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/DataSourceMetricsAutoConfiguration.java create mode 100644 spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfiguration.java rename spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/{DataSourceMetricsAutoConfigurationTests.java => PublicMetricsAutoConfigurationTests.java} (65%) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/DataSourceMetricsAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/DataSourceMetricsAutoConfiguration.java deleted file mode 100644 index 4c88f7e501..0000000000 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/DataSourceMetricsAutoConfiguration.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2012-2014 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.actuate.autoconfigure; - -import javax.sql.DataSource; - -import org.springframework.boot.actuate.endpoint.DataSourcePublicMetrics; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvider; -import org.springframework.context.annotation.Bean; - -/** - * {@link EnableAutoConfiguration Auto-configuration} that provides metrics on dataSource - * usage. - * - * @author Stephane Nicoll - * @since 1.2.0 - */ -@ConditionalOnBean(DataSource.class) -@AutoConfigureAfter(DataSourceAutoConfiguration.class) -public class DataSourceMetricsAutoConfiguration { - - @Bean - @ConditionalOnBean(DataSourcePoolMetadataProvider.class) - @ConditionalOnMissingBean - public DataSourcePublicMetrics dataSourcePublicMetrics() { - return new DataSourcePublicMetrics(); - } - -} diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java index dc94aca2c0..4e878bd992 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java @@ -18,6 +18,7 @@ package org.springframework.boot.actuate.autoconfigure; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -34,18 +35,14 @@ import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.EnvironmentEndpoint; import org.springframework.boot.actuate.endpoint.HealthEndpoint; 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.PublicMetrics; import org.springframework.boot.actuate.endpoint.RequestMappingEndpoint; 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.health.HealthAggregator; import org.springframework.boot.actuate.health.HealthIndicator; 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.TraceRepository; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -58,6 +55,7 @@ import org.springframework.boot.bind.PropertiesConfigurationFactory; import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.StandardEnvironment; import org.springframework.core.io.Resource; @@ -86,9 +84,6 @@ public class EndpointAutoConfiguration { @Autowired(required = false) Map healthIndicators = new HashMap(); - @Autowired(required = false) - private MetricReader metricReader = new InMemoryMetricRepository(); - @Autowired(required = false) private Collection publicMetrics; @@ -132,11 +127,10 @@ public class EndpointAutoConfiguration { @ConditionalOnMissingBean public MetricsEndpoint metricsEndpoint() { List publicMetrics = new ArrayList(); - publicMetrics.add(new SystemPublicMetrics()); - publicMetrics.add(new MetricReaderPublicMetrics(this.metricReader)); if (this.publicMetrics != null) { publicMetrics.addAll(this.publicMetrics); } + Collections.sort(publicMetrics, AnnotationAwareOrderComparator.INSTANCE); return new MetricsEndpoint(publicMetrics); } diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricRepositoryAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricRepositoryAutoConfiguration.java index 4f73a2521f..a005ba6c1a 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricRepositoryAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/MetricRepositoryAutoConfiguration.java @@ -23,14 +23,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; 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.metrics.CounterService; import org.springframework.boot.actuate.metrics.GaugeService; import org.springframework.boot.actuate.metrics.export.Exporter; import org.springframework.boot.actuate.metrics.reader.MetricRegistryMetricReader; import org.springframework.boot.actuate.metrics.repository.InMemoryMetricRepository; 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.CompositeMetricWriter; import org.springframework.boot.actuate.metrics.writer.DefaultCounterService; @@ -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.MetricWriterMessageHandler; 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.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; @@ -124,12 +121,6 @@ public class MetricRepositoryAutoConfiguration { } - @Bean - @ConditionalOnBean(RichGaugeReader.class) - public PublicMetrics richGaugePublicMetrics(RichGaugeReader richGaugeReader) { - return new RichGaugeReaderPublicMetrics(richGaugeReader); - } - @Configuration @ConditionalOnClass(MessageChannel.class) static class MetricsChannelConfiguration { @@ -186,10 +177,11 @@ public class MetricRepositoryAutoConfiguration { public MetricWriter primaryMetricWriter(List writers) { return new CompositeMetricWriter(writers); } - + @Bean public PublicMetrics codahalePublicMetrics(MetricRegistry metricRegistry) { - MetricRegistryMetricReader reader = new MetricRegistryMetricReader(metricRegistry); + MetricRegistryMetricReader reader = new MetricRegistryMetricReader( + metricRegistry); return new MetricReaderPublicMetrics(reader); } diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfiguration.java new file mode 100644 index 0000000000..e7897af51b --- /dev/null +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfiguration.java @@ -0,0 +1,88 @@ +/* + * Copyright 2012-2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +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.AutoConfigureBefore; +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.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for {@link PublicMetrics}. + * + * @author Stephane Nicoll + * @author Phillip Webb + * @since 1.2.0 + */ +@Configuration +@AutoConfigureAfter({ DataSourceAutoConfiguration.class, + MetricRepositoryAutoConfiguration.class }) +@AutoConfigureBefore(EndpointAutoConfiguration.class) +public class PublicMetricsAutoConfiguration { + + @Autowired(required = false) + private MetricReader metricReader = new InMemoryMetricRepository(); + + @Bean + public SystemPublicMetrics systemPublicMetrics() { + return new SystemPublicMetrics(); + } + + @Bean + public MetricReaderPublicMetrics metricReaderPublicMetrics() { + return new MetricReaderPublicMetrics(this.metricReader); + } + + @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(); + } + + } + +} diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/DataSourcePublicMetrics.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/DataSourcePublicMetrics.java index f9887bdcaa..a0d1310692 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/DataSourcePublicMetrics.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/DataSourcePublicMetrics.java @@ -121,4 +121,5 @@ public class DataSourcePublicMetrics implements PublicMetrics { return null; } } + } diff --git a/spring-boot-actuator/src/main/resources/META-INF/spring.factories b/spring-boot-actuator/src/main/resources/META-INF/spring.factories index aa77fbc180..799422da3c 100644 --- a/spring-boot-actuator/src/main/resources/META-INF/spring.factories +++ b/spring-boot-actuator/src/main/resources/META-INF/spring.factories @@ -1,7 +1,6 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.actuate.autoconfigure.AuditAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration,\ -org.springframework.boot.actuate.autoconfigure.DataSourceMetricsAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.EndpointMBeanExportAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration,\ @@ -11,5 +10,6 @@ org.springframework.boot.actuate.autoconfigure.ManagementSecurityAutoConfigurati org.springframework.boot.actuate.autoconfigure.ManagementServerPropertiesAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.MetricRepositoryAutoConfiguration,\ +org.springframework.boot.actuate.autoconfigure.PublicMetricsAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.TraceRepositoryAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.TraceWebFilterAutoConfiguration diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfigurationTests.java index 2ceab55907..bc127565e0 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfigurationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfigurationTests.java @@ -103,7 +103,7 @@ public class EndpointAutoConfigurationTests { @Test public void metricEndpointsHasSystemMetricsByDefault() { - load(EndpointAutoConfiguration.class); + load(PublicMetricsAutoConfiguration.class, EndpointAutoConfiguration.class); MetricsEndpoint endpoint = this.context.getBean(MetricsEndpoint.class); Map metrics = endpoint.invoke(); assertTrue(metrics.containsKey("mem")); @@ -112,7 +112,8 @@ public class EndpointAutoConfigurationTests { @Test public void metricEndpointCustomPublicMetrics() { - load(CustomPublicMetricsConfig.class, EndpointAutoConfiguration.class); + load(CustomPublicMetricsConfig.class, PublicMetricsAutoConfiguration.class, + EndpointAutoConfiguration.class); MetricsEndpoint endpoint = this.context.getBean(MetricsEndpoint.class); Map metrics = endpoint.invoke(); diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricRepositoryAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricRepositoryAutoConfigurationTests.java index 97ae9643e3..78fbf1f4b8 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricRepositoryAutoConfigurationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/MetricRepositoryAutoConfigurationTests.java @@ -16,18 +16,13 @@ package org.springframework.boot.actuate.autoconfigure; -import java.util.Collection; -import java.util.Collections; import java.util.concurrent.Executor; import org.junit.Test; -import org.springframework.boot.actuate.endpoint.RichGaugeReaderPublicMetrics; import org.springframework.boot.actuate.metrics.CounterService; 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.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.DefaultGaugeService; import org.springframework.boot.actuate.metrics.writer.MetricWriter; @@ -46,8 +41,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; 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.Mockito.mock; import static org.mockito.Mockito.verify; @@ -122,44 +115,6 @@ public class MetricRepositoryAutoConfigurationTests { 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> metrics = publicMetrics.metrics(); - assertNotNull(metrics); - assertEquals(metrics.size(), 6); - - assertHasMetric(metrics, new Metric("bar.val", 3.7d)); - assertHasMetric(metrics, new Metric("bar.avg", 3.7d)); - assertHasMetric(metrics, new Metric("bar.min", 3.7d)); - assertHasMetric(metrics, new Metric("bar.max", 3.7d)); - assertHasMetric(metrics, new Metric("bar.alpha", -1.d)); - assertHasMetric(metrics, new Metric("bar.count", 1L)); - - context.close(); - } - - private void assertHasMetric(Collection> 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 public static class SyncTaskExecutorConfiguration { @@ -195,11 +150,4 @@ public class MetricRepositoryAutoConfigurationTests { } - @Configuration - static class RichGaugeReaderConfig { - @Bean - public RichGaugeReader richGaugeReader() { - return mock(RichGaugeReader.class); - } - } } diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/DataSourceMetricsAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfigurationTests.java similarity index 65% rename from spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/DataSourceMetricsAutoConfigurationTests.java rename to spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfigurationTests.java index c627e68fb3..55f0f5e1d8 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/DataSourceMetricsAutoConfigurationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfigurationTests.java @@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure; import java.sql.Connection; import java.sql.SQLException; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -28,8 +29,13 @@ import org.apache.commons.dbcp.BasicDataSource; import org.junit.After; import org.junit.Test; 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.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.DataSourceBuilder; import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvidersConfiguration; @@ -44,14 +50,20 @@ import org.springframework.jdbc.core.JdbcTemplate; import com.zaxxer.hikari.HikariDataSource; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; 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 Dave Syer + * @author Phillip Webb */ -public class DataSourceMetricsAutoConfigurationTests { +public class PublicMetricsAutoConfigurationTests { private AnnotationConfigApplicationContext context; @@ -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> metrics = publicMetrics.metrics(); + assertNotNull(metrics); + assertEquals(metrics.size(), 6); + + assertHasMetric(metrics, new Metric("bar.val", 3.7d)); + assertHasMetric(metrics, new Metric("bar.avg", 3.7d)); + assertHasMetric(metrics, new Metric("bar.min", 3.7d)); + assertHasMetric(metrics, new Metric("bar.max", 3.7d)); + assertHasMetric(metrics, new Metric("bar.alpha", -1.d)); + assertHasMetric(metrics, new Metric("bar.count", 1L)); + + context.close(); + } + @Test public void noDataSource() { load(); - assertEquals(0, this.context.getBeansOfType(PublicMetrics.class).size()); + assertEquals(0, this.context.getBeansOfType(DataSourcePublicMetrics.class).size()); } @Test public void autoDataSource() { load(DataSourceAutoConfiguration.class); - PublicMetrics bean = this.context.getBean(PublicMetrics.class); + PublicMetrics bean = this.context.getBean(DataSourcePublicMetrics.class); Collection> metrics = bean.metrics(); assertMetrics(metrics, "datasource.primary.active", "datasource.primary.usage"); } @@ -79,7 +133,7 @@ public class DataSourceMetricsAutoConfigurationTests { @Test public void multipleDataSources() { load(MultipleDataSourcesConfig.class); - PublicMetrics bean = this.context.getBean(PublicMetrics.class); + PublicMetrics bean = this.context.getBean(DataSourcePublicMetrics.class); Collection> metrics = bean.metrics(); assertMetrics(metrics, "datasource.tomcat.active", "datasource.tomcat.usage", "datasource.commonsDbcp.active", "datasource.commonsDbcp.usage"); @@ -105,7 +159,7 @@ public class DataSourceMetricsAutoConfigurationTests { @Test public void multipleDataSourcesWithPrimary() { load(MultipleDataSourcesWithPrimaryConfig.class); - PublicMetrics bean = this.context.getBean(PublicMetrics.class); + PublicMetrics bean = this.context.getBean(DataSourcePublicMetrics.class); Collection> metrics = bean.metrics(); assertMetrics(metrics, "datasource.primary.active", "datasource.primary.usage", "datasource.commonsDbcp.active", "datasource.commonsDbcp.usage"); @@ -115,11 +169,20 @@ public class DataSourceMetricsAutoConfigurationTests { public void customPrefix() { load(MultipleDataSourcesWithPrimaryConfig.class, CustomDataSourcePublicMetrics.class); - PublicMetrics bean = this.context.getBean(PublicMetrics.class); + PublicMetrics bean = this.context.getBean(DataSourcePublicMetrics.class); Collection> metrics = bean.metrics(); assertMetrics(metrics, "ds.first.active", "ds.first.usage", "ds.second.active", "ds.second.usage"); + } + private void assertHasMetric(Collection> 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> metrics, String... keys) { @@ -138,7 +201,7 @@ public class DataSourceMetricsAutoConfigurationTests { this.context.register(config); } this.context.register(DataSourcePoolMetadataProvidersConfiguration.class, - DataSourceMetricsAutoConfiguration.class); + PublicMetricsAutoConfiguration.class); this.context.refresh(); } @@ -198,4 +261,14 @@ public class DataSourceMetricsAutoConfigurationTests { .url("jdbc:hsqldb:mem:test").username("sa"); } + @Configuration + static class RichGaugeReaderConfig { + + @Bean + public RichGaugeReader richGaugeReader() { + return mock(RichGaugeReader.class); + } + + } + }