Skip to content

Commit 79ad5e6

Browse files
committed
Merge pull request #46975 from dungdm93
* pr/46975: Polish "Auto-configure observation of Redis with Lettuce" Auto-configure observation of Redis with Lettuce Closes gh-46975
2 parents 0403810 + 871f82d commit 79ad5e6

File tree

7 files changed

+77
-124
lines changed

7 files changed

+77
-124
lines changed

documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/actuator/metrics.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,7 @@ Metrics for Jetty's javadoc:org.eclipse.jetty.server.Connector[] instances are b
10531053
[[actuator.metrics.supported.redis]]
10541054
=== Redis Metrics
10551055

1056-
Auto-configuration registers a javadoc:io.lettuce.core.metrics.MicrometerCommandLatencyRecorder[] for the auto-configured javadoc:org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory[].
1056+
Auto-configuration registers a javadoc:io.lettuce.core.tracing.MicrometerTracing[] for the auto-configured javadoc:org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory[].
10571057
For more detail, see the {url-lettuce-docs}/advanced-usage/#observability[Observability section] of the Lettuce documentation.
10581058

10591059

module/spring-boot-data-redis/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ dependencies {
5656

5757
testImplementation(project(":core:spring-boot-test"))
5858
testImplementation(project(":test-support:spring-boot-test-support"))
59+
testImplementation("io.micrometer:micrometer-observation-test")
5960
testImplementation("io.projectreactor:reactor-test")
6061

6162
testRuntimeOnly("ch.qos.logback:logback-classic")
Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,43 +14,36 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.data.redis.autoconfigure.metrics;
17+
package org.springframework.boot.data.redis.autoconfigure.observation;
1818

1919
import io.lettuce.core.RedisClient;
20-
import io.lettuce.core.metrics.MicrometerCommandLatencyRecorder;
21-
import io.lettuce.core.metrics.MicrometerOptions;
22-
import io.micrometer.core.instrument.MeterRegistry;
20+
import io.lettuce.core.tracing.MicrometerTracing;
21+
import io.micrometer.observation.ObservationRegistry;
2322

2423
import org.springframework.boot.autoconfigure.AutoConfiguration;
2524
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2625
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
27-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2826
import org.springframework.boot.data.redis.autoconfigure.ClientResourcesBuilderCustomizer;
2927
import org.springframework.boot.data.redis.autoconfigure.DataRedisAutoConfiguration;
3028
import org.springframework.context.annotation.Bean;
3129

3230
/**
33-
* Auto-configuration for Lettuce metrics.
31+
* Auto-configuration for Lettuce observability.
3432
*
3533
* @author Antonin Arquey
3634
* @author Yanming Zhou
35+
* @author Dũng Đăng Minh
3736
* @since 4.0.0
3837
*/
3938
@AutoConfiguration(before = DataRedisAutoConfiguration.class,
40-
afterName = "org.springframework.boot.micrometer.metrics.autoconfigure.CompositeMeterRegistryAutoConfiguration")
41-
@ConditionalOnClass({ RedisClient.class, MicrometerCommandLatencyRecorder.class, MeterRegistry.class })
42-
@ConditionalOnBean(MeterRegistry.class)
43-
public final class LettuceMetricsAutoConfiguration {
39+
afterName = "org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration")
40+
@ConditionalOnClass({ RedisClient.class, MicrometerTracing.class, ObservationRegistry.class })
41+
@ConditionalOnBean(ObservationRegistry.class)
42+
public final class LettuceObservationAutoConfiguration {
4443

4544
@Bean
46-
@ConditionalOnMissingBean
47-
MicrometerOptions micrometerOptions() {
48-
return MicrometerOptions.create();
49-
}
50-
51-
@Bean
52-
ClientResourcesBuilderCustomizer lettuceMetrics(MeterRegistry meterRegistry, MicrometerOptions options) {
53-
return (client) -> client.commandLatencyRecorder(new MicrometerCommandLatencyRecorder(meterRegistry, options));
45+
ClientResourcesBuilderCustomizer lettuceObservation(ObservationRegistry observationRegistry) {
46+
return (client) -> client.tracing(new MicrometerTracing(observationRegistry, "Redis"));
5447
}
5548

5649
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
*/
1616

1717
/**
18-
* Auto-configuration for Spring Data Redis metrics.
18+
* Auto-configuration for Spring Data Redis observation.
1919
*/
2020
@NullMarked
21-
package org.springframework.boot.data.redis.autoconfigure.metrics;
21+
package org.springframework.boot.data.redis.autoconfigure.observation;
2222

2323
import org.jspecify.annotations.NullMarked;

module/spring-boot-data-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ org.springframework.boot.data.redis.autoconfigure.DataRedisReactiveAutoConfigura
33
org.springframework.boot.data.redis.autoconfigure.DataRedisRepositoriesAutoConfiguration
44
org.springframework.boot.data.redis.autoconfigure.health.DataRedisHealthContributorAutoConfiguration
55
org.springframework.boot.data.redis.autoconfigure.health.DataRedisReactiveHealthContributorAutoConfiguration
6-
org.springframework.boot.data.redis.autoconfigure.metrics.LettuceMetricsAutoConfiguration
6+
org.springframework.boot.data.redis.autoconfigure.observation.LettuceObservationAutoConfiguration

module/spring-boot-data-redis/src/test/java/org/springframework/boot/data/redis/autoconfigure/metrics/LettuceMetricsAutoConfigurationTests.java

Lines changed: 0 additions & 102 deletions
This file was deleted.
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright 2012-present the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.data.redis.autoconfigure.observation;
18+
19+
import io.lettuce.core.resource.ClientResources;
20+
import io.lettuce.core.tracing.MicrometerTracing;
21+
import io.micrometer.observation.tck.TestObservationRegistry;
22+
import org.junit.jupiter.api.Test;
23+
24+
import org.springframework.boot.autoconfigure.AutoConfigurations;
25+
import org.springframework.boot.data.redis.autoconfigure.DataRedisAutoConfiguration;
26+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
27+
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
28+
29+
import static org.assertj.core.api.Assertions.assertThat;
30+
31+
/**
32+
* Tests for {@link LettuceObservationAutoConfiguration}.
33+
*
34+
* @author Antonin Arquey
35+
* @author Stephane Nicoll
36+
*/
37+
class LettuceObservationAutoConfigurationTests {
38+
39+
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
40+
.withConfiguration(AutoConfigurations.of(LettuceObservationAutoConfiguration.class));
41+
42+
@Test
43+
void whenThereIsAnObservationRegistryThenMicrometerTracingIsAdded() {
44+
this.contextRunner.withBean(TestObservationRegistry.class, TestObservationRegistry::create)
45+
.withConfiguration(AutoConfigurations.of(DataRedisAutoConfiguration.class))
46+
.run((context) -> {
47+
ClientResources clientResources = context.getBean(LettuceConnectionFactory.class).getClientResources();
48+
assertThat(clientResources.tracing()).isInstanceOf(MicrometerTracing.class);
49+
});
50+
51+
}
52+
53+
@Test
54+
void whenThereIsNoObservationRegistryThenClientResourcesCustomizationBacksOff() {
55+
this.contextRunner.withConfiguration(AutoConfigurations.of(DataRedisAutoConfiguration.class)).run((context) -> {
56+
ClientResources clientResources = context.getBean(LettuceConnectionFactory.class).getClientResources();
57+
assertThat(clientResources.tracing()).isNotInstanceOf(MicrometerTracing.class);
58+
});
59+
}
60+
61+
}

0 commit comments

Comments
 (0)