Skip to content

Commit d8e5fa6

Browse files
committed
Polish "Upgrade to Neo4j Java Driver 6.0.0"
See spring-projectsgh-47381
1 parent 628cbe5 commit d8e5fa6

File tree

7 files changed

+139
-42
lines changed

7 files changed

+139
-42
lines changed

module/spring-boot-neo4j/build.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ dependencies {
3535
optional(project(":core:spring-boot-docker-compose"))
3636
optional(project(":core:spring-boot-testcontainers"))
3737
optional(project(":module:spring-boot-health"))
38-
optional("org.testcontainers:neo4j")
38+
optional(project(":module:spring-boot-micrometer-observation"))
3939
optional("org.neo4j.driver:neo4j-java-driver-observation-micrometer")
40+
optional("org.testcontainers:neo4j")
4041

4142
dockerTestImplementation(project(":core:spring-boot-test"))
4243
dockerTestImplementation(project(":test-support:spring-boot-docker-test-support"))
@@ -49,6 +50,7 @@ dependencies {
4950
testImplementation(project(":core:spring-boot-test"))
5051
testImplementation(project(":test-support:spring-boot-test-support"))
5152
testImplementation(testFixtures(project(":core:spring-boot-testcontainers")))
53+
testImplementation("io.micrometer:micrometer-observation-test")
5254
testImplementation("io.projectreactor:reactor-test")
5355

5456
testRuntimeOnly("ch.qos.logback:logback-classic")

module/spring-boot-neo4j/src/main/java/org/springframework/boot/neo4j/autoconfigure/Neo4jAutoConfiguration.java

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.ServiceLoader;
2525
import java.util.concurrent.TimeUnit;
2626

27-
import io.micrometer.observation.ObservationRegistry;
2827
import org.jspecify.annotations.Nullable;
2928
import org.neo4j.bolt.connection.BoltConnectionProviderFactory;
3029
import org.neo4j.driver.AuthToken;
@@ -35,7 +34,6 @@
3534
import org.neo4j.driver.Driver;
3635
import org.neo4j.driver.GraphDatabase;
3736
import org.neo4j.driver.internal.Scheme;
38-
import org.neo4j.driver.observation.micrometer.MicrometerObservationProvider;
3937

4038
import org.springframework.beans.factory.ObjectProvider;
4139
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -48,7 +46,6 @@
4846
import org.springframework.boot.neo4j.autoconfigure.Neo4jProperties.Pool;
4947
import org.springframework.boot.neo4j.autoconfigure.Neo4jProperties.Security;
5048
import org.springframework.context.annotation.Bean;
51-
import org.springframework.core.env.Environment;
5249
import org.springframework.util.Assert;
5350
import org.springframework.util.StringUtils;
5451

@@ -67,20 +64,6 @@
6764
@EnableConfigurationProperties(Neo4jProperties.class)
6865
public final class Neo4jAutoConfiguration {
6966

70-
private static final boolean HAS_DRIVER_METRICS;
71-
72-
static {
73-
boolean metricsObservationProviderFound = true;
74-
try {
75-
Class.forName("org.neo4j.driver.observation.micrometer.MicrometerObservationProvider", false,
76-
Neo4jAutoConfiguration.class.getClassLoader());
77-
}
78-
catch (ClassNotFoundException ex) {
79-
metricsObservationProviderFound = false;
80-
}
81-
HAS_DRIVER_METRICS = metricsObservationProviderFound;
82-
}
83-
8467
@Bean
8568
@ConditionalOnMissingBean(Neo4jConnectionDetails.class)
8669
PropertiesNeo4jConnectionDetails neo4jConnectionDetails(Neo4jProperties properties,
@@ -90,12 +73,11 @@ PropertiesNeo4jConnectionDetails neo4jConnectionDetails(Neo4jProperties properti
9073

9174
@Bean
9275
@ConditionalOnMissingBean
93-
Driver neo4jDriver(Neo4jProperties properties, Environment environment, Neo4jConnectionDetails connectionDetails,
94-
ObjectProvider<ConfigBuilderCustomizer> configBuilderCustomizers,
95-
ObjectProvider<ObservationRegistry> observationRegistryProvider) {
76+
Driver neo4jDriver(Neo4jProperties properties, Neo4jConnectionDetails connectionDetails,
77+
ObjectProvider<ConfigBuilderCustomizer> configBuilderCustomizers) {
9678

9779
Config config = mapDriverConfig(properties, connectionDetails,
98-
configBuilderCustomizers.orderedStream().toList(), observationRegistryProvider);
80+
configBuilderCustomizers.orderedStream().toList());
9981
AuthTokenManager authTokenManager = connectionDetails.getAuthTokenManager();
10082
if (authTokenManager != null) {
10183
return GraphDatabase.driver(connectionDetails.getUri(), authTokenManager, config);
@@ -105,10 +87,9 @@ Driver neo4jDriver(Neo4jProperties properties, Environment environment, Neo4jCon
10587
}
10688

10789
Config mapDriverConfig(Neo4jProperties properties, Neo4jConnectionDetails connectionDetails,
108-
List<ConfigBuilderCustomizer> customizers,
109-
ObjectProvider<ObservationRegistry> observationRegistryProvider) {
90+
List<ConfigBuilderCustomizer> customizers) {
11091
Config.ConfigBuilder builder = Config.builder();
111-
configurePoolSettings(builder, properties.getPool(), observationRegistryProvider);
92+
configurePoolSettings(builder, properties.getPool());
11293
URI uri = connectionDetails.getUri();
11394
String scheme = (uri != null) ? uri.getScheme() : "bolt";
11495
configureDriverSettings(builder, properties, isSimpleScheme(scheme));
@@ -126,8 +107,7 @@ private boolean isSimpleScheme(String scheme) {
126107
return !Scheme.isSecurityScheme(lowerCaseScheme);
127108
}
128109

129-
private void configurePoolSettings(Config.ConfigBuilder builder, Pool pool,
130-
ObjectProvider<ObservationRegistry> observationRegistryProvider) {
110+
private void configurePoolSettings(Config.ConfigBuilder builder, Pool pool) {
131111
if (pool.isLogLeakedSessions()) {
132112
builder.withLeakedSessionsLogging();
133113
}
@@ -139,11 +119,6 @@ private void configurePoolSettings(Config.ConfigBuilder builder, Pool pool,
139119
builder.withMaxConnectionLifetime(pool.getMaxConnectionLifetime().toMillis(), TimeUnit.MILLISECONDS);
140120
builder.withConnectionAcquisitionTimeout(pool.getConnectionAcquisitionTimeout().toMillis(),
141121
TimeUnit.MILLISECONDS);
142-
observationRegistryProvider.ifAvailable((orp) -> {
143-
if (pool.isMetricsEnabled() && HAS_DRIVER_METRICS) {
144-
builder.withObservationProvider(MicrometerObservationProvider.builder(orp).build());
145-
}
146-
});
147122
}
148123

149124
private void configureDriverSettings(Config.ConfigBuilder builder, Neo4jProperties properties,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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.neo4j.autoconfigure.observation;
18+
19+
import io.micrometer.observation.Observation;
20+
import io.micrometer.observation.ObservationRegistry;
21+
import org.neo4j.driver.Config.ConfigBuilder;
22+
import org.neo4j.driver.observation.micrometer.MicrometerObservationProvider;
23+
24+
import org.springframework.boot.autoconfigure.AutoConfiguration;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
26+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
27+
import org.springframework.boot.neo4j.autoconfigure.ConfigBuilderCustomizer;
28+
import org.springframework.boot.neo4j.autoconfigure.Neo4jAutoConfiguration;
29+
import org.springframework.context.annotation.Bean;
30+
31+
/**
32+
* Auto-configuration for Neo4j observability.
33+
*
34+
* @author Stephane Nicoll
35+
* @since 4.0.0
36+
*/
37+
@AutoConfiguration(before = Neo4jAutoConfiguration.class,
38+
afterName = "org.springframework.boot.micrometer.observation.autoconfigure.ObservationAutoConfiguration")
39+
@ConditionalOnBean(ObservationRegistry.class)
40+
@ConditionalOnClass({ ConfigBuilder.class, MicrometerObservationProvider.class, Observation.class })
41+
public final class Neo4jObservationAutoConfiguration {
42+
43+
@Bean
44+
@ConditionalOnBean(ObservationRegistry.class)
45+
ConfigBuilderCustomizer neo4jObservationCustomizer(ObservationRegistry registry) {
46+
return (builder) -> builder.withObservationProvider(MicrometerObservationProvider.builder(registry).build());
47+
}
48+
49+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
/**
18+
* Auto-configuration for Neo4j observation.
19+
*/
20+
@NullMarked
21+
package org.springframework.boot.neo4j.autoconfigure.observation;
22+
23+
import org.jspecify.annotations.NullMarked;
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
org.springframework.boot.neo4j.autoconfigure.Neo4jAutoConfiguration
22
org.springframework.boot.neo4j.autoconfigure.health.Neo4jHealthContributorAutoConfiguration
3+
org.springframework.boot.neo4j.autoconfigure.observation.Neo4jObservationAutoConfiguration

module/spring-boot-neo4j/src/test/java/org/springframework/boot/neo4j/autoconfigure/Neo4jAutoConfigurationTests.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
import java.net.URI;
2222
import java.time.Duration;
2323
import java.util.Arrays;
24-
import java.util.stream.Stream;
2524

26-
import io.micrometer.observation.ObservationRegistry;
2725
import org.junit.jupiter.api.Test;
2826
import org.junit.jupiter.api.io.TempDir;
2927
import org.junit.jupiter.params.ParameterizedTest;
@@ -34,7 +32,6 @@
3432
import org.neo4j.driver.Config.ConfigBuilder;
3533
import org.neo4j.driver.Driver;
3634

37-
import org.springframework.beans.factory.ObjectProvider;
3835
import org.springframework.boot.autoconfigure.AutoConfigurations;
3936
import org.springframework.boot.context.properties.source.InvalidConfigurationPropertyValueException;
4037
import org.springframework.boot.neo4j.autoconfigure.Neo4jAutoConfiguration.PropertiesNeo4jConnectionDetails;
@@ -320,13 +317,7 @@ void securityWithTrustSystemCertificates() {
320317

321318
private Config mapDriverConfig(Neo4jProperties properties, ConfigBuilderCustomizer... customizers) {
322319
return new Neo4jAutoConfiguration().mapDriverConfig(properties,
323-
new PropertiesNeo4jConnectionDetails(properties, null), Arrays.asList(customizers),
324-
new ObjectProvider<>() {
325-
@Override
326-
public Stream<ObservationRegistry> stream() {
327-
return Stream.empty();
328-
}
329-
});
320+
new PropertiesNeo4jConnectionDetails(properties, null), Arrays.asList(customizers));
330321
}
331322

332323
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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.neo4j.autoconfigure.observation;
18+
19+
import io.micrometer.observation.tck.TestObservationRegistry;
20+
import org.junit.jupiter.api.Test;
21+
import org.neo4j.driver.Driver;
22+
import org.neo4j.driver.internal.observation.NoopObservationProvider;
23+
import org.neo4j.driver.observation.micrometer.MicrometerObservationProvider;
24+
25+
import org.springframework.boot.autoconfigure.AutoConfigurations;
26+
import org.springframework.boot.neo4j.autoconfigure.Neo4jAutoConfiguration;
27+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
28+
29+
import static org.assertj.core.api.Assertions.assertThat;
30+
31+
/**
32+
* Tests for {@link Neo4jObservationAutoConfiguration}.
33+
*
34+
* @author Stephane Nicoll
35+
*/
36+
class Neo4jObservationAutoConfigurationTests {
37+
38+
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
39+
.withConfiguration(AutoConfigurations.of(Neo4jObservationAutoConfiguration.class));
40+
41+
@Test
42+
void whenThereIsAnObservationRegistryThenMicrometerObservationProviderIsAdded() {
43+
this.contextRunner.withBean(TestObservationRegistry.class, TestObservationRegistry::create)
44+
.withConfiguration(AutoConfigurations.of(Neo4jAutoConfiguration.class))
45+
.run((context) -> assertThat(context.getBean(Driver.class)).extracting("observationProvider")
46+
.isInstanceOf(MicrometerObservationProvider.class));
47+
}
48+
49+
@Test
50+
void whenThereIsNoObservationRegistryThenConfigBuilderCustomizationBacksOff() {
51+
this.contextRunner.withConfiguration(AutoConfigurations.of(Neo4jAutoConfiguration.class))
52+
.run((context) -> assertThat(context.getBean(Driver.class)).extracting("observationProvider")
53+
.isInstanceOf(NoopObservationProvider.class));
54+
}
55+
56+
}

0 commit comments

Comments
 (0)