Add auto-configuration for exporting metrics to StatsD

Closes gh-10522
This commit is contained in:
Jon Schneider 2017-10-04 22:20:30 -05:00 committed by Andy Wilkinson
parent ff636b58e1
commit e2453a17c7
8 changed files with 336 additions and 2 deletions

View File

@ -122,6 +122,11 @@
<artifactId>micrometer-registry-prometheus</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-statsd</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>

View File

@ -36,6 +36,7 @@ import org.springframework.boot.actuate.autoconfigure.metrics.export.influx.Infl
import org.springframework.boot.actuate.autoconfigure.metrics.export.jmx.JmxExportConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus.PrometheusExportConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleExportConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.export.statsd.StatsdExportConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.reactive.server.WebFluxMetricsConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.web.client.RestTemplateMetricsConfiguration;
import org.springframework.boot.actuate.autoconfigure.metrics.web.servlet.WebMvcMetricsConfiguration;
@ -67,7 +68,8 @@ import org.springframework.integration.support.management.IntegrationManagementC
AtlasExportConfiguration.class, DatadogExportConfiguration.class,
GangliaExportConfiguration.class, GraphiteExportConfiguration.class,
InfluxExportConfiguration.class, JmxExportConfiguration.class,
PrometheusExportConfiguration.class, SimpleExportConfiguration.class })
PrometheusExportConfiguration.class, SimpleExportConfiguration.class,
StatsdExportConfiguration.class })
public class MetricsAutoConfiguration {
@Bean

View File

@ -0,0 +1,63 @@
/*
* Copyright 2012-2017 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.metrics.export.statsd;
import io.micrometer.core.instrument.Clock;
import io.micrometer.statsd.StatsdConfig;
import io.micrometer.statsd.StatsdMeterRegistry;
import org.springframework.boot.actuate.autoconfigure.metrics.export.MetricsExporter;
import org.springframework.boot.actuate.autoconfigure.metrics.export.StringToDurationConverter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* Configuration for exporting metrics to StatsD.
*
* @author Jon Schneider
* @since 2.0.0
*/
@Configuration
@ConditionalOnClass(StatsdMeterRegistry.class)
@Import(StringToDurationConverter.class)
@EnableConfigurationProperties(StatsdProperties.class)
public class StatsdExportConfiguration {
@Bean
@ConditionalOnMissingBean(StatsdConfig.class)
public StatsdConfig statsdConfig(StatsdProperties statsdProperties) {
return new StatsdPropertiesConfigAdapter(statsdProperties);
}
@Bean
@ConditionalOnProperty(value = "spring.metrics.statsd.enabled", matchIfMissing = true)
public MetricsExporter statsdExporter(StatsdConfig statsdConfig, Clock clock) {
return () -> new StatsdMeterRegistry(statsdConfig, clock);
}
@Bean
@ConditionalOnMissingBean
public Clock micrometerClock() {
return Clock.SYSTEM;
}
}

View File

@ -0,0 +1,157 @@
/*
* Copyright 2012-2017 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.metrics.export.statsd;
import java.time.Duration;
import io.micrometer.statsd.StatsdFlavor;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* {@link ConfigurationProperties} for configuring StatsD metrics export.
*
* @author Jon Schneider
* @since 2.0.0
*/
@ConfigurationProperties(prefix = "spring.metrics.statsd")
public class StatsdProperties {
/**
* Enable publishing to the backend.
*/
private Boolean enabled = true;
/**
* Variant of the StatsD line protocol to use.
*/
private StatsdFlavor flavor = StatsdFlavor.Datadog;
/**
* Host name of the StatsD agent.
*/
private String host = "localhost";
/**
* UDP port of the StatsD agent.
*/
private Integer port = 8125;
/**
* Total length of a single payload should be kept within your network's MTU.
*/
private Integer maxPacketLength = 1400;
/**
* Determines how often gauges will be polled. When a gauge is polled, its value is
* recalculated. If the value has changed, it is sent to the StatsD server.
*/
private Duration pollingFrequency = Duration.ofSeconds(10);
/**
* Governs the maximum size of the queue of items waiting to be sent to a StatsD agent
* over UDP.
*/
private Integer queueSize = Integer.MAX_VALUE;
/**
* Used to create a bucket filter clamping the bucket domain of timer percentiles
* histograms to some max value. This is used to limit the number of buckets shipped
* to StatsD to save on storage.
*/
private Duration timerPercentilesMax = Duration.ofMinutes(2);
/**
* Used to create a bucket filter clamping the bucket domain of timer percentiles
* histograms to some min value. This is used to limit the number of buckets shipped
* to StatsD to save on storage.
*/
private Duration timerPercentilesMin = Duration.ofMillis(10);
public Duration getTimerPercentilesMax() {
return this.timerPercentilesMax;
}
public void setTimerPercentilesMax(Duration timerPercentilesMax) {
this.timerPercentilesMax = timerPercentilesMax;
}
public Duration getTimerPercentilesMin() {
return this.timerPercentilesMin;
}
public void setTimerPercentilesMin(Duration timerPercentilesMin) {
this.timerPercentilesMin = timerPercentilesMin;
}
public Boolean getEnabled() {
return this.enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public StatsdFlavor getFlavor() {
return this.flavor;
}
public void setFlavor(StatsdFlavor flavor) {
this.flavor = flavor;
}
public String getHost() {
return this.host;
}
public void setHost(String host) {
this.host = host;
}
public Integer getPort() {
return this.port;
}
public void setPort(Integer port) {
this.port = port;
}
public Integer getMaxPacketLength() {
return this.maxPacketLength;
}
public void setMaxPacketLength(Integer maxPacketLength) {
this.maxPacketLength = maxPacketLength;
}
public Duration getPollingFrequency() {
return this.pollingFrequency;
}
public void setPollingFrequency(Duration pollingFrequency) {
this.pollingFrequency = pollingFrequency;
}
public Integer getQueueSize() {
return this.queueSize;
}
public void setQueueSize(Integer queueSize) {
this.queueSize = queueSize;
}
}

View File

@ -0,0 +1,81 @@
/*
* Copyright 2012-2017 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.metrics.export.statsd;
import java.time.Duration;
import io.micrometer.statsd.StatsdConfig;
import io.micrometer.statsd.StatsdFlavor;
import org.springframework.boot.actuate.autoconfigure.metrics.export.PropertiesConfigAdapter;
/**
* Adapter to convert {@link StatsdProperties} to a {@link StatsdConfig}.
*
* @author Jon Schneider
* @since 2.0.0
*/
public class StatsdPropertiesConfigAdapter extends
PropertiesConfigAdapter<StatsdProperties, StatsdConfig> implements StatsdConfig {
private static final StatsdConfig DEFAULTS = (key) -> null;
public StatsdPropertiesConfigAdapter(StatsdProperties properties) {
super(properties, DEFAULTS);
}
@Override
public String get(String s) {
return null;
}
@Override
public StatsdFlavor flavor() {
return get(StatsdProperties::getFlavor, StatsdConfig::flavor);
}
@Override
public boolean enabled() {
return get(StatsdProperties::getEnabled, StatsdConfig::enabled);
}
@Override
public String host() {
return get(StatsdProperties::getHost, StatsdConfig::host);
}
@Override
public int port() {
return get(StatsdProperties::getPort, StatsdConfig::port);
}
@Override
public int maxPacketLength() {
return get(StatsdProperties::getMaxPacketLength, StatsdConfig::maxPacketLength);
}
@Override
public Duration pollingFrequency() {
return get(StatsdProperties::getPollingFrequency, StatsdConfig::pollingFrequency);
}
@Override
public int queueSize() {
return get(StatsdProperties::getQueueSize, StatsdConfig::queueSize);
}
}

View File

@ -0,0 +1,20 @@
/*
* Copyright 2012-2017 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.
*/
/**
* Support for exporting actuator metrics to StatsD.
*/
package org.springframework.boot.actuate.autoconfigure.metrics.export.statsd;

View File

@ -45,7 +45,8 @@ public class SimpleExportConfigurationTests {
"spring.metrics.graphite.enabled=false",
"spring.metrics.influx.enabled=false",
"spring.metrics.jmx.enabled=false",
"spring.metrics.prometheus.enabled=false")
"spring.metrics.prometheus.enabled=false",
"spring.metrics.statsd.enabled=false")
.withConfiguration(AutoConfigurations.of(MetricsAutoConfiguration.class))
.run((context) -> {
CompositeMeterRegistry meterRegistry = context

View File

@ -942,6 +942,11 @@
<artifactId>micrometer-registry-prometheus</artifactId>
<version>${micrometer.version}</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-statsd</artifactId>
<version>${micrometer.version}</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-bom</artifactId>