From 977f8b447924ddfcd937cb7a35dcb384f25ed3ba Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 21 Sep 2018 19:55:10 +0100 Subject: [PATCH] Auto-configure Micrometer's Kafka consumer metrics Closes gh-14525 --- .../pom.xml | 5 ++ .../KafkaMetricsAutoConfiguration.java | 54 +++++++++++++ .../main/resources/META-INF/spring.factories | 1 + .../KafkaMetricsAutoConfigurationTests.java | 76 +++++++++++++++++++ .../asciidoc/production-ready-features.adoc | 1 + 5 files changed, 137 insertions(+) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/KafkaMetricsAutoConfiguration.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/KafkaMetricsAutoConfigurationTests.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml index b54069cad6..f5ffd7cb56 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml @@ -198,6 +198,11 @@ commons-dbcp2 true + + org.apache.kafka + kafka-clients + true + org.apache.logging.log4j log4j-core diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/KafkaMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/KafkaMetricsAutoConfiguration.java new file mode 100644 index 0000000000..0478021dbf --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/KafkaMetricsAutoConfiguration.java @@ -0,0 +1,54 @@ +/* + * 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; + +import java.util.Collections; + +import javax.management.MBeanServer; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.binder.kafka.KafkaConsumerMetrics; +import org.apache.kafka.clients.consumer.KafkaConsumer; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +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.jmx.JmxAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Auto-configuration for Kafka metrics. + * + * @author Andy Wilkinson + * @since 2.1.0 + */ +@Configuration +@AutoConfigureAfter({ MetricsAutoConfiguration.class, JmxAutoConfiguration.class }) +@ConditionalOnClass({ KafkaConsumerMetrics.class, KafkaConsumer.class }) +@ConditionalOnBean(MeterRegistry.class) +public class KafkaMetricsAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + @ConditionalOnBean(MBeanServer.class) + public KafkaConsumerMetrics kafkaConsumerMetrics(MBeanServer mbeanServer) { + return new KafkaConsumerMetrics(mbeanServer, Collections.emptyList()); + } + +} 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 0ab29f3800..594ce0c289 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 @@ -35,6 +35,7 @@ org.springframework.boot.actuate.autoconfigure.management.HeapDumpWebEndpointAut org.springframework.boot.actuate.autoconfigure.management.ThreadDumpEndpointAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.JvmMetricsAutoConfiguration,\ +org.springframework.boot.actuate.autoconfigure.metrics.KafkaMetricsAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.Log4J2MetricsAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.LogbackMetricsAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration,\ diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/KafkaMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/KafkaMetricsAutoConfigurationTests.java new file mode 100644 index 0000000000..227eb3cb1a --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/KafkaMetricsAutoConfigurationTests.java @@ -0,0 +1,76 @@ +/* + * 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; + +import io.micrometer.core.instrument.binder.kafka.KafkaConsumerMetrics; +import org.junit.Test; + +import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link KafkaMetricsAutoConfiguration}. + * + * @author Andy Wilkinson + */ +public class KafkaMetricsAutoConfigurationTests { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .with(MetricsRun.simple()).withConfiguration( + AutoConfigurations.of(KafkaMetricsAutoConfiguration.class)); + + @Test + public void whenThereIsNoMBeanServerAutoConfigurationBacksOff() { + this.contextRunner.run((context) -> assertThat(context) + .doesNotHaveBean(KafkaConsumerMetrics.class)); + } + + @Test + public void whenThereIsAnMBeanServerKafkaConsumerMetricsIsConfigured() { + this.contextRunner + .withConfiguration(AutoConfigurations.of(JmxAutoConfiguration.class)) + .run((context) -> assertThat(context) + .hasSingleBean(KafkaConsumerMetrics.class)); + } + + @Test + public void allowsCustomKafkaConsumerMetricsToBeUsed() { + this.contextRunner + .withConfiguration(AutoConfigurations.of(JmxAutoConfiguration.class)) + .withUserConfiguration(CustomKafkaConsumerMetricsConfiguration.class) + .run((context) -> assertThat(context) + .hasSingleBean(KafkaConsumerMetrics.class) + .hasBean("customKafkaConsumerMetrics")); + } + + @Configuration + static class CustomKafkaConsumerMetricsConfiguration { + + @Bean + public KafkaConsumerMetrics customKafkaConsumerMetrics() { + return new KafkaConsumerMetrics(); + } + + } + +} 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 bd62675ae4..7ff09963df 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 @@ -1707,6 +1707,7 @@ Spring Boot registers the following core metrics when applicable: ** Number of classes loaded/unloaded * CPU metrics * File descriptor metrics +* Kafka consumer metrics * Log4j2 metrics: record the number of events logged to Log4j2 at each level * Logback metrics: record the number of events logged to Logback at each level * Uptime metrics: report a gauge for uptime and a fixed gauge representing the