Skip to content

Commit 628cbe5

Browse files
meistermeiersnicoll
authored andcommitted
Upgrade to Neo4j Java Driver 6.0.0
See spring-projectsgh-47381 Signed-off-by: Gerrit Meier <[email protected]>
1 parent 1bf3d09 commit 628cbe5

File tree

6 files changed

+49
-142
lines changed

6 files changed

+49
-142
lines changed

module/spring-boot-neo4j/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ dependencies {
3636
optional(project(":core:spring-boot-testcontainers"))
3737
optional(project(":module:spring-boot-health"))
3838
optional("org.testcontainers:neo4j")
39+
optional("org.neo4j.driver:neo4j-java-driver-observation-micrometer")
3940

4041
dockerTestImplementation(project(":core:spring-boot-test"))
4142
dockerTestImplementation(project(":test-support:spring-boot-docker-test-support"))

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

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@
2121
import java.time.Duration;
2222
import java.util.List;
2323
import java.util.Locale;
24+
import java.util.ServiceLoader;
2425
import java.util.concurrent.TimeUnit;
2526

27+
import io.micrometer.observation.ObservationRegistry;
2628
import org.jspecify.annotations.Nullable;
29+
import org.neo4j.bolt.connection.BoltConnectionProviderFactory;
2730
import org.neo4j.driver.AuthToken;
2831
import org.neo4j.driver.AuthTokenManager;
2932
import org.neo4j.driver.AuthTokens;
@@ -32,6 +35,7 @@
3235
import org.neo4j.driver.Driver;
3336
import org.neo4j.driver.GraphDatabase;
3437
import org.neo4j.driver.internal.Scheme;
38+
import org.neo4j.driver.observation.micrometer.MicrometerObservationProvider;
3539

3640
import org.springframework.beans.factory.ObjectProvider;
3741
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -63,6 +67,20 @@
6367
@EnableConfigurationProperties(Neo4jProperties.class)
6468
public final class Neo4jAutoConfiguration {
6569

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+
6684
@Bean
6785
@ConditionalOnMissingBean(Neo4jConnectionDetails.class)
6886
PropertiesNeo4jConnectionDetails neo4jConnectionDetails(Neo4jProperties properties,
@@ -73,10 +91,11 @@ PropertiesNeo4jConnectionDetails neo4jConnectionDetails(Neo4jProperties properti
7391
@Bean
7492
@ConditionalOnMissingBean
7593
Driver neo4jDriver(Neo4jProperties properties, Environment environment, Neo4jConnectionDetails connectionDetails,
76-
ObjectProvider<ConfigBuilderCustomizer> configBuilderCustomizers) {
94+
ObjectProvider<ConfigBuilderCustomizer> configBuilderCustomizers,
95+
ObjectProvider<ObservationRegistry> observationRegistryProvider) {
7796

7897
Config config = mapDriverConfig(properties, connectionDetails,
79-
configBuilderCustomizers.orderedStream().toList());
98+
configBuilderCustomizers.orderedStream().toList(), observationRegistryProvider);
8099
AuthTokenManager authTokenManager = connectionDetails.getAuthTokenManager();
81100
if (authTokenManager != null) {
82101
return GraphDatabase.driver(connectionDetails.getUri(), authTokenManager, config);
@@ -86,29 +105,29 @@ Driver neo4jDriver(Neo4jProperties properties, Environment environment, Neo4jCon
86105
}
87106

88107
Config mapDriverConfig(Neo4jProperties properties, Neo4jConnectionDetails connectionDetails,
89-
List<ConfigBuilderCustomizer> customizers) {
108+
List<ConfigBuilderCustomizer> customizers,
109+
ObjectProvider<ObservationRegistry> observationRegistryProvider) {
90110
Config.ConfigBuilder builder = Config.builder();
91-
configurePoolSettings(builder, properties.getPool());
111+
configurePoolSettings(builder, properties.getPool(), observationRegistryProvider);
92112
URI uri = connectionDetails.getUri();
93113
String scheme = (uri != null) ? uri.getScheme() : "bolt";
94114
configureDriverSettings(builder, properties, isSimpleScheme(scheme));
95-
builder.withLogging(new Neo4jSpringJclLogging());
96115
customizers.forEach((customizer) -> customizer.customize(builder));
97116
return builder.build();
98117
}
99118

100119
private boolean isSimpleScheme(String scheme) {
101120
String lowerCaseScheme = scheme.toLowerCase(Locale.ENGLISH);
102-
try {
103-
Scheme.validateScheme(lowerCaseScheme);
104-
}
105-
catch (IllegalArgumentException ex) {
121+
if (!ServiceLoader.load(BoltConnectionProviderFactory.class)
122+
.stream()
123+
.anyMatch((p) -> p.get().supports(lowerCaseScheme))) {
106124
throw new IllegalArgumentException(String.format("'%s' is not a supported scheme.", scheme));
107125
}
108-
return lowerCaseScheme.equals("bolt") || lowerCaseScheme.equals("neo4j");
126+
return !Scheme.isSecurityScheme(lowerCaseScheme);
109127
}
110128

111-
private void configurePoolSettings(Config.ConfigBuilder builder, Pool pool) {
129+
private void configurePoolSettings(Config.ConfigBuilder builder, Pool pool,
130+
ObjectProvider<ObservationRegistry> observationRegistryProvider) {
112131
if (pool.isLogLeakedSessions()) {
113132
builder.withLeakedSessionsLogging();
114133
}
@@ -120,12 +139,11 @@ private void configurePoolSettings(Config.ConfigBuilder builder, Pool pool) {
120139
builder.withMaxConnectionLifetime(pool.getMaxConnectionLifetime().toMillis(), TimeUnit.MILLISECONDS);
121140
builder.withConnectionAcquisitionTimeout(pool.getConnectionAcquisitionTimeout().toMillis(),
122141
TimeUnit.MILLISECONDS);
123-
if (pool.isMetricsEnabled()) {
124-
builder.withDriverMetrics();
125-
}
126-
else {
127-
builder.withoutDriverMetrics();
128-
}
142+
observationRegistryProvider.ifAvailable((orp) -> {
143+
if (pool.isMetricsEnabled() && HAS_DRIVER_METRICS) {
144+
builder.withObservationProvider(MicrometerObservationProvider.builder(orp).build());
145+
}
146+
});
129147
}
130148

131149
private void configureDriverSettings(Config.ConfigBuilder builder, Neo4jProperties properties,

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

Lines changed: 0 additions & 109 deletions
This file was deleted.

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

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

26+
import io.micrometer.observation.ObservationRegistry;
2527
import org.junit.jupiter.api.Test;
2628
import org.junit.jupiter.api.io.TempDir;
2729
import org.junit.jupiter.params.ParameterizedTest;
@@ -32,6 +34,7 @@
3234
import org.neo4j.driver.Config.ConfigBuilder;
3335
import org.neo4j.driver.Driver;
3436

37+
import org.springframework.beans.factory.ObjectProvider;
3538
import org.springframework.boot.autoconfigure.AutoConfigurations;
3639
import org.springframework.boot.context.properties.source.InvalidConfigurationPropertyValueException;
3740
import org.springframework.boot.neo4j.autoconfigure.Neo4jAutoConfiguration.PropertiesNeo4jConnectionDetails;
@@ -217,13 +220,6 @@ void authenticationWithBothUsernameAndKerberosShouldNotBeAllowed() {
217220
.withMessage("Cannot specify both username ('Farin') and kerberos ticket ('AABBCCDDEE')");
218221
}
219222

220-
@Test
221-
void poolWithMetricsEnabled() {
222-
Neo4jProperties properties = new Neo4jProperties();
223-
properties.getPool().setMetricsEnabled(true);
224-
assertThat(mapDriverConfig(properties).isMetricsEnabled()).isTrue();
225-
}
226-
227223
@Test
228224
void poolWithLogLeakedSessions() {
229225
Neo4jProperties properties = new Neo4jProperties();
@@ -322,14 +318,15 @@ void securityWithTrustSystemCertificates() {
322318
.isEqualTo(Config.TrustStrategy.Strategy.TRUST_SYSTEM_CA_SIGNED_CERTIFICATES);
323319
}
324320

325-
@Test
326-
void driverConfigShouldBeConfiguredToUseUseSpringJclLogging() {
327-
assertThat(mapDriverConfig(new Neo4jProperties()).logging()).isInstanceOf(Neo4jSpringJclLogging.class);
328-
}
329-
330321
private Config mapDriverConfig(Neo4jProperties properties, ConfigBuilderCustomizer... customizers) {
331322
return new Neo4jAutoConfiguration().mapDriverConfig(properties,
332-
new PropertiesNeo4jConnectionDetails(properties, null), Arrays.asList(customizers));
323+
new PropertiesNeo4jConnectionDetails(properties, null), Arrays.asList(customizers),
324+
new ObjectProvider<>() {
325+
@Override
326+
public Stream<ObservationRegistry> stream() {
327+
return Stream.empty();
328+
}
329+
});
333330
}
334331

335332
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ class Neo4jPropertiesTests {
3838
void poolSettingsHaveConsistentDefaults() {
3939
Config defaultConfig = Config.defaultConfig();
4040
Pool pool = new Neo4jProperties().getPool();
41-
assertThat(pool.isMetricsEnabled()).isEqualTo(defaultConfig.isMetricsEnabled());
4241
assertThat(pool.isLogLeakedSessions()).isEqualTo(defaultConfig.logLeakedSessions());
4342
assertThat(pool.getMaxConnectionPoolSize()).isEqualTo(defaultConfig.maxConnectionPoolSize());
4443
assertDuration(pool.getIdleTimeBeforeConnectionTest(), defaultConfig.idleTimeBeforeConnectionTest());

platform/spring-boot-dependencies/build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,7 +1621,7 @@ bom {
16211621
]
16221622
}
16231623
}
1624-
library("Neo4j Java Driver", "5.28.9") {
1624+
library("Neo4j Java Driver", "6.0.0") {
16251625
alignWith {
16261626
version {
16271627
from "org.springframework.data:spring-data-neo4j"
@@ -1630,7 +1630,8 @@ bom {
16301630
}
16311631
group("org.neo4j.driver") {
16321632
modules = [
1633-
"neo4j-java-driver"
1633+
"neo4j-java-driver",
1634+
"neo4j-java-driver-observation-micrometer"
16341635
]
16351636
}
16361637
links {

0 commit comments

Comments
 (0)