diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml index 4068c27685d..aa824b2ae10 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml @@ -176,12 +176,12 @@ io.micrometer - micrometer-registry-statsd + micrometer-registry-stackdriver true io.micrometer - micrometer-registry-stackdriver + micrometer-registry-statsd true diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverMetricsExportAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverMetricsExportAutoConfiguration.java index 458892d87a9..b3d9a20a3fe 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverMetricsExportAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverMetricsExportAutoConfiguration.java @@ -19,6 +19,7 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.stackdrive import io.micrometer.core.instrument.Clock; import io.micrometer.stackdriver.StackdriverConfig; import io.micrometer.stackdriver.StackdriverMeterRegistry; + import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; @@ -34,9 +35,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** - * {@link EnableAutoConfiguration Auto-configuration} for exporting metrics to Stackdriver. + * {@link EnableAutoConfiguration Auto-configuration} for exporting metrics to + * Stackdriver. * * @author Johannes Graf + * @author Stephane Nicoll + * @since 2.3.0 */ @Configuration(proxyBeanMethods = false) @AutoConfigureBefore({ CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class }) @@ -44,10 +48,10 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnBean(Clock.class) @ConditionalOnClass(StackdriverMeterRegistry.class) @ConditionalOnProperty(prefix = "management.metrics.export.stackdriver", name = "enabled", havingValue = "true", - matchIfMissing = true -) + matchIfMissing = true) @EnableConfigurationProperties(StackdriverProperties.class) public class StackdriverMetricsExportAutoConfiguration { + private final StackdriverProperties properties; public StackdriverMetricsExportAutoConfiguration(StackdriverProperties stackdriverProperties) { @@ -62,9 +66,8 @@ public class StackdriverMetricsExportAutoConfiguration { @Bean @ConditionalOnMissingBean - public StackdriverMeterRegistry StackdriverMeterRegistry(StackdriverConfig stackdriverConfig, Clock clock) { - return StackdriverMeterRegistry.builder(stackdriverConfig) - .clock(clock) - .build(); + public StackdriverMeterRegistry stackdriverMeterRegistry(StackdriverConfig stackdriverConfig, Clock clock) { + return StackdriverMeterRegistry.builder(stackdriverConfig).clock(clock).build(); } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverProperties.java index 944a2437d2a..07c66682443 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverProperties.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverProperties.java @@ -19,28 +19,29 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.stackdrive import org.springframework.boot.actuate.autoconfigure.metrics.export.properties.StepRegistryProperties; import org.springframework.boot.context.properties.ConfigurationProperties; - /** - * {@link ConfigurationProperties @ConfigurationProperties} for configuring Stackdriver metrics - * export. + * {@link ConfigurationProperties @ConfigurationProperties} for configuring Stackdriver + * metrics export. * * @author Johannes Graf + * @author Stephane Nicoll + * @since 2.3.0 */ @ConfigurationProperties(prefix = "management.metrics.export.stackdriver") public class StackdriverProperties extends StepRegistryProperties { /** - * The ID of your google cloud platform project + * Identifier of the Google Cloud project to monitor. */ private String projectId; /** - * The resource type of the metrics + * Monitored resource type. */ private String resourceType = "global"; public String getProjectId() { - return projectId; + return this.projectId; } public void setProjectId(String projectId) { @@ -48,10 +49,11 @@ public class StackdriverProperties extends StepRegistryProperties { } public String getResourceType() { - return resourceType; + return this.resourceType; } public void setResourceType(String resourceType) { this.resourceType = resourceType; } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesConfigAdapter.java index ce605e8133f..9b14af43f7b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesConfigAdapter.java @@ -17,14 +17,17 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.stackdriver; import io.micrometer.stackdriver.StackdriverConfig; + import org.springframework.boot.actuate.autoconfigure.metrics.export.properties.StepRegistryPropertiesConfigAdapter; /** * Adapter to convert {@link StackdriverProperties} to a {@link StackdriverConfig}. * * @author Johannes Graf + * @since 2.3.0 */ -public class StackdriverPropertiesConfigAdapter extends StepRegistryPropertiesConfigAdapter implements StackdriverConfig { +public class StackdriverPropertiesConfigAdapter extends StepRegistryPropertiesConfigAdapter + implements StackdriverConfig { public StackdriverPropertiesConfigAdapter(StackdriverProperties properties) { super(properties); @@ -39,4 +42,5 @@ public class StackdriverPropertiesConfigAdapter extends StepRegistryPropertiesCo public String resourceType() { return get(StackdriverProperties::getResourceType, StackdriverConfig.super::resourceType); } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverMetricsExportAutoConfigurationTest.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverMetricsExportAutoConfigurationTest.java index 46f3183f80f..ae9182774e8 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverMetricsExportAutoConfigurationTest.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverMetricsExportAutoConfigurationTest.java @@ -20,6 +20,7 @@ import io.micrometer.core.instrument.Clock; import io.micrometer.stackdriver.StackdriverConfig; import io.micrometer.stackdriver.StackdriverMeterRegistry; import org.junit.jupiter.api.Test; + import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; @@ -52,7 +53,7 @@ class StackdriverMetricsExportAutoConfigurationTest { @Test void autoConfiguresConfigAndMeterRegistry() { this.contextRunner.withUserConfiguration(BaseConfiguration.class) - .withPropertyValues("management.metrics.export.stackdriver.project-id=qwert") + .withPropertyValues("management.metrics.export.stackdriver.project-id=test-project") .run((context) -> assertThat(context).hasSingleBean(StackdriverMeterRegistry.class) .hasSingleBean(StackdriverConfig.class)); } @@ -67,14 +68,15 @@ class StackdriverMetricsExportAutoConfigurationTest { @Test void allowsCustomConfigToBeUsed() { - this.contextRunner.withUserConfiguration(CustomConfigConfiguration.class).run((context) -> assertThat(context) - .hasSingleBean(StackdriverMeterRegistry.class).hasSingleBean(StackdriverConfig.class).hasBean("customConfig")); + this.contextRunner.withUserConfiguration(CustomConfigConfiguration.class) + .run((context) -> assertThat(context).hasSingleBean(StackdriverMeterRegistry.class) + .hasSingleBean(StackdriverConfig.class).hasBean("customConfig")); } @Test void allowsCustomRegistryToBeUsed() { this.contextRunner.withUserConfiguration(CustomRegistryConfiguration.class) - .withPropertyValues("management.metrics.export.stackdriver.project-id=qwert") + .withPropertyValues("management.metrics.export.stackdriver.project-id=test-project") .run((context) -> assertThat(context).hasSingleBean(StackdriverMeterRegistry.class) .hasBean("customRegistry").hasSingleBean(StackdriverConfig.class)); } @@ -82,7 +84,7 @@ class StackdriverMetricsExportAutoConfigurationTest { @Test void stopsMeterRegistryWhenContextIsClosed() { this.contextRunner.withUserConfiguration(BaseConfiguration.class) - .withPropertyValues("management.metrics.export.stackdriver.project-id=qwert").run((context) -> { + .withPropertyValues("management.metrics.export.stackdriver.project-id=test-project").run((context) -> { StackdriverMeterRegistry registry = context.getBean(StackdriverMeterRegistry.class); assertThat(registry.isClosed()).isFalse(); context.close(); @@ -108,7 +110,7 @@ class StackdriverMetricsExportAutoConfigurationTest { StackdriverConfig customConfig() { return (key) -> { if ("stackdriver.projectId".equals(key)) { - return "qwert"; + return "test-project"; } return null; }; @@ -126,4 +128,5 @@ class StackdriverMetricsExportAutoConfigurationTest { } } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesConfigAdapterTest.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesConfigAdapterTest.java index c48aa14c35e..6eb3650e963 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesConfigAdapterTest.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesConfigAdapterTest.java @@ -16,7 +16,6 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.stackdriver; - import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -34,10 +33,12 @@ class StackdriverPropertiesConfigAdapterTest { properties.setProjectId("my-gcp-project-id"); assertThat(new StackdriverPropertiesConfigAdapter(properties).projectId()).isEqualTo("my-gcp-project-id"); } + @Test void whenPropertiesResourceTypeIsSetAdapterResourceTypeReturnsIt() { StackdriverProperties properties = new StackdriverProperties(); properties.setResourceType("my-resource-type"); assertThat(new StackdriverPropertiesConfigAdapter(properties).resourceType()).isEqualTo("my-resource-type"); } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesTest.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesTest.java index 98a6a981d08..89c16cb9c0d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesTest.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/stackdriver/StackdriverPropertiesTest.java @@ -16,9 +16,9 @@ package org.springframework.boot.actuate.autoconfigure.metrics.export.stackdriver; - import io.micrometer.stackdriver.StackdriverConfig; import org.junit.jupiter.api.Test; + import org.springframework.boot.actuate.autoconfigure.metrics.export.properties.StepRegistryPropertiesTests; import static org.assertj.core.api.Assertions.assertThat; @@ -37,4 +37,5 @@ class StackdriverPropertiesTest extends StepRegistryPropertiesTests { assertStepRegistryDefaultValues(properties, config); assertThat(properties.getResourceType()).isEqualTo(config.resourceType()); } + } diff --git a/spring-boot-project/spring-boot-dependencies/pom.xml b/spring-boot-project/spring-boot-dependencies/pom.xml index 38c72904ff1..ce2763d9eb5 100644 --- a/spring-boot-project/spring-boot-dependencies/pom.xml +++ b/spring-boot-project/spring-boot-dependencies/pom.xml @@ -1038,6 +1038,17 @@ lettuce-core ${lettuce.version} + + io.micrometer + micrometer-registry-stackdriver + ${micrometer.version} + + + javax.annotation + javax.annotation-api + + + io.micrometer micrometer-bom diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc index 24fd61b0322..1537c2f4f6d 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc @@ -1245,6 +1245,7 @@ Spring Boot Actuator provides dependency management and auto-configuration for h - <> - <> - <> +- <> - <> - <> @@ -1584,6 +1585,25 @@ You can also disable it explicitly: +[[production-ready-metrics-export-stackdriver]] +==== Stackdriver +Stackdriver registry pushes metrics to https://cloud.google.com/stackdriver/[Stackdriver] periodically. +To export metrics to SaaS {micrometer-registry-docs}/stackdriver[Stackdriver], your Google Cloud project id must be provided: + +[source,properties,indent=0,configprops] +---- + management.metrics.export.stackdriver.project-id=my-project +---- + +You can also change the interval at which metrics are sent to Stackdriver: + +[source,properties,indent=0,configprops] +---- + management.metrics.export.stackdriver.step=30s +---- + + + [[production-ready-metrics-export-statsd]] ==== StatsD The StatsD registry pushes metrics over UDP to a StatsD agent eagerly.