Polish "Add Stackdriver metrics export support"

See gh-19528
This commit is contained in:
Stephane Nicoll 2020-01-07 18:26:17 +01:00
parent d42256d856
commit 462442e7d2
9 changed files with 70 additions and 25 deletions

View File

@ -176,12 +176,12 @@
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-statsd</artifactId>
<artifactId>micrometer-registry-stackdriver</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-stackdriver</artifactId>
<artifactId>micrometer-registry-statsd</artifactId>
<optional>true</optional>
</dependency>
<dependency>

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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<StackdriverProperties> implements StackdriverConfig {
public class StackdriverPropertiesConfigAdapter extends StepRegistryPropertiesConfigAdapter<StackdriverProperties>
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);
}
}

View File

@ -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 {
}
}
}

View File

@ -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");
}
}

View File

@ -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());
}
}

View File

@ -1038,6 +1038,17 @@
<artifactId>lettuce-core</artifactId>
<version>${lettuce.version}</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-stackdriver</artifactId>
<version>${micrometer.version}</version>
<exclusions>
<exclusion>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-bom</artifactId>

View File

@ -1245,6 +1245,7 @@ Spring Boot Actuator provides dependency management and auto-configuration for h
- <<production-ready-metrics-export-prometheus,Prometheus>>
- <<production-ready-metrics-export-signalfx,SignalFx>>
- <<production-ready-metrics-export-simple,Simple (in-memory)>>
- <<production-ready-metrics-export-stackdriver,Stackdriver>>
- <<production-ready-metrics-export-statsd,StatsD>>
- <<production-ready-metrics-export-wavefront,Wavefront>>
@ -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.