From 7614fc6edb01741c281c91c2b093b41fbcacc036 Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Thu, 14 Apr 2022 11:51:05 -0500 Subject: [PATCH] Switch to Micrometer 1.10's tracing APIs. Micrometer Tracing 1.10 has some breaking APIs. See #1254. --- .../observability/CassandraObservation.java | 28 +++++++------- ....java => CqlSessionKeyValuesProvider.java} | 4 +- .../CqlSessionTracingBeanPostProcessor.java | 8 ++-- .../CqlSessionTracingFactory.java | 6 +-- .../CqlSessionTracingInterceptor.java | 14 +++---- .../CqlSessionTracingObservationHandler.java | 12 +++--- ...=> DefaultCassandraKeyValuesProvider.java} | 37 ++++++++++++------- ...lSessionTracingBeanPostProcessorTests.java | 6 +-- .../observability/CqlSessionTracingTests.java | 32 ++++++++-------- .../observability/ZipkinIntegrationTests.java | 6 +-- 10 files changed, 82 insertions(+), 71 deletions(-) rename spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/{CqlSessionTagsProvider.java => CqlSessionKeyValuesProvider.java} (85%) rename spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/{DefaultCassandraTagsProvider.java => DefaultCassandraKeyValuesProvider.java} (64%) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CassandraObservation.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CassandraObservation.java index 43e31b0a4..243a7b245 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CassandraObservation.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CassandraObservation.java @@ -15,7 +15,7 @@ */ package org.springframework.data.cassandra.observability; -import io.micrometer.common.docs.TagKey; +import io.micrometer.common.docs.KeyName; import io.micrometer.observation.docs.DocumentedObservation; /** @@ -44,13 +44,13 @@ enum CassandraObservation implements DocumentedObservation { } @Override - public TagKey[] getLowCardinalityTagKeys() { - return LowCardinalityTags.values(); + public KeyName[] getLowCardinalityKeyNames() { + return LowCardinalityKeyNames.values(); } @Override - public TagKey[] getHighCardinalityTagKeys() { - return HighCardinalityTags.values(); + public KeyName[] getHighCardinalityKeyNames() { + return HighCardinalityKeyNames.values(); } @Override @@ -59,14 +59,14 @@ enum CassandraObservation implements DocumentedObservation { } }; - enum LowCardinalityTags implements TagKey { + enum LowCardinalityKeyNames implements KeyName { /** * Name of the Cassandra keyspace. */ KEYSPACE_NAME { @Override - public String getKey() { + public String getKeyName() { return "spring.data.cassandra.keyspace"; } }, @@ -76,7 +76,7 @@ enum CassandraObservation implements DocumentedObservation { */ SESSION_NAME { @Override - public String getKey() { + public String getKeyName() { return "spring.data.cassandra.sessionName"; } }, @@ -86,7 +86,7 @@ enum CassandraObservation implements DocumentedObservation { */ METHOD_NAME { @Override - public String getKey() { + public String getKeyName() { return "spring.data.cassandra.methodName"; } }, @@ -96,7 +96,7 @@ enum CassandraObservation implements DocumentedObservation { */ URL { @Override - public String getKey() { + public String getKeyName() { return "spring.data.cassandra.url"; } }, @@ -106,20 +106,20 @@ enum CassandraObservation implements DocumentedObservation { */ NODE_ERROR_TAG { @Override - public String getKey() { + public String getKeyName() { return "spring.data.cassandra.node[%s].error"; } } } - enum HighCardinalityTags implements TagKey { + enum HighCardinalityKeyNames implements KeyName { /** - * A tag containing Cassandra CQL. + * A key-value containing Cassandra CQL. */ CQL_TAG { @Override - public String getKey() { + public String getKeyName() { return "spring.data.cassandra.cql"; } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTagsProvider.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionKeyValuesProvider.java similarity index 85% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTagsProvider.java rename to spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionKeyValuesProvider.java index 48bd0f4ad..e20c310b4 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTagsProvider.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionKeyValuesProvider.java @@ -18,12 +18,12 @@ package org.springframework.data.cassandra.observability; import io.micrometer.observation.Observation; /** - * {@link Observation.TagsProvider} for Cassandra. + * {@link Observation.KeyValuesProvider} for Cassandra. * * @author Greg Turnquist * @since 4.0.0 */ -public interface CqlSessionTagsProvider extends Observation.TagsProvider { +public interface CqlSessionKeyValuesProvider extends Observation.KeyValuesProvider { @Override default boolean supportsContext(Observation.Context context) { diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingBeanPostProcessor.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingBeanPostProcessor.java index 12d692d26..ebdfc1230 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingBeanPostProcessor.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingBeanPostProcessor.java @@ -34,20 +34,20 @@ public class CqlSessionTracingBeanPostProcessor implements BeanPostProcessor { private final ObservationRegistry observationRegistry; - private final CqlSessionTagsProvider tagsProvider; + private final CqlSessionKeyValuesProvider keyValuesProvider; public CqlSessionTracingBeanPostProcessor(ObservationRegistry observationRegistry, - CqlSessionTagsProvider tagsProvider) { + CqlSessionKeyValuesProvider keyValuesProvider) { this.observationRegistry = observationRegistry; - this.tagsProvider = tagsProvider; + this.keyValuesProvider = keyValuesProvider; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof CqlSession) { - return CqlSessionTracingFactory.wrap((CqlSession) bean, this.observationRegistry, this.tagsProvider); + return CqlSessionTracingFactory.wrap((CqlSession) bean, this.observationRegistry, this.keyValuesProvider); } return bean; diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingFactory.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingFactory.java index e18130a01..6a1092c52 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingFactory.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingFactory.java @@ -39,16 +39,16 @@ public final class CqlSessionTracingFactory { * * @param session * @param observationRegistry - * @param tagsProvider + * @param keyValuesProvider * @return */ public static CqlSession wrap(CqlSession session, ObservationRegistry observationRegistry, - CqlSessionTagsProvider tagsProvider) { + CqlSessionKeyValuesProvider keyValuesProvider) { ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTarget(session); - proxyFactory.addAdvice(new CqlSessionTracingInterceptor(session, observationRegistry, tagsProvider)); + proxyFactory.addAdvice(new CqlSessionTracingInterceptor(session, observationRegistry, keyValuesProvider)); proxyFactory.addInterface(CqlSession.class); return (CqlSession) proxyFactory.getProxy(); diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingInterceptor.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingInterceptor.java index c467e25b2..c0a2841cf 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingInterceptor.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingInterceptor.java @@ -46,7 +46,7 @@ import com.datastax.oss.driver.api.core.cql.Statement; * @since 4.0.0 */ final class CqlSessionTracingInterceptor - implements MethodInterceptor, Observation.TagsProviderAware { + implements MethodInterceptor, Observation.KeyValuesProviderAware { private static final Log log = LogFactory.getLog(CqlSessionTracingInterceptor.class); @@ -54,14 +54,14 @@ final class CqlSessionTracingInterceptor private final ObservationRegistry observationRegistry; - private CqlSessionTagsProvider tagsProvider; + private CqlSessionKeyValuesProvider keyValuesProvider; CqlSessionTracingInterceptor(CqlSession delegateSession, ObservationRegistry observationRegistry, - CqlSessionTagsProvider tagsProvider) { + CqlSessionKeyValuesProvider keyValuesProvider) { this.delegateSession = delegateSession; this.observationRegistry = observationRegistry; - this.tagsProvider = tagsProvider; + this.keyValuesProvider = keyValuesProvider; } @Nullable @@ -154,12 +154,12 @@ final class CqlSessionTracingInterceptor return CassandraObservation.CASSANDRA_QUERY_OBSERVATION // .observation(this.observationRegistry, observationContext) // .contextualName(CassandraObservation.CASSANDRA_QUERY_OBSERVATION.getContextualName()) // - .tagsProvider(this.tagsProvider) // + .keyValuesProvider(this.keyValuesProvider) // .start(); } @Override - public void setTagsProvider(CqlSessionTagsProvider tagsProvider) { - this.tagsProvider = tagsProvider; + public void setKeyValuesProvider(CqlSessionKeyValuesProvider keyValuesProvider) { + this.keyValuesProvider = keyValuesProvider; } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingObservationHandler.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingObservationHandler.java index 63a53194f..0cd9666af 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingObservationHandler.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/CqlSessionTracingObservationHandler.java @@ -15,7 +15,7 @@ */ package org.springframework.data.cassandra.observability; -import io.micrometer.common.Tag; +import io.micrometer.common.KeyValue; import io.micrometer.observation.Observation; import io.micrometer.tracing.Span; import io.micrometer.tracing.Tracer; @@ -61,14 +61,14 @@ public class CqlSessionTracingObservationHandler implements TracingObservationHa String sessionName = null; String url = null; - for (Tag tag : context.getLowCardinalityTags()) { + for (KeyValue keyValue : context.getLowCardinalityKeyValues()) { - if (tag.getKey().equals(CassandraObservation.LowCardinalityTags.SESSION_NAME.getKey())) { - sessionName = tag.getValue(); + if (keyValue.getKey().equals(CassandraObservation.LowCardinalityKeyNames.SESSION_NAME.getKeyName())) { + sessionName = keyValue.getValue(); } - if (tag.getKey().equals(CassandraObservation.LowCardinalityTags.URL.getKey())) { - url = tag.getValue(); + if (keyValue.getKey().equals(CassandraObservation.LowCardinalityKeyNames.URL.getKeyName())) { + url = keyValue.getValue(); } } diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/DefaultCassandraTagsProvider.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/DefaultCassandraKeyValuesProvider.java similarity index 64% rename from spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/DefaultCassandraTagsProvider.java rename to spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/DefaultCassandraKeyValuesProvider.java index 89e98960b..85c462cd9 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/DefaultCassandraTagsProvider.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/observability/DefaultCassandraKeyValuesProvider.java @@ -15,11 +15,15 @@ */ package org.springframework.data.cassandra.observability; -import io.micrometer.common.Tags; +import io.micrometer.common.KeyValue; +import io.micrometer.common.KeyValues; import java.util.Optional; import java.util.StringJoiner; +import org.springframework.data.cassandra.observability.CassandraObservation.HighCardinalityKeyNames; +import org.springframework.data.cassandra.observability.CassandraObservation.LowCardinalityKeyNames; + import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.cql.BatchStatement; import com.datastax.oss.driver.api.core.cql.BatchableStatement; @@ -28,34 +32,39 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.cql.Statement; /** - * Default {@link CqlSessionTagsProvider} implementation. + * Default {@link CqlSessionKeyValuesProvider} implementation. * * @author Greg Turnquist * @since 4.0.0 */ -public class DefaultCassandraTagsProvider implements CqlSessionTagsProvider { +public class DefaultCassandraKeyValuesProvider implements CqlSessionKeyValuesProvider { @Override - public Tags getLowCardinalityTags(CqlSessionContext context) { + public KeyValues getLowCardinalityKeyValues(CqlSessionContext context) { - Tags tags = Tags.of( // - CassandraObservation.LowCardinalityTags.SESSION_NAME - .of(Optional.ofNullable(context.getDelegateSession().getName()).orElse("unknown")), - CassandraObservation.LowCardinalityTags.KEYSPACE_NAME.of( + KeyValues keyValues = KeyValues.of( // + KeyValue.of( // + LowCardinalityKeyNames.SESSION_NAME.getKeyName(), + Optional.ofNullable(context.getDelegateSession().getName()).orElse("unknown")), + KeyValue.of( // + LowCardinalityKeyNames.KEYSPACE_NAME.getKeyName(), Optional.ofNullable(context.getStatement().getKeyspace()).map(CqlIdentifier::asInternal).orElse("unknown")), - CassandraObservation.LowCardinalityTags.METHOD_NAME.of(context.getMethodName())); + KeyValue.of( // + LowCardinalityKeyNames.METHOD_NAME.getKeyName(), // + context.getMethodName())); if (context.getStatement().getNode() != null) { - tags = tags.and(CassandraObservation.LowCardinalityTags.URL - .of(context.getStatement().getNode().getEndPoint().resolve().toString())); + keyValues = keyValues.and(KeyValue.of( // + LowCardinalityKeyNames.URL.getKeyName(), + context.getStatement().getNode().getEndPoint().resolve().toString())); } - return tags; + return keyValues; } @Override - public Tags getHighCardinalityTags(CqlSessionContext context) { - return Tags.of(CassandraObservation.HighCardinalityTags.CQL_TAG.of(getCql(context.getStatement()))); + public KeyValues getHighCardinalityKeyValues(CqlSessionContext context) { + return KeyValues.of(KeyValue.of(HighCardinalityKeyNames.CQL_TAG.getKeyName(), getCql(context.getStatement()))); } /** diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/CqlSessionTracingBeanPostProcessorTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/CqlSessionTracingBeanPostProcessorTests.java index 8eeefa80a..d409b61e6 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/CqlSessionTracingBeanPostProcessorTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/CqlSessionTracingBeanPostProcessorTests.java @@ -74,13 +74,13 @@ public class CqlSessionTracingBeanPostProcessorTests { } @Bean - CqlSessionTagsProvider tagsProvider() { - return new DefaultCassandraTagsProvider(); + CqlSessionKeyValuesProvider keyValuesProvider() { + return new DefaultCassandraKeyValuesProvider(); } @Bean CqlSessionTracingBeanPostProcessor traceCqlSessionBeanPostProcessor(ObservationRegistry observationRegistry, - CqlSessionTagsProvider tagsProvider) { + CqlSessionKeyValuesProvider tagsProvider) { return new CqlSessionTracingBeanPostProcessor(observationRegistry, tagsProvider); } } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/CqlSessionTracingTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/CqlSessionTracingTests.java index 1226e7d69..ea342b6f2 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/CqlSessionTracingTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/CqlSessionTracingTests.java @@ -18,8 +18,8 @@ package org.springframework.data.cassandra.observability; import static org.assertj.core.api.Assertions.*; import static org.springframework.data.cassandra.observability.CassandraObservation.*; -import io.micrometer.common.Tag; -import io.micrometer.common.Tags; +import io.micrometer.common.KeyValue; +import io.micrometer.common.KeyValues; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.observation.TimerObservationHandler; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; @@ -91,7 +91,7 @@ public class CqlSessionTracingTests extends IntegrationTestsSupport { ObservationRegistry observationRegistry = ObservationRegistry.create(); observationRegistry.observationConfig().observationHandler(new TimerObservationHandler(meterRegistry)); - CqlSessionTagsProvider tagsProvider = new DefaultCassandraTagsProvider(); + CqlSessionKeyValuesProvider tagsProvider = new DefaultCassandraKeyValuesProvider(); SimpleTracer tracer = new SimpleTracer(); observationRegistry.observationConfig().observationHandler(new CqlSessionTracingObservationHandler(tracer)); @@ -108,7 +108,7 @@ public class CqlSessionTracingTests extends IntegrationTestsSupport { ObservationRegistry observationRegistry = ObservationRegistry.create(); observationRegistry.observationConfig().observationHandler(new TimerObservationHandler(meterRegistry)); - CqlSessionTagsProvider tagsProvider = new DefaultCassandraTagsProvider(); + CqlSessionKeyValuesProvider tagsProvider = new DefaultCassandraKeyValuesProvider(); SimpleTracer tracer = new SimpleTracer(); observationRegistry.observationConfig().observationHandler(new CqlSessionTracingObservationHandler(tracer)); @@ -122,25 +122,27 @@ public class CqlSessionTracingTests extends IntegrationTestsSupport { traceSession.prepareAsync(CREATE_KEYSPACE); }); - MeterRegistryAssert.then(meterRegistry).hasTimerWithNameAndTags(CASSANDRA_QUERY_OBSERVATION.getName(), Tags.of( // - LowCardinalityTags.SESSION_NAME.of("s5"), // - LowCardinalityTags.KEYSPACE_NAME.of("unknown"), // - Tag.of("error", "none") // + MeterRegistryAssert.then(meterRegistry).hasTimerWithNameAndTags(CASSANDRA_QUERY_OBSERVATION.getName(), KeyValues.of( // + KeyValue.of(LowCardinalityKeyNames.SESSION_NAME.getKeyName(), "s5"), // + KeyValue.of(LowCardinalityKeyNames.KEYSPACE_NAME.getKeyName(), "unknown"), // + KeyValue.of("error", "none") // )); assertThat(tracer.getSpans()).hasSize(4); - assertThat(findSpan(tracer.getSpans(), LowCardinalityTags.METHOD_NAME.getKey(), "execute")).isNotNull(); - assertThat(findSpan(tracer.getSpans(), LowCardinalityTags.METHOD_NAME.getKey(), "executeAsync")).isNotNull(); - assertThat(findSpan(tracer.getSpans(), LowCardinalityTags.METHOD_NAME.getKey(), "prepare")).isNotNull(); - assertThat(findSpan(tracer.getSpans(), LowCardinalityTags.METHOD_NAME.getKey(), "prepareAsync")).isNotNull(); + assertThat(findSpan(tracer.getSpans(), LowCardinalityKeyNames.METHOD_NAME.getKeyName(), "execute")).isNotNull(); + assertThat(findSpan(tracer.getSpans(), LowCardinalityKeyNames.METHOD_NAME.getKeyName(), "executeAsync")) + .isNotNull(); + assertThat(findSpan(tracer.getSpans(), LowCardinalityKeyNames.METHOD_NAME.getKeyName(), "prepare")).isNotNull(); + assertThat(findSpan(tracer.getSpans(), LowCardinalityKeyNames.METHOD_NAME.getKeyName(), "prepareAsync")) + .isNotNull(); tracer.getSpans().forEach(simpleSpan -> SpanAssert.then(simpleSpan) // .hasRemoteServiceNameEqualTo("cassandra-s5") // .hasNameEqualTo(CASSANDRA_QUERY_OBSERVATION.getContextualName()) // - .hasTag(LowCardinalityTags.SESSION_NAME.getKey(), "s5") // - .hasTag(LowCardinalityTags.KEYSPACE_NAME.getKey(), "unknown") // - .hasTag(HighCardinalityTags.CQL_TAG.getKey(), CREATE_KEYSPACE) // + .hasTag(LowCardinalityKeyNames.SESSION_NAME.getKeyName(), "s5") // + .hasTag(LowCardinalityKeyNames.KEYSPACE_NAME.getKeyName(), "unknown") // + .hasTag(HighCardinalityKeyNames.CQL_TAG.getKeyName(), CREATE_KEYSPACE) // .hasIpThatIsBlank() // .hasPortEqualTo(0) // .hasKindEqualTo(Span.Kind.CLIENT)); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/ZipkinIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/ZipkinIntegrationTests.java index 1ba605bbf..9525fe9dc 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/ZipkinIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/observability/ZipkinIntegrationTests.java @@ -106,13 +106,13 @@ public class ZipkinIntegrationTests extends SampleTestRunner { } @Bean - CqlSessionTagsProvider tagsProvider() { - return new DefaultCassandraTagsProvider(); + CqlSessionKeyValuesProvider tagsProvider() { + return new DefaultCassandraKeyValuesProvider(); } @Bean CqlSessionTracingBeanPostProcessor traceCqlSessionBeanPostProcessor(ObservationRegistry observationRegistry, - CqlSessionTagsProvider tagsProvider) { + CqlSessionKeyValuesProvider tagsProvider) { return new CqlSessionTracingBeanPostProcessor(observationRegistry, tagsProvider); } }