From de08df8bcd0e5ef58f99347c7e6424e4b3aa5dc2 Mon Sep 17 00:00:00 2001 From: Alex Bevilacqua Date: Fri, 15 May 2026 11:47:36 -0400 Subject: [PATCH 1/2] feat: add Spring Boot version to MongoDB driver handshake metadata The MongoDriverInformation already includes driverName("spring-boot") but was missing the version. This adds driverVersion so MongoDB server-side telemetry can distinguish traffic by Spring Boot release. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Alex Bevilacqua --- .../boot/mongodb/autoconfigure/MongoClientFactorySupport.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoClientFactorySupport.java b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoClientFactorySupport.java index 5aa6ce3e9d69..401a6b1327bf 100644 --- a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoClientFactorySupport.java +++ b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoClientFactorySupport.java @@ -25,6 +25,8 @@ import com.mongodb.MongoDriverInformation; import org.jspecify.annotations.Nullable; +import org.springframework.boot.SpringBootVersion; + /** * Base class for setup that is common to MongoDB client factories. * @@ -60,6 +62,7 @@ private void customize(Builder builder) { private MongoDriverInformation driverInformation() { return MongoDriverInformation.builder(MongoDriverInformation.builder().build()) .driverName("spring-boot") + .driverVersion(SpringBootVersion.getVersion()) .build(); } From 2cf279b6e14817c197e1885b315539d6e541296b Mon Sep 17 00:00:00 2001 From: Alex Bevilacqua Date: Fri, 15 May 2026 12:26:30 -0400 Subject: [PATCH 2/2] feat: append MongoDB client metadata for user-provided MongoClient When a MongoClient is created externally by the user (Pattern B), Spring Boot now calls appendMetadata via reflection to register "spring-boot" driver info. This covers both blocking (MongoDatabaseFactoryConfiguration) and reactive (DataMongoReactiveAutoConfiguration) paths. Reflection is used because appendMetadata was added in Java driver 5.6.0 and the actual version is managed by the Spring Data BOM. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Alex Bevilacqua --- .../DataMongoReactiveAutoConfiguration.java | 19 ++++++++++++++++++ .../MongoDatabaseFactoryConfiguration.java | 20 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAutoConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAutoConfiguration.java index 7f83fa6423c1..6f698c357d88 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAutoConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoReactiveAutoConfiguration.java @@ -16,9 +16,11 @@ package org.springframework.boot.data.mongodb.autoconfigure; +import java.lang.reflect.Method; import java.util.Optional; import com.mongodb.ClientSessionOptions; +import com.mongodb.MongoDriverInformation; import com.mongodb.reactivestreams.client.ClientSession; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoDatabase; @@ -27,6 +29,7 @@ import org.jspecify.annotations.Nullable; import reactor.core.publisher.Mono; +import org.springframework.boot.SpringBootVersion; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -76,10 +79,16 @@ @Import(DataMongoConfiguration.class) public final class DataMongoReactiveAutoConfiguration { + private static final MongoDriverInformation DRIVER_INFO = MongoDriverInformation.builder() + .driverName("spring-boot") + .driverVersion(SpringBootVersion.getVersion()) + .build(); + @Bean @ConditionalOnMissingBean(ReactiveMongoDatabaseFactory.class) SimpleReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory(MongoProperties properties, MongoClient mongo, MongoConnectionDetails connectionDetails) { + appendMetadata(mongo); String database = properties.getDatabase(); if (database == null) { database = connectionDetails.getConnectionString().getDatabase(); @@ -88,6 +97,16 @@ SimpleReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory(MongoProperties return new SimpleReactiveMongoDatabaseFactory(mongo, database); } + private static void appendMetadata(MongoClient mongoClient) { + try { + Method method = mongoClient.getClass().getMethod("appendMetadata", MongoDriverInformation.class); + method.invoke(mongoClient, DRIVER_INFO); + } + catch (Exception ex) { + // appendMetadata not available in this driver version — skip silently + } + } + @Bean @ConditionalOnMissingBean(ReactiveMongoOperations.class) ReactiveMongoTemplate reactiveMongoTemplate(ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory, diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryConfiguration.java index 3eabbf04ebea..1ce5345ff593 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryConfiguration.java @@ -16,8 +16,12 @@ package org.springframework.boot.data.mongodb.autoconfigure; +import java.lang.reflect.Method; + +import com.mongodb.MongoDriverInformation; import com.mongodb.client.MongoClient; +import org.springframework.boot.SpringBootVersion; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails; @@ -43,9 +47,15 @@ @ConditionalOnSingleCandidate(MongoClient.class) class MongoDatabaseFactoryConfiguration { + private static final MongoDriverInformation DRIVER_INFO = MongoDriverInformation.builder() + .driverName("spring-boot") + .driverVersion(SpringBootVersion.getVersion()) + .build(); + @Bean MongoDatabaseFactorySupport mongoDatabaseFactory(MongoClient mongoClient, MongoProperties properties, MongoConnectionDetails connectionDetails) { + appendMetadata(mongoClient); String database = properties.getDatabase(); if (database == null) { database = connectionDetails.getConnectionString().getDatabase(); @@ -54,4 +64,14 @@ MongoDatabaseFactorySupport mongoDatabaseFactory(MongoClient mongoClient, Mon return new SimpleMongoClientDatabaseFactory(mongoClient, database); } + private static void appendMetadata(MongoClient mongoClient) { + try { + Method method = mongoClient.getClass().getMethod("appendMetadata", MongoDriverInformation.class); + method.invoke(mongoClient, DRIVER_INFO); + } + catch (Exception ex) { + // appendMetadata not available in this driver version — skip silently + } + } + }