Browse Source

Always include Collection tag in MongoDB observations.

Use default "none" collection name when command doesn't define a collection.

Signed-off-by: michaldo <michaldo@github.io>
Closes: #4994
pull/5052/head
michaldo 7 months ago committed by Mark Paluch
parent
commit
7293d578ea
No known key found for this signature in database
GPG Key ID: 55BC6374BAA9D973
  1. 3
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/observability/DefaultMongoHandlerObservationConvention.java
  2. 15
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/observability/MongoObservationCommandListenerTests.java

3
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/observability/DefaultMongoHandlerObservationConvention.java

@ -15,6 +15,7 @@
*/ */
package org.springframework.data.mongodb.observability; package org.springframework.data.mongodb.observability;
import io.micrometer.common.KeyValue;
import io.micrometer.common.KeyValues; import io.micrometer.common.KeyValues;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
@ -65,6 +66,8 @@ class DefaultMongoHandlerObservationConvention implements MongoHandlerObservatio
if (!ObjectUtils.isEmpty(context.getCollectionName())) { if (!ObjectUtils.isEmpty(context.getCollectionName())) {
keyValues = keyValues keyValues = keyValues
.and(LowCardinalityCommandKeyNames.MONGODB_COLLECTION.withValue(context.getCollectionName())); .and(LowCardinalityCommandKeyNames.MONGODB_COLLECTION.withValue(context.getCollectionName()));
} else {
keyValues = keyValues.and(LowCardinalityCommandKeyNames.MONGODB_COLLECTION.withValue(KeyValue.NONE_VALUE));
} }
ConnectionDescription connectionDescription = context.getCommandStartedEvent().getConnectionDescription(); ConnectionDescription connectionDescription = context.getCommandStartedEvent().getConnectionDescription();

15
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.common.KeyValues;
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler; import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import io.micrometer.observation.Observation; import io.micrometer.observation.Observation;
@ -98,6 +99,20 @@ class MongoObservationCommandListenerTests {
assertThat(meterRegistry).hasMeterWithName("spring.data.mongodb.command.active"); 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 @Test
void successfullyCompletedCommandShouldCreateTimerWhenParentSampleInRequestContext() { void successfullyCompletedCommandShouldCreateTimerWhenParentSampleInRequestContext() {

Loading…
Cancel
Save