From 1e2d5a1382897277a0161b16984c4e705327e8d8 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Sat, 13 Oct 2018 20:47:20 +0100 Subject: [PATCH] Auto-configure Micrometer's HumioMeterRegistry Closes gh-14804 --- .../pom.xml | 5 + .../HumioMetricsExportAutoConfiguration.java | 65 ++++++++ .../metrics/export/humio/HumioProperties.java | 105 ++++++++++++ .../humio/HumioPropertiesConfigAdapter.java | 62 +++++++ .../metrics/export/humio/package-info.java | 20 +++ .../main/resources/META-INF/spring.factories | 1 + ...ioMetricsExportAutoConfigurationTests.java | 154 ++++++++++++++++++ .../HumioPropertiesConfigAdapterTests.java | 73 +++++++++ .../export/humio/HumioPropertiesTests.java | 44 +++++ .../spring-boot-dependencies/pom.xml | 5 + spring-boot-project/spring-boot-docs/pom.xml | 5 + .../appendix-application-properties.adoc | 10 ++ .../asciidoc/production-ready-features.adoc | 23 +++ 13 files changed, 572 insertions(+) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioMetricsExportAutoConfiguration.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioProperties.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesConfigAdapter.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/package-info.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioMetricsExportAutoConfigurationTests.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesConfigAdapterTests.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesTests.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml index d5be052b68..e28c020569 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml @@ -127,6 +127,11 @@ micrometer-registry-graphite true + + io.micrometer + micrometer-registry-humio + true + io.micrometer micrometer-registry-influx diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioMetricsExportAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioMetricsExportAutoConfiguration.java new file mode 100644 index 0000000000..3d173182e6 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioMetricsExportAutoConfiguration.java @@ -0,0 +1,65 @@ +/* + * Copyright 2012-2018 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.humio; + +import io.micrometer.core.instrument.Clock; +import io.micrometer.humio.HumioConfig; +import io.micrometer.humio.HumioMeterRegistry; + +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; +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.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for exporting metrics to Humio. + * + * @author Andy Wilkinson + * @since 2.1.0 + */ +@Configuration +@AutoConfigureBefore({ CompositeMeterRegistryAutoConfiguration.class, + SimpleMetricsExportAutoConfiguration.class }) +@AutoConfigureAfter(MetricsAutoConfiguration.class) +@ConditionalOnBean(Clock.class) +@ConditionalOnClass(HumioMeterRegistry.class) +@ConditionalOnProperty(prefix = "management.metrics.export.humio", name = "enabled", havingValue = "true", matchIfMissing = true) +@EnableConfigurationProperties(HumioProperties.class) +public class HumioMetricsExportAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + public HumioConfig humioConfig(HumioProperties humioProperties) { + return new HumioPropertiesConfigAdapter(humioProperties); + } + + @Bean + @ConditionalOnMissingBean + public HumioMeterRegistry humioMeterRegistry(HumioConfig humioConfig, Clock clock) { + return new HumioMeterRegistry(humioConfig, clock); + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioProperties.java new file mode 100644 index 0000000000..bb052a1ce8 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioProperties.java @@ -0,0 +1,105 @@ +/* + * Copyright 2012-2018 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.humio; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.boot.actuate.autoconfigure.metrics.export.properties.StepRegistryProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * {@link ConfigurationProperties} for configuring Humio metrics export. + * + * @author Andy Wilkinson + * @since 2.1.0 + */ +@ConfigurationProperties(prefix = "management.metrics.export.humio") +public class HumioProperties extends StepRegistryProperties { + + /** + * Humio API token. + */ + private String apiToken; + + /** + * Connection timeout for requests to Humio. + */ + private Duration connectTimeout = Duration.ofSeconds(5); + + /** + * Name of the repository to publish metrics to. + */ + private String repository = "sandbox"; + + /** + * Humio tags describing the data source in which metrics will be stored. Humio tags + * are a distinct concept from Micrometer's tags. Micrometer's tags are used to divide + * metrics along dimensional boundaries. + */ + private Map tags = new HashMap<>(); + + /** + * URI to ship metrics to. If you need to publish metrics to an internal proxy + * en-route to Humio, you can define the location of the proxy with this. + */ + private String uri = "https://cloud.humio.com"; + + public String getApiToken() { + return this.apiToken; + } + + public void setApiToken(String apiToken) { + this.apiToken = apiToken; + } + + @Override + public Duration getConnectTimeout() { + return this.connectTimeout; + } + + @Override + public void setConnectTimeout(Duration connectTimeout) { + this.connectTimeout = connectTimeout; + } + + public String getRepository() { + return this.repository; + } + + public void setRepository(String repository) { + this.repository = repository; + } + + public Map getTags() { + return this.tags; + } + + public void setTags(Map tags) { + this.tags = tags; + } + + public String getUri() { + return this.uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesConfigAdapter.java new file mode 100644 index 0000000000..2b0d6383c1 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesConfigAdapter.java @@ -0,0 +1,62 @@ +/* + * Copyright 2012-2018 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.humio; + +import java.util.Map; + +import io.micrometer.humio.HumioConfig; + +import org.springframework.boot.actuate.autoconfigure.metrics.export.properties.StepRegistryPropertiesConfigAdapter; + +/** + * Adapter to convert {@link HumioProperties} to a {@link HumioConfig}. + * + * @author Andy Wilkinson + */ +class HumioPropertiesConfigAdapter extends + StepRegistryPropertiesConfigAdapter implements HumioConfig { + + HumioPropertiesConfigAdapter(HumioProperties properties) { + super(properties); + } + + @Override + public String get(String k) { + return null; + } + + @Override + public String uri() { + return get(HumioProperties::getUri, HumioConfig.super::uri); + } + + @Override + public String repository() { + return get(HumioProperties::getRepository, HumioConfig.super::repository); + } + + @Override + public Map tags() { + return get(HumioProperties::getTags, HumioConfig.super::tags); + } + + @Override + public String apiToken() { + return get(HumioProperties::getApiToken, HumioConfig.super::apiToken); + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/package-info.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/package-info.java new file mode 100644 index 0000000000..f61d502d89 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2018 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 Humio. + */ +package org.springframework.boot.actuate.autoconfigure.metrics.export.humio; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/spring.factories index 8b5b335e12..d06c54f4ed 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/spring.factories @@ -52,6 +52,7 @@ org.springframework.boot.actuate.autoconfigure.metrics.export.dynatrace.Dynatrac org.springframework.boot.actuate.autoconfigure.metrics.export.elastic.ElasticMetricsExportAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.export.ganglia.GangliaMetricsExportAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.export.graphite.GraphiteMetricsExportAutoConfiguration,\ +org.springframework.boot.actuate.autoconfigure.metrics.export.humio.HumioMetricsExportAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.export.influx.InfluxMetricsExportAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.export.jmx.JmxMetricsExportAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.export.kairos.KairosMetricsExportAutoConfiguration,\ diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioMetricsExportAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioMetricsExportAutoConfigurationTests.java new file mode 100644 index 0000000000..b8de120fa1 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioMetricsExportAutoConfigurationTests.java @@ -0,0 +1,154 @@ +/* + * Copyright 2012-2018 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.humio; + +import java.util.Map; + +import io.micrometer.core.instrument.Clock; +import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; +import io.micrometer.humio.HumioConfig; +import io.micrometer.humio.HumioMeterRegistry; +import org.junit.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.assertj.AssertableApplicationContext; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +/** + * Tests for {@link HumioMetricsExportAutoConfiguration}. + * + * @author Andy Wilkinson + */ +public class HumioMetricsExportAutoConfigurationTests { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration( + AutoConfigurations.of(HumioMetricsExportAutoConfiguration.class)); + + @Test + public void backsOffWithoutAClock() { + this.contextRunner.run((context) -> assertThat(context) + .doesNotHaveBean(HumioMeterRegistry.class)); + } + + @Test + public void autoConfiguresConfigAndMeterRegistry() { + this.contextRunner.withUserConfiguration(BaseConfiguration.class) + .run((context) -> assertThat(context) + .hasSingleBean(HumioMeterRegistry.class) + .hasSingleBean(HumioConfig.class)); + } + + @Test + public void autoConfigurationCanBeDisabled() { + this.contextRunner.withUserConfiguration(BaseConfiguration.class) + .withPropertyValues("management.metrics.export.humio.enabled=false") + .run((context) -> assertThat(context) + .doesNotHaveBean(HumioMeterRegistry.class) + .doesNotHaveBean(HumioConfig.class)); + } + + @Test + public void allowsCustomConfigToBeUsed() { + this.contextRunner.withUserConfiguration(CustomConfigConfiguration.class) + .run((context) -> assertThat(context) + .hasSingleBean(HumioMeterRegistry.class) + .hasSingleBean(HumioConfig.class).hasBean("customConfig")); + } + + @Test + public void allowsCustomRegistryToBeUsed() { + this.contextRunner.withUserConfiguration(CustomRegistryConfiguration.class) + .run((context) -> assertThat(context) + .hasSingleBean(HumioMeterRegistry.class).hasBean("customRegistry") + .hasSingleBean(HumioConfig.class)); + } + + @Test + public void stopsMeterRegistryWhenContextIsClosed() { + this.contextRunner.withUserConfiguration(BaseConfiguration.class) + .run((context) -> { + HumioMeterRegistry registry = spyOnDisposableBean( + HumioMeterRegistry.class, context); + new JvmMemoryMetrics().bindTo(registry); + context.close(); + verify(registry).stop(); + }); + } + + @SuppressWarnings("unchecked") + private T spyOnDisposableBean(Class type, + AssertableApplicationContext context) { + String[] names = context.getBeanNamesForType(type); + assertThat(names).hasSize(1); + String registryBeanName = names[0]; + Map disposableBeans = (Map) ReflectionTestUtils + .getField(context.getAutowireCapableBeanFactory(), "disposableBeans"); + Object registryAdapter = disposableBeans.get(registryBeanName); + T registry = (T) spy(ReflectionTestUtils.getField(registryAdapter, "bean")); + ReflectionTestUtils.setField(registryAdapter, "bean", registry); + return registry; + } + + @Configuration + static class BaseConfiguration { + + @Bean + public Clock clock() { + return Clock.SYSTEM; + } + + } + + @Configuration + @Import(BaseConfiguration.class) + static class CustomConfigConfiguration { + + @Bean + public HumioConfig customConfig() { + return new HumioConfig() { + + @Override + public String get(String k) { + return null; + } + + }; + } + + } + + @Configuration + @Import(BaseConfiguration.class) + static class CustomRegistryConfiguration { + + @Bean + public HumioMeterRegistry customRegistry(HumioConfig config, Clock clock) { + return new HumioMeterRegistry(config, clock); + } + + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesConfigAdapterTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesConfigAdapterTests.java new file mode 100644 index 0000000000..fbda0bcd2b --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesConfigAdapterTests.java @@ -0,0 +1,73 @@ +/* + * Copyright 2012-2018 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.humio; + +import java.time.Duration; +import java.util.Collections; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link HumioPropertiesConfigAdapter}. + * + * @author Andy Wilkinson + */ +public class HumioPropertiesConfigAdapterTests { + + @Test + public void whenApiTokenIsSetAdapterApiTokenReturnsIt() { + HumioProperties properties = new HumioProperties(); + properties.setApiToken("ABC123"); + assertThat(new HumioPropertiesConfigAdapter(properties).apiToken()) + .isEqualTo("ABC123"); + } + + @Test + public void whenPropertiesConnecTimoueIsSetAdapterConnectTimeoutReturnsIt() { + HumioProperties properties = new HumioProperties(); + properties.setConnectTimeout(Duration.ofSeconds(10)); + assertThat(new HumioPropertiesConfigAdapter(properties).connectTimeout()) + .isEqualTo(Duration.ofSeconds(10)); + } + + @Test + public void whenPropertiesRepositoryIsSetAdapterRepositoryReturnsIt() { + HumioProperties properties = new HumioProperties(); + properties.setRepository("test"); + assertThat(new HumioPropertiesConfigAdapter(properties).repository()) + .isEqualTo("test"); + } + + @Test + public void whenPropertiesTagsIsSetAdapterTagsReturnsIt() { + HumioProperties properties = new HumioProperties(); + properties.setTags(Collections.singletonMap("name", "test")); + assertThat(new HumioPropertiesConfigAdapter(properties).tags()) + .isEqualTo(Collections.singletonMap("name", "test")); + } + + @Test + public void whenPropertiesUriIsSetAdapterUriReturnsIt() { + HumioProperties properties = new HumioProperties(); + properties.setUri("https://humio.example.com"); + assertThat(new HumioPropertiesConfigAdapter(properties).uri()) + .isEqualTo("https://humio.example.com"); + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesTests.java new file mode 100644 index 0000000000..5bda250a52 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/humio/HumioPropertiesTests.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2018 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.humio; + +import io.micrometer.humio.HumioConfig; + +import org.springframework.boot.actuate.autoconfigure.metrics.export.properties.StepRegistryPropertiesTests; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link HumioProperties}. + * + * @author Andy Wilkinson + */ +public class HumioPropertiesTests extends StepRegistryPropertiesTests { + + @Override + public void defaultValuesAreConsistent() { + HumioProperties properties = new HumioProperties(); + HumioConfig config = (key) -> null; + assertStepRegistryDefaultValues(properties, config); + assertThat(properties.getApiToken()).isEqualTo(config.apiToken()); + assertThat(properties.getRepository()).isEqualTo(config.repository()); + assertThat(properties.getTags()).isEmpty(); + assertThat(config.tags()).isNull(); + assertThat(properties.getUri()).isEqualTo(config.uri()); + } + +} diff --git a/spring-boot-project/spring-boot-dependencies/pom.xml b/spring-boot-project/spring-boot-dependencies/pom.xml index 374d0d5eda..bd2260c995 100644 --- a/spring-boot-project/spring-boot-dependencies/pom.xml +++ b/spring-boot-project/spring-boot-dependencies/pom.xml @@ -938,6 +938,11 @@ micrometer-registry-graphite ${micrometer.version} + + io.micrometer + micrometer-registry-humio + ${micrometer.version} + io.micrometer micrometer-registry-influx diff --git a/spring-boot-project/spring-boot-docs/pom.xml b/spring-boot-project/spring-boot-docs/pom.xml index 5c7c0ccc13..7bce49c9a0 100644 --- a/spring-boot-project/spring-boot-docs/pom.xml +++ b/spring-boot-project/spring-boot-docs/pom.xml @@ -236,6 +236,11 @@ micrometer-registry-graphite true + + io.micrometer + micrometer-registry-humio + true + io.micrometer micrometer-registry-influx diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 47af1609fa..029cae675e 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -1447,6 +1447,16 @@ content into your application. Rather, pick only the properties that you need. management.metrics.export.graphite.rate-units=seconds # Base time unit used to report rates. management.metrics.export.graphite.step=1m # Step size (i.e. reporting frequency) to use. management.metrics.export.graphite.tags-as-prefix= # For the default naming convention, turn the specified tag keys into part of the metric prefix. + management.metrics.export.humio.api-token= # Humio API token. + management.metrics.export.humio.batch-size=10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made. + management.metrics.export.humio.connect-timeout=5s # Connection timeout for requests to this backend. + management.metrics.export.humio.enabled=true # Whether exporting of metrics to this backend is enabled. + management.metrics.export.humio.num-threads=2 # Number of threads to use with the metrics publishing scheduler. + management.metrics.export.humio.read-timeout=10s # Read timeout for requests to this backend. + management.metrics.export.humio.repository=sandbox # Name of the repository to publish metrics to. + management.metrics.export.humio.step=1m # Step size (i.e. reporting frequency) to use. + management.metrics.export.humio.tags.*= # Humio tags describing the data source in which metrics will be stored. Humio tags are a distinct concept from Micrometer's tags. Micrometer's tags are used to divide metrics along dimensional boundaries. + management.metrics.export.humio.uri=https://cloud.humio.com # URI to ship metrics to. If you need to publish metrics to an internal proxy en-route to Humio, you can define the location of the proxy with this. management.metrics.export.influx.auto-create-db=true # Whether to create the Influx database if it does not exist before attempting to publish metrics to it. management.metrics.export.influx.batch-size=10000 # Number of measurements per request to use for this backend. If more measurements are found, then multiple requests will be made. management.metrics.export.influx.compressed=true # Whether to enable GZIP compression of metrics batches published to Influx. 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 fd6d63a262..e56781bfcd 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 @@ -1350,6 +1350,7 @@ monitoring systems, including: - <> - <> - <> +- <> - <> - <> - <> @@ -1544,6 +1545,28 @@ public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock +[[production-ready-metrics-export-humio]] +==== Humio +By default, the Humio registry pushes metrics to https://cloud.humio.com periodically. To +export metrics to SaaS {micrometer-registry-documentation}/humio[Humio], your API token +must be provided: + +[source,properties,indent=0] +---- + management.metrics.export.humio.api-token=YOUR_TOKEN +---- + +You should also configure one or more tags to identify the data source to which metrics +will be pushed: + +[source,properties,indent=0] +---- + management.metrics.export.humio.tags.alpha=a + management.metrics.export.humio.tags.bravo=b +---- + + + [[production-ready-metrics-export-influx]] ==== Influx By default, metrics are exported to {micrometer-registry-documentation}/influx[Influx]