Switch to Micrometer 1.10's tracing APIs.
Micrometer Tracing 1.10 has some breaking APIs. See #1254.
This commit is contained in:
@@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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())));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user