Skip to content

Commit 888a81b

Browse files
committed
Migrate Kafka metrics to KafkaClientMetrics
Closes gh-20838
1 parent 333ac27 commit 888a81b

File tree

4 files changed

+30
-29
lines changed

4 files changed

+30
-29
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ dependencies {
101101
optional("org.springframework.data:spring-data-redis")
102102
optional("org.springframework.data:spring-data-solr")
103103
optional("org.springframework.integration:spring-integration-core")
104+
optional("org.springframework.kafka:spring-kafka")
104105
optional("org.springframework.security:spring-security-config")
105106
optional("org.springframework.security:spring-security-web")
106107
optional("org.springframework.session:spring-session-core")
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2019 the original author or authors.
2+
* Copyright 2012-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,37 +18,37 @@
1818

1919
import java.util.Collections;
2020

21-
import javax.management.MBeanServer;
22-
2321
import io.micrometer.core.instrument.MeterRegistry;
24-
import io.micrometer.core.instrument.binder.kafka.KafkaConsumerMetrics;
25-
import org.apache.kafka.clients.consumer.KafkaConsumer;
22+
import io.micrometer.core.instrument.binder.kafka.KafkaClientMetrics;
2623

2724
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2825
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2926
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3027
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
31-
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
28+
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
29+
import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration;
3230
import org.springframework.context.annotation.Bean;
3331
import org.springframework.context.annotation.Configuration;
32+
import org.springframework.kafka.core.ProducerFactory;
3433

3534
/**
3635
* Auto-configuration for Kafka metrics.
3736
*
3837
* @author Andy Wilkinson
38+
* @author Stephane Nicoll
3939
* @since 2.1.0
4040
*/
4141
@Configuration(proxyBeanMethods = false)
42-
@AutoConfigureAfter({ MetricsAutoConfiguration.class, JmxAutoConfiguration.class })
43-
@ConditionalOnClass({ KafkaConsumerMetrics.class, KafkaConsumer.class })
42+
@AutoConfigureAfter({ MetricsAutoConfiguration.class, KafkaAutoConfiguration.class })
43+
@ConditionalOnClass({ KafkaClientMetrics.class, ProducerFactory.class })
4444
@ConditionalOnBean(MeterRegistry.class)
4545
public class KafkaMetricsAutoConfiguration {
4646

4747
@Bean
4848
@ConditionalOnMissingBean
49-
@ConditionalOnBean(MBeanServer.class)
50-
public KafkaConsumerMetrics kafkaConsumerMetrics(MBeanServer mbeanServer) {
51-
return new KafkaConsumerMetrics(mbeanServer, Collections.emptyList());
49+
@ConditionalOnSingleCandidate(ProducerFactory.class)
50+
public KafkaClientMetrics kafkaClientMetrics(ProducerFactory<?, ?> producerFactory) {
51+
return new KafkaClientMetrics(producerFactory.createProducer(), Collections.emptyList());
5252
}
5353

5454
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/KafkaMetricsAutoConfigurationTests.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2019 the original author or authors.
2+
* Copyright 2012-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,54 +16,54 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics;
1818

19-
import io.micrometer.core.instrument.binder.kafka.KafkaConsumerMetrics;
19+
import io.micrometer.core.instrument.binder.kafka.KafkaClientMetrics;
2020
import org.junit.jupiter.api.Test;
2121

2222
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
2323
import org.springframework.boot.autoconfigure.AutoConfigurations;
24-
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
24+
import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration;
2525
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2626
import org.springframework.context.annotation.Bean;
2727
import org.springframework.context.annotation.Configuration;
2828

2929
import static org.assertj.core.api.Assertions.assertThat;
30+
import static org.mockito.Mockito.mock;
3031

3132
/**
3233
* Tests for {@link KafkaMetricsAutoConfiguration}.
3334
*
3435
* @author Andy Wilkinson
36+
* @author Stephane Nicoll
3537
*/
3638
class KafkaMetricsAutoConfigurationTests {
3739

3840
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().with(MetricsRun.simple())
39-
.withPropertyValues("spring.jmx.enabled=true")
4041
.withConfiguration(AutoConfigurations.of(KafkaMetricsAutoConfiguration.class));
4142

4243
@Test
43-
void whenThereIsNoMBeanServerAutoConfigurationBacksOff() {
44-
this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean(KafkaConsumerMetrics.class));
44+
void whenThereIsNoProducerFactoryAutoConfigurationBacksOff() {
45+
this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean(KafkaClientMetrics.class));
4546
}
4647

4748
@Test
48-
void whenThereIsAnMBeanServerKafkaConsumerMetricsIsConfigured() {
49-
this.contextRunner.withConfiguration(AutoConfigurations.of(JmxAutoConfiguration.class))
50-
.run((context) -> assertThat(context).hasSingleBean(KafkaConsumerMetrics.class));
49+
void whenThereIsAnAProducerFactoryKafkaClientMetricsIsConfigured() {
50+
this.contextRunner.withConfiguration(AutoConfigurations.of(KafkaAutoConfiguration.class))
51+
.run((context) -> assertThat(context).hasSingleBean(KafkaClientMetrics.class));
5152
}
5253

5354
@Test
54-
void allowsCustomKafkaConsumerMetricsToBeUsed() {
55-
this.contextRunner.withConfiguration(AutoConfigurations.of(JmxAutoConfiguration.class))
56-
.withUserConfiguration(CustomKafkaConsumerMetricsConfiguration.class)
57-
.run((context) -> assertThat(context).hasSingleBean(KafkaConsumerMetrics.class)
58-
.hasBean("customKafkaConsumerMetrics"));
55+
void allowsCustomKafkaClientMetricsToBeUsed() {
56+
this.contextRunner.withConfiguration(AutoConfigurations.of(KafkaAutoConfiguration.class))
57+
.withUserConfiguration(CustomKafkaClientMetricsConfiguration.class).run((context) -> assertThat(context)
58+
.hasSingleBean(KafkaClientMetrics.class).hasBean("customKafkaClientMetrics"));
5959
}
6060

6161
@Configuration(proxyBeanMethods = false)
62-
static class CustomKafkaConsumerMetricsConfiguration {
62+
static class CustomKafkaClientMetricsConfiguration {
6363

6464
@Bean
65-
KafkaConsumerMetrics customKafkaConsumerMetrics() {
66-
return new KafkaConsumerMetrics();
65+
KafkaClientMetrics customKafkaClientMetrics() {
66+
return mock(KafkaClientMetrics.class);
6767
}
6868

6969
}

spring-boot-project/spring-boot-docs/src/docs/asciidoc/production-ready-features.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1791,7 +1791,7 @@ Spring Boot registers the following core metrics when applicable:
17911791
** Number of classes loaded/unloaded
17921792
* CPU metrics
17931793
* File descriptor metrics
1794-
* Kafka consumer metrics (<<production-ready-jmx,JMX support>> should be enabled)
1794+
* Kafka consumer metrics
17951795
* Log4j2 metrics: record the number of events logged to Log4j2 at each level
17961796
* Logback metrics: record the number of events logged to Logback at each level
17971797
* Uptime metrics: report a gauge for uptime and a fixed gauge representing the application's absolute start time

0 commit comments

Comments
 (0)