Switch to Micrometer 1.10's tracing APIs.

Micrometer Tracing 1.10 has some breaking APIs.

See #1254.
This commit is contained in:
Greg L. Turnquist
2022-04-14 11:51:05 -05:00
parent 11788b5286
commit 7614fc6edb
10 changed files with 82 additions and 71 deletions

View File

@@ -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";
}
}

View File

@@ -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<CqlSessionContext> {
public interface CqlSessionKeyValuesProvider extends Observation.KeyValuesProvider<CqlSessionContext> {
@Override
default boolean supportsContext(Observation.Context context) {

View File

@@ -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;

View File

@@ -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();

View File

@@ -46,7 +46,7 @@ import com.datastax.oss.driver.api.core.cql.Statement;
* @since 4.0.0
*/
final class CqlSessionTracingInterceptor
implements MethodInterceptor, Observation.TagsProviderAware<CqlSessionTagsProvider> {
implements MethodInterceptor, Observation.KeyValuesProviderAware<CqlSessionKeyValuesProvider> {
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;
}
}

View File

@@ -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();
}
}

View File

@@ -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())));
}
/**

View File

@@ -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);
}
}

View File

@@ -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));

View File

@@ -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);
}
}