From 7293d578ea92cae43f3649dd95fae07cf3c5bdd7 Mon Sep 17 00:00:00 2001 From: michaldo Date: Wed, 4 Jun 2025 23:32:49 +0200 Subject: [PATCH] Always include Collection tag in MongoDB observations. Use default "none" collection name when command doesn't define a collection. Signed-off-by: michaldo Closes: #4994 --- .../DefaultMongoHandlerObservationConvention.java | 3 +++ .../MongoObservationCommandListenerTests.java | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/observability/DefaultMongoHandlerObservationConvention.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/observability/DefaultMongoHandlerObservationConvention.java index b823ce223..84b31e5da 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/observability/DefaultMongoHandlerObservationConvention.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/observability/DefaultMongoHandlerObservationConvention.java @@ -15,6 +15,7 @@ */ package org.springframework.data.mongodb.observability; +import io.micrometer.common.KeyValue; import io.micrometer.common.KeyValues; import java.net.InetSocketAddress; @@ -65,6 +66,8 @@ class DefaultMongoHandlerObservationConvention implements MongoHandlerObservatio if (!ObjectUtils.isEmpty(context.getCollectionName())) { keyValues = keyValues .and(LowCardinalityCommandKeyNames.MONGODB_COLLECTION.withValue(context.getCollectionName())); + } else { + keyValues = keyValues.and(LowCardinalityCommandKeyNames.MONGODB_COLLECTION.withValue(KeyValue.NONE_VALUE)); } ConnectionDescription connectionDescription = context.getCommandStartedEvent().getConnectionDescription(); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/observability/MongoObservationCommandListenerTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/observability/MongoObservationCommandListenerTests.java index 5c2cb0b70..981e48a8e 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/observability/MongoObservationCommandListenerTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/observability/MongoObservationCommandListenerTests.java @@ -20,6 +20,7 @@ import static org.mockito.Mockito.*; import io.micrometer.common.KeyValues; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tags; import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.micrometer.observation.Observation; @@ -98,6 +99,20 @@ class MongoObservationCommandListenerTests { assertThat(meterRegistry).hasMeterWithName("spring.data.mongodb.command.active"); } + @Test + void commandStartedShouldIncludeCollectionIfMissing() { + + // when + listener.commandStarted(new CommandStartedEvent(new MapRequestContext(), 0, 0, null, "some name", "hello", null)); + + // then + // although command 'hello' is collection-less, metric must have tag "db.mongodb.collection" + assertThat(meterRegistry).hasMeterWithNameAndTags( + "spring.data.mongodb.command.active", + Tags.of("db.mongodb.collection", "none")); + + } + @Test void successfullyCompletedCommandShouldCreateTimerWhenParentSampleInRequestContext() {