From 634755c862acf19bb6aeff8aba8c27e2b1f66802 Mon Sep 17 00:00:00 2001 From: Simone Giusso Date: Sun, 21 Aug 2022 20:57:30 +0200 Subject: [PATCH 01/18] new cassandra 4.14 module to support reactive tracing --- .../cassandra-4.0/javaagent/build.gradle.kts | 2 + .../v4_0/CompletionStageFunction.java | 1 + .../cassandra-4.0/library/build.gradle.kts | 25 ++++ .../v4_0/CassandraAttributesExtractor.java | 2 +- .../v4_0/CassandraNetAttributesGetter.java | 2 +- .../cassandra/v4_0/CassandraRequest.java | 2 +- .../cassandra/v4_0/CassandraSingletons.java | 2 +- .../v4_0/CassandraSqlAttributesGetter.java | 2 +- .../cassandra/v4_0/TracingCqlSession.java | 4 +- .../cassandra-4.14/javaagent/build.gradle.kts | 29 ++++ .../CassandraClientInstrumentationModule.java | 25 ++++ .../v4_14/CompletionStageFunction.java | 24 ++++ .../v4_14/SessionBuilderInstrumentation.java | 53 +++++++ .../cassandra/v4_14/TracingCqlSession.java | 24 ++++ .../test/groovy/CassandraClientTest.groovy | 129 ++++++++++++++++++ settings.gradle.kts | 2 + 16 files changed, 321 insertions(+), 7 deletions(-) create mode 100644 instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts rename instrumentation/cassandra/cassandra-4.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java (97%) rename instrumentation/cassandra/cassandra-4.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java (95%) rename instrumentation/cassandra/cassandra-4.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/cassandra/v4_0/CassandraRequest.java (87%) rename instrumentation/cassandra/cassandra-4.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/cassandra/v4_0/CassandraSingletons.java (96%) rename instrumentation/cassandra/cassandra-4.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java (93%) rename instrumentation/cassandra/cassandra-4.0/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/cassandra/v4_0/TracingCqlSession.java (97%) create mode 100644 instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts create mode 100644 instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraClientInstrumentationModule.java create mode 100644 instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java create mode 100644 instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/SessionBuilderInstrumentation.java create mode 100644 instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java create mode 100644 instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index aad53b864a45..97bc74ec5a33 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -12,6 +12,8 @@ muzzle { } dependencies { + implementation(project(":instrumentation:cassandra:cassandra-4.0:library")) + library("com.datastax.oss:java-driver-core:4.0.0") compileOnly("com.google.auto.value:auto-value-annotations") diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java index 14aa73c84911..36bd7943fb4e 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.CqlSession; +import io.opentelemetry.instrumentation.cassandra.v4_0.TracingCqlSession; import java.util.function.Function; public class CompletionStageFunction implements Function { diff --git a/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts new file mode 100644 index 000000000000..aad53b864a45 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("com.datastax.oss") + module.set("java-driver-core") + versions.set("[4.0,)") + assertInverse.set(true) + } +} + +dependencies { + library("com.datastax.oss:java-driver-core:4.0.0") + + compileOnly("com.google.auto.value:auto-value-annotations") + annotationProcessor("com.google.auto.value:auto-value") +} + +tasks { + test { + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].getService()) + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java similarity index 97% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java index be41c016b491..6d025304222e 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.config.DefaultDriverOption; import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java similarity index 95% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java index cb58a2a6d434..6f785e797bee 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.datastax.oss.driver.api.core.metadata.Node; diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraRequest.java similarity index 87% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraRequest.java index 9c783cc3f196..134f060b94b5 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraRequest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.session.Session; import com.google.auto.value.AutoValue; diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java similarity index 96% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java index b84df6935485..c061bc072dcf 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java similarity index 93% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java index 686966166f3c..d0731c2ffc31 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.CqlIdentifier; import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesGetter; diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java similarity index 97% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java index 726ea9e4db89..4629487bff0d 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra.v4_0; -import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraSingletons.instrumenter; +import static io.opentelemetry.instrumentation.cassandra.v4_0.CassandraSingletons.instrumenter; import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts new file mode 100644 index 000000000000..b13321a2be7c --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("com.datastax.oss") + module.set("java-driver-core") + versions.set("[4.14,)") + assertInverse.set(true) + } +} + +dependencies { + implementation(project(":instrumentation:cassandra:cassandra-4.0:library")) + + library("com.datastax.oss:java-driver-core:4.14.1") + + compileOnly("com.google.auto.value:auto-value-annotations") + annotationProcessor("com.google.auto.value:auto-value") + + testImplementation("io.projectreactor:reactor-core:3.4.21") +} + +tasks { + test { + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].getService()) + } +} diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraClientInstrumentationModule.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraClientInstrumentationModule.java new file mode 100644 index 000000000000..eaee3e0acaa0 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraClientInstrumentationModule.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; + +import static java.util.Collections.singletonList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.List; + +@AutoService(InstrumentationModule.class) +public class CassandraClientInstrumentationModule extends InstrumentationModule { + public CassandraClientInstrumentationModule() { + super("cassandra", "cassandra-4.14"); + } + + @Override + public List typeInstrumentations() { + return singletonList(new SessionBuilderInstrumentation()); + } +} diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java new file mode 100644 index 000000000000..8c1e070c5c96 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; + +import com.datastax.oss.driver.api.core.CqlSession; +import java.util.function.Function; + +public class CompletionStageFunction implements Function { + + @Override + public Object apply(Object session) { + if (session == null) { + return null; + } + // This should cover ours and OT's TracingCqlSession + if (session.getClass().getName().endsWith("cassandra4.TracingCqlSession")) { + return session; + } + return new TracingCqlSession((CqlSession) session); + } +} diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/SessionBuilderInstrumentation.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/SessionBuilderInstrumentation.java new file mode 100644 index 000000000000..88a1094d1896 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/SessionBuilderInstrumentation.java @@ -0,0 +1,53 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; + +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import java.util.concurrent.CompletionStage; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class SessionBuilderInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + // Note: Cassandra has a large driver and we instrument single class in it. + // The rest is ignored in AdditionalLibraryIgnoresMatcher + return named("com.datastax.oss.driver.api.core.session.SessionBuilder"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isMethod().and(isPublic()).and(named("buildAsync")).and(takesArguments(0)), + SessionBuilderInstrumentation.class.getName() + "$BuildAdvice"); + } + + @SuppressWarnings("unused") + public static class BuildAdvice { + + /** + * Strategy: each time we build a connection to a Cassandra cluster, the + * com.datastax.oss.driver.api.core.session.SessionBuilder.buildAsync() method is called. The + * opentracing contribution is a simple wrapper, so we just have to wrap the new session. + * + * @param stage The fresh CompletionStage to patch. This stage produces session which is + * replaced with new session + */ + @Advice.OnMethodExit(suppress = Throwable.class) + public static void injectTracingSession( + @Advice.Return(readOnly = false) CompletionStage stage) { + stage = stage.thenApply(new CompletionStageFunction()); + } + } +} diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java new file mode 100644 index 000000000000..c31e0dc83550 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; + +import com.datastax.dse.driver.api.core.cql.reactive.ReactiveResultSet; +import com.datastax.dse.driver.internal.core.cql.reactive.DefaultReactiveResultSet; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.cql.Statement; + +public class TracingCqlSession + extends io.opentelemetry.instrumentation.cassandra.v4_0.TracingCqlSession { + + public TracingCqlSession(CqlSession session) { + super(session); + } + + @Override + public ReactiveResultSet executeReactive(Statement statement) { + return new DefaultReactiveResultSet(() -> executeAsync(statement)); + } +} diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy b/instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy new file mode 100644 index 000000000000..e29d3239545e --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy @@ -0,0 +1,129 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import com.datastax.oss.driver.api.core.CqlSession +import com.datastax.oss.driver.api.core.config.DefaultDriverOption +import com.datastax.oss.driver.api.core.config.DriverConfigLoader +import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader +import io.opentelemetry.api.trace.SpanKind +import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification +import io.opentelemetry.instrumentation.test.asserts.TraceAssert +import io.opentelemetry.sdk.trace.data.SpanData +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes +import reactor.core.publisher.Flux +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.testcontainers.containers.GenericContainer +import org.testcontainers.containers.output.Slf4jLogConsumer +import spock.lang.Shared + +import java.time.Duration + +import static io.opentelemetry.api.trace.SpanKind.CLIENT + +class CassandraClientTest extends AgentInstrumentationSpecification { + private static final Logger logger = LoggerFactory.getLogger(CassandraClientTest) + + @Shared + GenericContainer cassandra + @Shared + int cassandraPort + + def setupSpec() { + cassandra = new GenericContainer("cassandra:4.0") + // limit memory usage + .withEnv("JVM_OPTS", "-Xmx128m -Xms128m") + .withExposedPorts(9042) + .withLogConsumer(new Slf4jLogConsumer(logger)) + .withStartupTimeout(Duration.ofSeconds(120)) + cassandra.start() + + cassandraPort = cassandra.getMappedPort(9042) + } + + def cleanupSpec() { + cassandra.stop() + } + + def "test reactive"() { + setup: + CqlSession session = getSession(keyspace) + + runWithSpan("parent") { + Flux.from(session.executeReactive(statement)).doOnComplete({ result -> + runWithSpan("child") {} + }).blockLast() + } + + expect: + assertTraces(1) { + trace(0, 3) { + span(0) { + name "parent" + kind SpanKind.INTERNAL + hasNoParent() + } + cassandraSpan(it, 1, spanName, expectedStatement, operation, keyspace, table, span(0)) + span(2) { + name "child" + kind SpanKind.INTERNAL + childOf span(0) + } + } + } + + cleanup: + session.close() + + where: + keyspace | statement | expectedStatement | spanName | operation | table + null | "DROP KEYSPACE IF EXISTS reactive_test" | "DROP KEYSPACE IF EXISTS reactive_test" | "DB Query" | null | null + null | "CREATE KEYSPACE reactive_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | "CREATE KEYSPACE reactive_test WITH REPLICATION = {?:?, ?:?}" | "DB Query" | null | null + "reactive_test" | "CREATE TABLE reactive_test.users ( id UUID PRIMARY KEY, name text )" | "CREATE TABLE reactive_test.users ( id UUID PRIMARY KEY, name text )" | "reactive_test" | null | null + "reactive_test" | "INSERT INTO reactive_test.users (id, name) values (uuid(), 'alice')" | "INSERT INTO reactive_test.users (id, name) values (uuid(), ?)" | "INSERT reactive_test.users" | "INSERT" | "reactive_test.users" + "reactive_test" | "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "SELECT * FROM users where name = ? ALLOW FILTERING" | "SELECT reactive_test.users" | "SELECT" | "users" + } + + def cassandraSpan(TraceAssert trace, int index, String spanName, String statement, String operation, String keyspace, String table, Object parentSpan = null) { + trace.span(index) { + name spanName + kind CLIENT + if (parentSpan == null) { + hasNoParent() + } else { + childOf((SpanData) parentSpan) + } + attributes { + "$SemanticAttributes.NET_PEER_NAME" "localhost" + "$SemanticAttributes.NET_PEER_IP" "127.0.0.1" + "$SemanticAttributes.NET_PEER_PORT" cassandraPort + "$SemanticAttributes.DB_SYSTEM" "cassandra" + "$SemanticAttributes.DB_NAME" keyspace + "$SemanticAttributes.DB_STATEMENT" statement + "$SemanticAttributes.DB_OPERATION" operation + "$SemanticAttributes.DB_CASSANDRA_CONSISTENCY_LEVEL" "LOCAL_ONE" + "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_DC" "datacenter1" + "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_ID" String + "$SemanticAttributes.DB_CASSANDRA_IDEMPOTENCE" Boolean + "$SemanticAttributes.DB_CASSANDRA_PAGE_SIZE" 5000 + "$SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT" 0 + // the SqlStatementSanitizer can't handle CREATE statements yet + "$SemanticAttributes.DB_CASSANDRA_TABLE" table + } + } + } + + def getSession(String keyspace) { + DriverConfigLoader configLoader = DefaultDriverConfigLoader.builder() + .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(0)) + .build() + return CqlSession.builder() + .addContactPoint(new InetSocketAddress("localhost", cassandraPort)) + .withConfigLoader(configLoader) + .withLocalDatacenter("datacenter1") + .withKeyspace((String) keyspace) + .build() + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 7fccb475d49e..e70cd14812ca 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -177,6 +177,8 @@ include(":instrumentation:azure-core:azure-core-1.19:javaagent") include(":instrumentation:azure-core:azure-core-1.19:library-instrumentation-shaded") include(":instrumentation:cassandra:cassandra-3.0:javaagent") include(":instrumentation:cassandra:cassandra-4.0:javaagent") +include(":instrumentation:cassandra:cassandra-4.0:library") +include(":instrumentation:cassandra:cassandra-4.14:javaagent") include(":instrumentation:cdi-testing") include(":instrumentation:graphql-java-12.0:javaagent") include(":instrumentation:graphql-java-12.0:library") From f59e4d7b3e381c9daf8ac2320ec55a604b7d6b9a Mon Sep 17 00:00:00 2001 From: Simone Giusso Date: Sun, 21 Aug 2022 22:56:49 +0200 Subject: [PATCH 02/18] fix DuplicateFileCopyingException --- .../cassandra/cassandra-4.0/library/build.gradle.kts | 11 +---------- .../cassandra/v4_0/CassandraSingletons.java | 3 --- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts index aad53b864a45..0910f423100e 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts @@ -1,14 +1,5 @@ plugins { - id("otel.javaagent-instrumentation") -} - -muzzle { - pass { - group.set("com.datastax.oss") - module.set("java-driver-core") - versions.set("[4.0,)") - assertInverse.set(true) - } + id("otel.library-instrumentation") } dependencies { diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java index c061bc072dcf..21d406c9bec2 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -12,7 +12,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; public final class CassandraSingletons { @@ -32,8 +31,6 @@ public final class CassandraSingletons { .addAttributesExtractor( SqlClientAttributesExtractor.builder(attributesGetter) .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) - .setStatementSanitizationEnabled( - CommonConfig.get().isStatementSanitizationEnabled()) .build()) .addAttributesExtractor( NetClientAttributesExtractor.create(new CassandraNetAttributesGetter())) From 128f0f620b863a774d02ded395bd8067ff2e6030 Mon Sep 17 00:00:00 2001 From: Simone Giusso Date: Sat, 27 Aug 2022 18:12:58 +0200 Subject: [PATCH 03/18] Move CassandraSingletons in instrumentation libraries and add new CassandraTelemetry & CassandraTelemetryBuilder files --- .../cassandra/v4_0/CassandraSingletons.java | 34 ++++++++++++ .../v4_0/CompletionStageFunction.java | 4 +- .../v4_0/CassandraAttributesExtractor.java | 2 +- .../v4_0/CassandraNetAttributesGetter.java | 2 +- .../cassandra/v4_0/CassandraSingletons.java | 46 ---------------- .../v4_0/CassandraSqlAttributesGetter.java | 3 +- .../cassandra/v4_0/CassandraTelemetry.java | 53 +++++++++++++++++++ .../v4_0/CassandraTelemetryBuilder.java | 36 +++++++++++++ .../cassandra/v4_0/TracingCqlSession.java | 32 ++++++----- .../cassandra/v4_14/CassandraSingletons.java | 34 ++++++++++++ .../v4_14/CompletionStageFunction.java | 4 +- .../cassandra/v4_14/TracingCqlSession.java | 8 ++- 12 files changed, 188 insertions(+), 70 deletions(-) create mode 100644 instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java delete mode 100644 instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java create mode 100644 instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetry.java create mode 100644 instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java create mode 100644 instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java new file mode 100644 index 000000000000..202667084e7a --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; + +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraRequest; +import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraTelemetry; +import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; + +public final class CassandraSingletons { + // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException + private static final Instrumenter INSTRUMENTER; + + static { + CassandraTelemetry telemetry = + CassandraTelemetry.builder(GlobalOpenTelemetry.get()) + .setInstrumentationName("io.opentelemetry.cassandra-4.0") + .setStatementSanitizationEnabled(CommonConfig.get().isStatementSanitizationEnabled()) + .build(); + + INSTRUMENTER = telemetry.getInstrumenter(); + } + + public static Instrumenter instrumenter() { + return INSTRUMENTER; + } + + private CassandraSingletons() {} +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java index 36bd7943fb4e..7f8c2ec5b77a 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraSingletons.instrumenter; + import com.datastax.oss.driver.api.core.CqlSession; import io.opentelemetry.instrumentation.cassandra.v4_0.TracingCqlSession; import java.util.function.Function; @@ -20,6 +22,6 @@ public Object apply(Object session) { if (session.getClass().getName().endsWith("cassandra4.TracingCqlSession")) { return session; } - return new TracingCqlSession((CqlSession) session); + return new TracingCqlSession((CqlSession) session, instrumenter()); } } diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java index 6d025304222e..75fd0ccc105e 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java @@ -16,7 +16,7 @@ import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import javax.annotation.Nullable; -final class CassandraAttributesExtractor +public final class CassandraAttributesExtractor implements AttributesExtractor { @Override diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java index 6f785e797bee..2e8d1fe1b26c 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java @@ -12,7 +12,7 @@ import java.net.SocketAddress; import javax.annotation.Nullable; -final class CassandraNetAttributesGetter +public final class CassandraNetAttributesGetter extends InetSocketAddressNetClientAttributesGetter { @Override diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java deleted file mode 100644 index 21d406c9bec2..000000000000 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.cassandra.v4_0; - -import com.datastax.oss.driver.api.core.cql.ExecutionInfo; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; - -public final class CassandraSingletons { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.cassandra-4.0"; - - // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException - private static final Instrumenter INSTRUMENTER; - - static { - CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); - - INSTRUMENTER = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - DbClientSpanNameExtractor.create(attributesGetter)) - .addAttributesExtractor( - SqlClientAttributesExtractor.builder(attributesGetter) - .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) - .build()) - .addAttributesExtractor( - NetClientAttributesExtractor.create(new CassandraNetAttributesGetter())) - .addAttributesExtractor(new CassandraAttributesExtractor()) - .buildInstrumenter(SpanKindExtractor.alwaysClient()); - } - - public static Instrumenter instrumenter() { - return INSTRUMENTER; - } - - private CassandraSingletons() {} -} diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java index d0731c2ffc31..4e3c874bbb10 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java @@ -10,7 +10,8 @@ import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import javax.annotation.Nullable; -final class CassandraSqlAttributesGetter implements SqlClientAttributesGetter { +public final class CassandraSqlAttributesGetter + implements SqlClientAttributesGetter { @Override public String system(CassandraRequest request) { diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetry.java new file mode 100644 index 000000000000..41516acea661 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetry.java @@ -0,0 +1,53 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.cassandra.v4_0; + +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; + +public final class CassandraTelemetry { + + public static CassandraTelemetryBuilder builder(OpenTelemetry openTelemetry) { + return new CassandraTelemetryBuilder(openTelemetry); + } + + private final Instrumenter instrumenter; + + CassandraTelemetry( + OpenTelemetry openTelemetry, + String instrumentationName, + boolean statementSanitizationEnabled) { + this.instrumenter = + createInstrumenter(openTelemetry, instrumentationName, statementSanitizationEnabled); + } + + private static Instrumenter createInstrumenter( + OpenTelemetry openTelemetry, String instrumenterName, boolean statementSanitizationEnabled) { + CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); + + return Instrumenter.builder( + openTelemetry, instrumenterName, DbClientSpanNameExtractor.create(attributesGetter)) + .addAttributesExtractor( + SqlClientAttributesExtractor.builder(attributesGetter) + .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) + .setStatementSanitizationEnabled(statementSanitizationEnabled) + .build()) + .addAttributesExtractor( + NetClientAttributesExtractor.create(new CassandraNetAttributesGetter())) + .addAttributesExtractor(new CassandraAttributesExtractor()) + .buildInstrumenter(SpanKindExtractor.alwaysClient()); + } + + public Instrumenter getInstrumenter() { + return instrumenter; + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java new file mode 100644 index 000000000000..986cb0de1b43 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java @@ -0,0 +1,36 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.cassandra.v4_0; + +import io.opentelemetry.api.OpenTelemetry; + +public class CassandraTelemetryBuilder { + + static final String DEFAULT_INSTRUMENTATION_NAME = "io.opentelemetry.cassandra"; + + private final OpenTelemetry openTelemetry; + + private String instrumentationName = DEFAULT_INSTRUMENTATION_NAME; + private boolean statementSanitizationEnabled; + + public CassandraTelemetryBuilder(OpenTelemetry openTelemetry) { + this.openTelemetry = openTelemetry; + } + + public CassandraTelemetryBuilder setInstrumentationName(String instrumentationName) { + this.instrumentationName = instrumentationName; + return this; + } + + public CassandraTelemetryBuilder setStatementSanitizationEnabled(boolean enabled) { + this.statementSanitizationEnabled = enabled; + return this; + } + + public CassandraTelemetry build() { + return new CassandraTelemetry(openTelemetry, instrumentationName, statementSanitizationEnabled); + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java index 4629487bff0d..5e592a12c15f 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java @@ -5,8 +5,6 @@ package io.opentelemetry.instrumentation.cassandra.v4_0; -import static io.opentelemetry.instrumentation.cassandra.v4_0.CassandraSingletons.instrumenter; - import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.DriverException; @@ -25,6 +23,7 @@ import com.datastax.oss.driver.api.core.type.reflect.GenericType; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; @@ -33,9 +32,12 @@ public class TracingCqlSession implements CqlSession { private final CqlSession session; + private final Instrumenter instrumenter; - public TracingCqlSession(CqlSession session) { + public TracingCqlSession( + CqlSession session, Instrumenter instrumenter) { this.session = session; + this.instrumenter = instrumenter; } @Override @@ -158,15 +160,15 @@ public RESULT execute( @Override public ResultSet execute(String query) { CassandraRequest request = CassandraRequest.create(session, query); - Context context = instrumenter().start(Context.current(), request); + Context context = instrumenter.start(Context.current(), request); ResultSet resultSet; try (Scope ignored = context.makeCurrent()) { resultSet = session.execute(query); } catch (RuntimeException e) { - instrumenter().end(context, request, getExecutionInfo(e), e); + instrumenter.end(context, request, getExecutionInfo(e), e); throw e; } - instrumenter().end(context, request, resultSet.getExecutionInfo(), null); + instrumenter.end(context, request, resultSet.getExecutionInfo(), null); return resultSet; } @@ -174,15 +176,15 @@ public ResultSet execute(String query) { public ResultSet execute(Statement statement) { String query = getQuery(statement); CassandraRequest request = CassandraRequest.create(session, query); - Context context = instrumenter().start(Context.current(), request); + Context context = instrumenter.start(Context.current(), request); ResultSet resultSet; try (Scope ignored = context.makeCurrent()) { resultSet = session.execute(statement); } catch (RuntimeException e) { - instrumenter().end(context, request, getExecutionInfo(e), e); + instrumenter.end(context, request, getExecutionInfo(e), e); throw e; } - instrumenter().end(context, request, resultSet.getExecutionInfo(), null); + instrumenter.end(context, request, resultSet.getExecutionInfo(), null); return resultSet; } @@ -199,21 +201,17 @@ public CompletionStage executeAsync(String query) { return executeAsync(request, () -> session.executeAsync(query)); } - private static CompletionStage executeAsync( + private CompletionStage executeAsync( CassandraRequest request, Supplier> query) { Context parentContext = Context.current(); - Context context = instrumenter().start(parentContext, request); + Context context = instrumenter.start(parentContext, request); try (Scope ignored = context.makeCurrent()) { CompletionStage stage = query.get(); return wrap( stage.whenComplete( (asyncResultSet, throwable) -> - instrumenter() - .end( - context, - request, - getExecutionInfo(asyncResultSet, throwable), - throwable)), + instrumenter.end( + context, request, getExecutionInfo(asyncResultSet, throwable), throwable)), parentContext); } } diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java new file mode 100644 index 000000000000..3ff49266416b --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; + +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraRequest; +import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraTelemetry; +import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; + +public final class CassandraSingletons { + // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException + private static final Instrumenter INSTRUMENTER; + + static { + CassandraTelemetry telemetry = + CassandraTelemetry.builder(GlobalOpenTelemetry.get()) + .setInstrumentationName("io.opentelemetry.cassandra-4.14") + .setStatementSanitizationEnabled(CommonConfig.get().isStatementSanitizationEnabled()) + .build(); + + INSTRUMENTER = telemetry.getInstrumenter(); + } + + public static Instrumenter instrumenter() { + return INSTRUMENTER; + } + + private CassandraSingletons() {} +} diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java index 8c1e070c5c96..2d2f5cae6403 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; +import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_14.CassandraSingletons.instrumenter; + import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; @@ -19,6 +21,6 @@ public Object apply(Object session) { if (session.getClass().getName().endsWith("cassandra4.TracingCqlSession")) { return session; } - return new TracingCqlSession((CqlSession) session); + return new TracingCqlSession((CqlSession) session, instrumenter()); } } diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java index c31e0dc83550..3a8c0f44a93c 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java @@ -8,13 +8,17 @@ import com.datastax.dse.driver.api.core.cql.reactive.ReactiveResultSet; import com.datastax.dse.driver.internal.core.cql.reactive.DefaultReactiveResultSet; import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.datastax.oss.driver.api.core.cql.Statement; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraRequest; public class TracingCqlSession extends io.opentelemetry.instrumentation.cassandra.v4_0.TracingCqlSession { - public TracingCqlSession(CqlSession session) { - super(session); + public TracingCqlSession( + CqlSession session, Instrumenter instrumenter) { + super(session, instrumenter); } @Override From 0ca0549ab9e86bde056b65e495766006d3c4b243 Mon Sep 17 00:00:00 2001 From: SimoneGiusso Date: Tue, 15 Nov 2022 22:56:19 +0100 Subject: [PATCH 04/18] sync with main branch --- .../cassandra-4.0/javaagent/build.gradle.kts | 2 -- .../v4_0/CassandraAttributesExtractor.java | 4 ++-- .../v4_0/CassandraNetAttributesGetter.java | 4 ++-- .../cassandra/v4_0/CassandraRequest.java | 2 +- .../cassandra/v4_0/CassandraSingletons.java | 2 -- .../v4_0/CassandraSqlAttributesGetter.java | 5 ++--- .../cassandra/v4_0/CassandraTelemetry.java | 2 +- .../v4_0/CassandraTelemetryBuilder.java | 5 ++++- .../cassandra/v4_0/CompletionStageFunction.java | 1 - .../cassandra/v4_0/TracingCqlSession.java | 2 +- .../cassandra-4.0/library/build.gradle.kts | 16 ---------------- .../cassandra-4.14/javaagent/build.gradle.kts | 2 +- .../cassandra/v4_14/CassandraSingletons.java | 6 +++--- .../cassandra/v4_14/CompletionStageFunction.java | 2 +- .../cassandra/v4_14/TracingCqlSession.java | 4 ++-- .../src/test/groovy/CassandraClientTest.groovy | 6 +++--- settings.gradle.kts | 1 - 17 files changed, 23 insertions(+), 43 deletions(-) rename instrumentation/cassandra/cassandra-4.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java (96%) rename instrumentation/cassandra/cassandra-4.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java (93%) rename instrumentation/cassandra/cassandra-4.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/cassandra/v4_0/CassandraRequest.java (87%) rename instrumentation/cassandra/cassandra-4.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java (85%) rename instrumentation/cassandra/cassandra-4.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/cassandra/v4_0/CassandraTelemetry.java (97%) rename instrumentation/cassandra/cassandra-4.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java (84%) rename instrumentation/cassandra/cassandra-4.0/{library/src/main/java/io/opentelemetry => javaagent/src/main/java/io/opentelemetry/javaagent}/instrumentation/cassandra/v4_0/TracingCqlSession.java (99%) delete mode 100644 instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index 97bc74ec5a33..aad53b864a45 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -12,8 +12,6 @@ muzzle { } dependencies { - implementation(project(":instrumentation:cassandra:cassandra-4.0:library")) - library("com.datastax.oss:java-driver-core:4.0.0") compileOnly("com.google.auto.value:auto-value-annotations") diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java similarity index 96% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java rename to instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java index 75fd0ccc105e..be41c016b491 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra.v4_0; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.config.DefaultDriverOption; import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; @@ -16,7 +16,7 @@ import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import javax.annotation.Nullable; -public final class CassandraAttributesExtractor +final class CassandraAttributesExtractor implements AttributesExtractor { @Override diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java similarity index 93% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java index 114251448a0b..373c2da7389e 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra.v4_0; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.datastax.oss.driver.api.core.metadata.Node; @@ -12,7 +12,7 @@ import java.net.SocketAddress; import javax.annotation.Nullable; -public final class CassandraNetAttributesGetter +final class CassandraNetAttributesGetter extends InetSocketAddressNetClientAttributesGetter { @Override diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraRequest.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java similarity index 87% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraRequest.java rename to instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java index 134f060b94b5..9c783cc3f196 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraRequest.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra.v4_0; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.session.Session; import com.google.auto.value.AutoValue; diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java index 202667084e7a..f9b66b2a0079 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -8,8 +8,6 @@ import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraRequest; -import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraTelemetry; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; public final class CassandraSingletons { diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java similarity index 85% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java index 4e3c874bbb10..686966166f3c 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java @@ -3,15 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra.v4_0; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.CqlIdentifier; import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesGetter; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import javax.annotation.Nullable; -public final class CassandraSqlAttributesGetter - implements SqlClientAttributesGetter { +final class CassandraSqlAttributesGetter implements SqlClientAttributesGetter { @Override public String system(CassandraRequest request) { diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java similarity index 97% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetry.java rename to instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java index 41516acea661..c6b5ce2dc0bc 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetry.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra.v4_0; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.OpenTelemetry; diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java similarity index 84% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java rename to instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java index 986cb0de1b43..4d131a111726 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java @@ -3,8 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra.v4_0; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; public class CassandraTelemetryBuilder { @@ -20,11 +21,13 @@ public CassandraTelemetryBuilder(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; } + @CanIgnoreReturnValue public CassandraTelemetryBuilder setInstrumentationName(String instrumentationName) { this.instrumentationName = instrumentationName; return this; } + @CanIgnoreReturnValue public CassandraTelemetryBuilder setStatementSanitizationEnabled(boolean enabled) { this.statementSanitizationEnabled = enabled; return this; diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java index 7f8c2ec5b77a..144bb3020b96 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java @@ -8,7 +8,6 @@ import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraSingletons.instrumenter; import com.datastax.oss.driver.api.core.CqlSession; -import io.opentelemetry.instrumentation.cassandra.v4_0.TracingCqlSession; import java.util.function.Function; public class CompletionStageFunction implements Function { diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java similarity index 99% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java rename to instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java index 5e592a12c15f..67d53883565a 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_0/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra.v4_0; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; diff --git a/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts deleted file mode 100644 index 0910f423100e..000000000000 --- a/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts +++ /dev/null @@ -1,16 +0,0 @@ -plugins { - id("otel.library-instrumentation") -} - -dependencies { - library("com.datastax.oss:java-driver-core:4.0.0") - - compileOnly("com.google.auto.value:auto-value-annotations") - annotationProcessor("com.google.auto.value:auto-value") -} - -tasks { - test { - usesService(gradle.sharedServices.registrations["testcontainersBuildService"].getService()) - } -} diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts index b13321a2be7c..b938128dc450 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts @@ -12,7 +12,7 @@ muzzle { } dependencies { - implementation(project(":instrumentation:cassandra:cassandra-4.0:library")) + implementation(project(":instrumentation:cassandra:cassandra-4.0:javaagent")) library("com.datastax.oss:java-driver-core:4.14.1") diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java index 3ff49266416b..2fe41f1cba72 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java @@ -8,11 +8,11 @@ import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraRequest; -import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraTelemetry; +import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; +import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraTelemetry; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; -public final class CassandraSingletons { +final class CassandraSingletons { // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException private static final Instrumenter INSTRUMENTER; diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java index 2d2f5cae6403..449130bbdcfa 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java @@ -10,7 +10,7 @@ import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; -public class CompletionStageFunction implements Function { +class CompletionStageFunction implements Function { @Override public Object apply(Object session) { diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java index 3a8c0f44a93c..f4151f0be7e6 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java @@ -11,10 +11,10 @@ import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.datastax.oss.driver.api.core.cql.Statement; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.cassandra.v4_0.CassandraRequest; +import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; public class TracingCqlSession - extends io.opentelemetry.instrumentation.cassandra.v4_0.TracingCqlSession { + extends io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession { public TracingCqlSession( CqlSession session, Instrumenter instrumenter) { diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy b/instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy index e29d3239545e..6bebc6a89cbb 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy @@ -96,9 +96,9 @@ class CassandraClientTest extends AgentInstrumentationSpecification { childOf((SpanData) parentSpan) } attributes { - "$SemanticAttributes.NET_PEER_NAME" "localhost" - "$SemanticAttributes.NET_PEER_IP" "127.0.0.1" - "$SemanticAttributes.NET_PEER_PORT" cassandraPort + "$SemanticAttributes.NET_SOCK_PEER_ADDR" "127.0.0.1" + "$SemanticAttributes.NET_SOCK_PEER_NAME" "localhost" + "$SemanticAttributes.NET_SOCK_PEER_PORT" cassandraPort "$SemanticAttributes.DB_SYSTEM" "cassandra" "$SemanticAttributes.DB_NAME" keyspace "$SemanticAttributes.DB_STATEMENT" statement diff --git a/settings.gradle.kts b/settings.gradle.kts index c4fddf6fb7e3..a709d144bc11 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -173,7 +173,6 @@ include(":instrumentation:azure-core:azure-core-1.19:javaagent") include(":instrumentation:azure-core:azure-core-1.19:library-instrumentation-shaded") include(":instrumentation:cassandra:cassandra-3.0:javaagent") include(":instrumentation:cassandra:cassandra-4.0:javaagent") -include(":instrumentation:cassandra:cassandra-4.0:library") include(":instrumentation:cassandra:cassandra-4.14:javaagent") include(":instrumentation:cdi-testing") include(":instrumentation:graphql-java-12.0:javaagent") From 8841346725509844076131c1c94cee1f9da75c49 Mon Sep 17 00:00:00 2001 From: SimoneGiusso Date: Wed, 16 Nov 2022 23:46:05 +0100 Subject: [PATCH 05/18] WIP: Fix tests --- .../cassandra/cassandra-4.14/javaagent/build.gradle.kts | 3 +-- .../instrumentation/cassandra/v4_14/CassandraSingletons.java | 2 +- .../cassandra/v4_14/CompletionStageFunction.java | 2 +- .../instrumentation/cassandra/v4_14/TracingCqlSession.java | 5 ++++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts index b938128dc450..02e8f91d4f8b 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts @@ -6,8 +6,7 @@ muzzle { pass { group.set("com.datastax.oss") module.set("java-driver-core") - versions.set("[4.14,)") - assertInverse.set(true) + versions.set("[4.4,]") } } diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java index 2fe41f1cba72..a74493722928 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java @@ -8,9 +8,9 @@ import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraTelemetry; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; final class CassandraSingletons { // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java index 449130bbdcfa..2d2f5cae6403 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java @@ -10,7 +10,7 @@ import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; -class CompletionStageFunction implements Function { +public class CompletionStageFunction implements Function { @Override public Object apply(Object session) { diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java index f4151f0be7e6..540f961ac8b0 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java @@ -16,13 +16,16 @@ public class TracingCqlSession extends io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession { + private final CqlSession tracingSession; + public TracingCqlSession( CqlSession session, Instrumenter instrumenter) { super(session, instrumenter); + tracingSession = session; } @Override public ReactiveResultSet executeReactive(Statement statement) { - return new DefaultReactiveResultSet(() -> executeAsync(statement)); + return new DefaultReactiveResultSet(() -> tracingSession.executeAsync(statement)); } } From 5f03349d0f90f7e89ebd2d00e69385a6e62aa599 Mon Sep 17 00:00:00 2001 From: SimoneGiusso Date: Thu, 17 Nov 2022 21:18:29 +0100 Subject: [PATCH 06/18] WIP: use lowest java-driver-core version that supports reactive --- .../javaagent/build.gradle.kts | 2 +- .../cassandra/v4_4}/CassandraClientInstrumentationModule.java | 4 ++-- .../instrumentation/cassandra/v4_4}/CassandraSingletons.java | 4 ++-- .../cassandra/v4_4}/CompletionStageFunction.java | 4 ++-- .../cassandra/v4_4}/SessionBuilderInstrumentation.java | 2 +- .../instrumentation/cassandra/v4_4}/TracingCqlSession.java | 2 +- .../javaagent/src/test/groovy/CassandraClientTest.groovy | 0 settings.gradle.kts | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) rename instrumentation/cassandra/{cassandra-4.14 => cassandra-4.4}/javaagent/build.gradle.kts (91%) rename instrumentation/cassandra/{cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14 => cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4}/CassandraClientInstrumentationModule.java (94%) rename instrumentation/cassandra/{cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14 => cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4}/CassandraSingletons.java (99%) rename instrumentation/cassandra/{cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14 => cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4}/CompletionStageFunction.java (93%) rename instrumentation/cassandra/{cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14 => cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4}/SessionBuilderInstrumentation.java (99%) rename instrumentation/cassandra/{cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14 => cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4}/TracingCqlSession.java (99%) rename instrumentation/cassandra/{cassandra-4.14 => cassandra-4.4}/javaagent/src/test/groovy/CassandraClientTest.groovy (100%) diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts similarity index 91% rename from instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts rename to instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts index 02e8f91d4f8b..434da3fa854d 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts @@ -13,7 +13,7 @@ muzzle { dependencies { implementation(project(":instrumentation:cassandra:cassandra-4.0:javaagent")) - library("com.datastax.oss:java-driver-core:4.14.1") + library("com.datastax.oss:java-driver-core:4.4.0") compileOnly("com.google.auto.value:auto-value-annotations") annotationProcessor("com.google.auto.value:auto-value") diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraClientInstrumentationModule.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java similarity index 94% rename from instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraClientInstrumentationModule.java rename to instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java index eaee3e0acaa0..b16b696922e3 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraClientInstrumentationModule.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; import static java.util.Collections.singletonList; @@ -15,7 +15,7 @@ @AutoService(InstrumentationModule.class) public class CassandraClientInstrumentationModule extends InstrumentationModule { public CassandraClientInstrumentationModule() { - super("cassandra", "cassandra-4.14"); + super("cassandra", "cassandra-4.4"); } @Override diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java similarity index 99% rename from instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java rename to instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java index a74493722928..d57bc58aa3af 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; @@ -19,7 +19,7 @@ final class CassandraSingletons { static { CassandraTelemetry telemetry = CassandraTelemetry.builder(GlobalOpenTelemetry.get()) - .setInstrumentationName("io.opentelemetry.cassandra-4.14") + .setInstrumentationName("io.opentelemetry.cassandra-4.4") .setStatementSanitizationEnabled(CommonConfig.get().isStatementSanitizationEnabled()) .build(); diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java similarity index 93% rename from instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java rename to instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java index 2d2f5cae6403..e7677c1a8f4a 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; -import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_14.CassandraSingletons.instrumenter; +import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_4.CassandraSingletons.instrumenter; import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/SessionBuilderInstrumentation.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/SessionBuilderInstrumentation.java similarity index 99% rename from instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/SessionBuilderInstrumentation.java rename to instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/SessionBuilderInstrumentation.java index 88a1094d1896..913cc61123e4 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/SessionBuilderInstrumentation.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/SessionBuilderInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java similarity index 99% rename from instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java rename to instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java index 540f961ac8b0..31e1da1fa55c 100644 --- a/instrumentation/cassandra/cassandra-4.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_14/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_14; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; import com.datastax.dse.driver.api.core.cql.reactive.ReactiveResultSet; import com.datastax.dse.driver.internal.core.cql.reactive.DefaultReactiveResultSet; diff --git a/instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy similarity index 100% rename from instrumentation/cassandra/cassandra-4.14/javaagent/src/test/groovy/CassandraClientTest.groovy rename to instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy diff --git a/settings.gradle.kts b/settings.gradle.kts index a709d144bc11..91f87eb7e579 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -173,7 +173,7 @@ include(":instrumentation:azure-core:azure-core-1.19:javaagent") include(":instrumentation:azure-core:azure-core-1.19:library-instrumentation-shaded") include(":instrumentation:cassandra:cassandra-3.0:javaagent") include(":instrumentation:cassandra:cassandra-4.0:javaagent") -include(":instrumentation:cassandra:cassandra-4.14:javaagent") +include(":instrumentation:cassandra:cassandra-4.4:javaagent") include(":instrumentation:cdi-testing") include(":instrumentation:graphql-java-12.0:javaagent") include(":instrumentation:graphql-java-12.0:library") From 15172a46789fe31e155932bd94524affd7faac64 Mon Sep 17 00:00:00 2001 From: SimoneGiusso Date: Thu, 24 Nov 2022 23:06:39 +0100 Subject: [PATCH 07/18] WIP: create common test package + wrap original TracingCqlSession --- ...ntelemetry-instrumentation-annotations.txt | 20 +-- .../cassandra-4.0/javaagent/build.gradle.kts | 2 + .../test/groovy/CassandraClientTest.groovy | 147 +-------------- .../cassandra-4.4/javaagent/build.gradle.kts | 1 + .../v4_4/CompletionStageFunction.java | 5 +- .../cassandra/v4_4/TracingCqlSession.java | 167 ++++++++++++++++-- .../test/groovy/CassandraClientTest.groovy | 81 +-------- .../cassandra/testing/build.gradle.kts | 10 ++ .../AbstractCassandraClientTest.groovy | 155 ++++++++++++++++ settings.gradle.kts | 1 + 10 files changed, 332 insertions(+), 257 deletions(-) create mode 100644 instrumentation/cassandra/testing/build.gradle.kts create mode 100644 instrumentation/cassandra/testing/src/main/groovy/io/opentelemetry/instrumentation/cassandra/AbstractCassandraClientTest.groovy diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt index 974ac4b68381..df26146497bf 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt @@ -1,20 +1,2 @@ Comparing source compatibility of against -+++ NEW ANNOTATION: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.annotations.SpanAttribute (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW INTERFACE: java.lang.annotation.Annotation - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String value() - +++ NEW ANNOTATION: java.lang.annotation.Target - +++ NEW ELEMENT: value=java.lang.annotation.ElementType.PARAMETER (+) - +++ NEW ANNOTATION: java.lang.annotation.Retention - +++ NEW ELEMENT: value=java.lang.annotation.RetentionPolicy.RUNTIME (+) -+++ NEW ANNOTATION: PUBLIC(+) ABSTRACT(+) io.opentelemetry.instrumentation.annotations.WithSpan (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW INTERFACE: java.lang.annotation.Annotation - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.api.trace.SpanKind kind() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String value() - +++ NEW ANNOTATION: java.lang.annotation.Target - +++ NEW ELEMENT: value=java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.CONSTRUCTOR (+) - +++ NEW ANNOTATION: java.lang.annotation.Retention - +++ NEW ELEMENT: value=java.lang.annotation.RetentionPolicy.RUNTIME (+) +No changes. \ No newline at end of file diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index aad53b864a45..f7b28692f21a 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -16,6 +16,8 @@ dependencies { compileOnly("com.google.auto.value:auto-value-annotations") annotationProcessor("com.google.auto.value:auto-value") + + testImplementation(project(":instrumentation:cassandra:testing")) } tasks { diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/groovy/CassandraClientTest.groovy b/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/groovy/CassandraClientTest.groovy index 2f81f3943a0f..97c266e3d3de 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/groovy/CassandraClientTest.groovy +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/groovy/CassandraClientTest.groovy @@ -3,151 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -import com.datastax.oss.driver.api.core.CqlSession -import com.datastax.oss.driver.api.core.config.DefaultDriverOption -import com.datastax.oss.driver.api.core.config.DriverConfigLoader -import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader -import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import io.opentelemetry.instrumentation.test.asserts.TraceAssert -import io.opentelemetry.sdk.trace.data.SpanData -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.testcontainers.containers.GenericContainer -import org.testcontainers.containers.output.Slf4jLogConsumer -import spock.lang.Shared +import io.opentelemetry.instrumentation.cassandra.AbstractCassandraClientTest -import java.time.Duration +class CassandraClientTest extends AbstractCassandraClientTest { -import static io.opentelemetry.api.trace.SpanKind.CLIENT - -class CassandraClientTest extends AgentInstrumentationSpecification { - private static final Logger logger = LoggerFactory.getLogger(CassandraClientTest) - - @Shared - GenericContainer cassandra - @Shared - int cassandraPort - - def setupSpec() { - cassandra = new GenericContainer("cassandra:4.0") - // limit memory usage - .withEnv("JVM_OPTS", "-Xmx128m -Xms128m") - .withExposedPorts(9042) - .withLogConsumer(new Slf4jLogConsumer(logger)) - .withStartupTimeout(Duration.ofSeconds(120)) - cassandra.start() - - cassandraPort = cassandra.getMappedPort(9042) - } - - def cleanupSpec() { - cassandra.stop() - } - - def "test sync"() { - setup: - CqlSession session = getSession(keyspace) - - session.execute(statement) - - expect: - assertTraces(1) { - trace(0, 1) { - cassandraSpan(it, 0, spanName, expectedStatement, operation, keyspace, table) - } - } - - cleanup: - session.close() - - where: - keyspace | statement | expectedStatement | spanName | operation | table - null | "DROP KEYSPACE IF EXISTS sync_test" | "DROP KEYSPACE IF EXISTS sync_test" | "DB Query" | null | null - null | "CREATE KEYSPACE sync_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | "CREATE KEYSPACE sync_test WITH REPLICATION = {?:?, ?:?}" | "DB Query" | null | null - "sync_test" | "CREATE TABLE sync_test.users ( id UUID PRIMARY KEY, name text )" | "CREATE TABLE sync_test.users ( id UUID PRIMARY KEY, name text )" | "sync_test" | null | null - "sync_test" | "INSERT INTO sync_test.users (id, name) values (uuid(), 'alice')" | "INSERT INTO sync_test.users (id, name) values (uuid(), ?)" | "INSERT sync_test.users" | "INSERT" | "sync_test.users" - "sync_test" | "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "SELECT * FROM users where name = ? ALLOW FILTERING" | "SELECT sync_test.users" | "SELECT" | "users" - } - - def "test async"() { - setup: - CqlSession session = getSession(keyspace) - - runWithSpan("parent") { - session.executeAsync(statement).toCompletableFuture().whenComplete({ result, throwable -> - runWithSpan("child") {} - }).get() - } - - expect: - assertTraces(1) { - trace(0, 3) { - span(0) { - name "parent" - kind SpanKind.INTERNAL - hasNoParent() - } - cassandraSpan(it, 1, spanName, expectedStatement, operation, keyspace, table, span(0)) - span(2) { - name "child" - kind SpanKind.INTERNAL - childOf span(0) - } - } - } - - cleanup: - session.close() - - where: - keyspace | statement | expectedStatement | spanName | operation | table - null | "DROP KEYSPACE IF EXISTS async_test" | "DROP KEYSPACE IF EXISTS async_test" | "DB Query" | null | null - null | "CREATE KEYSPACE async_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | "CREATE KEYSPACE async_test WITH REPLICATION = {?:?, ?:?}" | "DB Query" | null | null - "async_test" | "CREATE TABLE async_test.users ( id UUID PRIMARY KEY, name text )" | "CREATE TABLE async_test.users ( id UUID PRIMARY KEY, name text )" | "async_test" | null | null - "async_test" | "INSERT INTO async_test.users (id, name) values (uuid(), 'alice')" | "INSERT INTO async_test.users (id, name) values (uuid(), ?)" | "INSERT async_test.users" | "INSERT" | "async_test.users" - "async_test" | "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "SELECT * FROM users where name = ? ALLOW FILTERING" | "SELECT async_test.users" | "SELECT" | "users" - } - - def cassandraSpan(TraceAssert trace, int index, String spanName, String statement, String operation, String keyspace, String table, Object parentSpan = null) { - trace.span(index) { - name spanName - kind CLIENT - if (parentSpan == null) { - hasNoParent() - } else { - childOf((SpanData) parentSpan) - } - attributes { - "$SemanticAttributes.NET_SOCK_PEER_ADDR" "127.0.0.1" - "$SemanticAttributes.NET_SOCK_PEER_NAME" "localhost" - "$SemanticAttributes.NET_SOCK_PEER_PORT" cassandraPort - "$SemanticAttributes.DB_SYSTEM" "cassandra" - "$SemanticAttributes.DB_NAME" keyspace - "$SemanticAttributes.DB_STATEMENT" statement - "$SemanticAttributes.DB_OPERATION" operation - "$SemanticAttributes.DB_CASSANDRA_CONSISTENCY_LEVEL" "LOCAL_ONE" - "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_DC" "datacenter1" - "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_ID" String - "$SemanticAttributes.DB_CASSANDRA_IDEMPOTENCE" Boolean - "$SemanticAttributes.DB_CASSANDRA_PAGE_SIZE" 5000 - "$SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT" 0 - // the SqlStatementSanitizer can't handle CREATE statements yet - "$SemanticAttributes.DB_CASSANDRA_TABLE" table - } - } - } - - def getSession(String keyspace) { - DriverConfigLoader configLoader = DefaultDriverConfigLoader.builder() - .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(0)) - .build() - return CqlSession.builder() - .addContactPoint(new InetSocketAddress("localhost", cassandraPort)) - .withConfigLoader(configLoader) - .withLocalDatacenter("datacenter1") - .withKeyspace((String) keyspace) - .build() - } } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts index 434da3fa854d..cdecd70df255 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { annotationProcessor("com.google.auto.value:auto-value") testImplementation("io.projectreactor:reactor-core:3.4.21") + testImplementation(project(":instrumentation:cassandra:testing")) } tasks { diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java index e7677c1a8f4a..c1c019003087 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java @@ -5,8 +5,6 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; -import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_4.CassandraSingletons.instrumenter; - import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; @@ -21,6 +19,7 @@ public Object apply(Object session) { if (session.getClass().getName().endsWith("cassandra4.TracingCqlSession")) { return session; } - return new TracingCqlSession((CqlSession) session, instrumenter()); + + return new TracingCqlSession((CqlSession) session); } } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java index 31e1da1fa55c..7cc78c866c57 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java @@ -7,25 +7,170 @@ import com.datastax.dse.driver.api.core.cql.reactive.ReactiveResultSet; import com.datastax.dse.driver.internal.core.cql.reactive.DefaultReactiveResultSet; +import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import com.datastax.oss.driver.api.core.context.DriverContext; +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.datastax.oss.driver.api.core.cql.PrepareRequest; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.cql.Statement; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; +import com.datastax.oss.driver.api.core.metadata.Metadata; +import com.datastax.oss.driver.api.core.metrics.Metrics; +import com.datastax.oss.driver.api.core.session.Request; +import com.datastax.oss.driver.api.core.type.reflect.GenericType; +import java.util.Optional; +import java.util.concurrent.CompletionStage; +import javax.annotation.Nullable; -public class TracingCqlSession - extends io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession { +public class TracingCqlSession implements CqlSession { - private final CqlSession tracingSession; + private final CqlSession originalTracingCqlSession; - public TracingCqlSession( - CqlSession session, Instrumenter instrumenter) { - super(session, instrumenter); - tracingSession = session; + public TracingCqlSession(CqlSession session) { + originalTracingCqlSession = session; + } + + @Override + public PreparedStatement prepare(SimpleStatement statement) { + return originalTracingCqlSession.prepare(statement); + } + + @Override + public PreparedStatement prepare(String query) { + return originalTracingCqlSession.prepare(query); + } + + @Override + public PreparedStatement prepare(PrepareRequest request) { + return originalTracingCqlSession.prepare(request); + } + + @Override + public CompletionStage prepareAsync(SimpleStatement statement) { + return originalTracingCqlSession.prepareAsync(statement); + } + + @Override + public CompletionStage prepareAsync(String query) { + return originalTracingCqlSession.prepareAsync(query); + } + + @Override + public CompletionStage prepareAsync(PrepareRequest request) { + return originalTracingCqlSession.prepareAsync(request); + } + + @Override + public String getName() { + return originalTracingCqlSession.getName(); + } + + @Override + public Metadata getMetadata() { + return originalTracingCqlSession.getMetadata(); + } + + @Override + public boolean isSchemaMetadataEnabled() { + return originalTracingCqlSession.isSchemaMetadataEnabled(); + } + + @Override + public CompletionStage setSchemaMetadataEnabled(@Nullable Boolean newValue) { + return originalTracingCqlSession.setSchemaMetadataEnabled(newValue); + } + + @Override + public CompletionStage refreshSchemaAsync() { + return originalTracingCqlSession.refreshSchemaAsync(); + } + + @Override + public Metadata refreshSchema() { + return originalTracingCqlSession.refreshSchema(); + } + + @Override + public CompletionStage checkSchemaAgreementAsync() { + return originalTracingCqlSession.checkSchemaAgreementAsync(); + } + + @Override + public boolean checkSchemaAgreement() { + return originalTracingCqlSession.checkSchemaAgreement(); + } + + @Override + public DriverContext getContext() { + return originalTracingCqlSession.getContext(); + } + + @Override + public Optional getKeyspace() { + return originalTracingCqlSession.getKeyspace(); + } + + @Override + public Optional getMetrics() { + return originalTracingCqlSession.getMetrics(); + } + + @Override + public CompletionStage closeFuture() { + return originalTracingCqlSession.closeFuture(); + } + + @Override + public boolean isClosed() { + return originalTracingCqlSession.isClosed(); + } + + @Override + public CompletionStage closeAsync() { + return originalTracingCqlSession.closeAsync(); + } + + @Override + public CompletionStage forceCloseAsync() { + return originalTracingCqlSession.forceCloseAsync(); + } + + @Override + public void close() { + originalTracingCqlSession.close(); + } + + @Override + @Nullable + public RESULT execute( + REQUEST request, GenericType resultType) { + return originalTracingCqlSession.execute(request, resultType); + } + + @Override + public ResultSet execute(String query) { + return originalTracingCqlSession.execute(query); + } + + @Override + public ResultSet execute(Statement statement) { + return originalTracingCqlSession.execute(statement); + } + + @Override + public CompletionStage executeAsync(Statement statement) { + return originalTracingCqlSession.executeAsync(statement); + } + + @Override + public CompletionStage executeAsync(String query) { + return originalTracingCqlSession.executeAsync(query); } @Override public ReactiveResultSet executeReactive(Statement statement) { - return new DefaultReactiveResultSet(() -> tracingSession.executeAsync(statement)); + return new DefaultReactiveResultSet(() -> originalTracingCqlSession.executeAsync(statement)); } } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy index 6bebc6a89cbb..775d3a55557a 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy @@ -4,48 +4,11 @@ */ import com.datastax.oss.driver.api.core.CqlSession -import com.datastax.oss.driver.api.core.config.DefaultDriverOption -import com.datastax.oss.driver.api.core.config.DriverConfigLoader -import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import io.opentelemetry.instrumentation.test.asserts.TraceAssert -import io.opentelemetry.sdk.trace.data.SpanData -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes +import io.opentelemetry.instrumentation.cassandra.AbstractCassandraClientTest import reactor.core.publisher.Flux -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.testcontainers.containers.GenericContainer -import org.testcontainers.containers.output.Slf4jLogConsumer -import spock.lang.Shared -import java.time.Duration - -import static io.opentelemetry.api.trace.SpanKind.CLIENT - -class CassandraClientTest extends AgentInstrumentationSpecification { - private static final Logger logger = LoggerFactory.getLogger(CassandraClientTest) - - @Shared - GenericContainer cassandra - @Shared - int cassandraPort - - def setupSpec() { - cassandra = new GenericContainer("cassandra:4.0") - // limit memory usage - .withEnv("JVM_OPTS", "-Xmx128m -Xms128m") - .withExposedPorts(9042) - .withLogConsumer(new Slf4jLogConsumer(logger)) - .withStartupTimeout(Duration.ofSeconds(120)) - cassandra.start() - - cassandraPort = cassandra.getMappedPort(9042) - } - - def cleanupSpec() { - cassandra.stop() - } +class CassandraClientTest extends AbstractCassandraClientTest { def "test reactive"() { setup: @@ -86,44 +49,4 @@ class CassandraClientTest extends AgentInstrumentationSpecification { "reactive_test" | "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "SELECT * FROM users where name = ? ALLOW FILTERING" | "SELECT reactive_test.users" | "SELECT" | "users" } - def cassandraSpan(TraceAssert trace, int index, String spanName, String statement, String operation, String keyspace, String table, Object parentSpan = null) { - trace.span(index) { - name spanName - kind CLIENT - if (parentSpan == null) { - hasNoParent() - } else { - childOf((SpanData) parentSpan) - } - attributes { - "$SemanticAttributes.NET_SOCK_PEER_ADDR" "127.0.0.1" - "$SemanticAttributes.NET_SOCK_PEER_NAME" "localhost" - "$SemanticAttributes.NET_SOCK_PEER_PORT" cassandraPort - "$SemanticAttributes.DB_SYSTEM" "cassandra" - "$SemanticAttributes.DB_NAME" keyspace - "$SemanticAttributes.DB_STATEMENT" statement - "$SemanticAttributes.DB_OPERATION" operation - "$SemanticAttributes.DB_CASSANDRA_CONSISTENCY_LEVEL" "LOCAL_ONE" - "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_DC" "datacenter1" - "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_ID" String - "$SemanticAttributes.DB_CASSANDRA_IDEMPOTENCE" Boolean - "$SemanticAttributes.DB_CASSANDRA_PAGE_SIZE" 5000 - "$SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT" 0 - // the SqlStatementSanitizer can't handle CREATE statements yet - "$SemanticAttributes.DB_CASSANDRA_TABLE" table - } - } - } - - def getSession(String keyspace) { - DriverConfigLoader configLoader = DefaultDriverConfigLoader.builder() - .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(0)) - .build() - return CqlSession.builder() - .addContactPoint(new InetSocketAddress("localhost", cassandraPort)) - .withConfigLoader(configLoader) - .withLocalDatacenter("datacenter1") - .withKeyspace((String) keyspace) - .build() - } } diff --git a/instrumentation/cassandra/testing/build.gradle.kts b/instrumentation/cassandra/testing/build.gradle.kts new file mode 100644 index 000000000000..da95440e8184 --- /dev/null +++ b/instrumentation/cassandra/testing/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { + api(project(":testing-common")) + + implementation("org.testcontainers:testcontainers:1.17.5") + implementation("com.datastax.oss:java-driver-core:4.4.0") +} diff --git a/instrumentation/cassandra/testing/src/main/groovy/io/opentelemetry/instrumentation/cassandra/AbstractCassandraClientTest.groovy b/instrumentation/cassandra/testing/src/main/groovy/io/opentelemetry/instrumentation/cassandra/AbstractCassandraClientTest.groovy new file mode 100644 index 000000000000..d8f618339f42 --- /dev/null +++ b/instrumentation/cassandra/testing/src/main/groovy/io/opentelemetry/instrumentation/cassandra/AbstractCassandraClientTest.groovy @@ -0,0 +1,155 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.cassandra + +import com.datastax.oss.driver.api.core.CqlSession +import com.datastax.oss.driver.api.core.config.DefaultDriverOption +import com.datastax.oss.driver.api.core.config.DriverConfigLoader +import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader +import io.opentelemetry.api.trace.SpanKind +import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification +import io.opentelemetry.instrumentation.test.asserts.TraceAssert +import io.opentelemetry.sdk.trace.data.SpanData +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.testcontainers.containers.GenericContainer +import org.testcontainers.containers.output.Slf4jLogConsumer +import spock.lang.Shared + +import java.time.Duration + +import static io.opentelemetry.api.trace.SpanKind.CLIENT + +abstract class AbstractCassandraClientTest extends AgentInstrumentationSpecification { + private static final Logger logger = LoggerFactory.getLogger(AbstractCassandraClientTest) + + @Shared + GenericContainer cassandra + @Shared + int cassandraPort + + def setupSpec() { + cassandra = new GenericContainer("cassandra:4.0") + // limit memory usage + .withEnv("JVM_OPTS", "-Xmx128m -Xms128m") + .withExposedPorts(9042) + .withLogConsumer(new Slf4jLogConsumer(logger)) + .withStartupTimeout(Duration.ofSeconds(120)) + cassandra.start() + + cassandraPort = cassandra.getMappedPort(9042) + } + + def cleanupSpec() { + cassandra.stop() + } + + def "test sync"() { + setup: + CqlSession session = getSession(keyspace) + + session.execute(statement) + + expect: + assertTraces(1) { + trace(0, 1) { + cassandraSpan(it, 0, spanName, expectedStatement, operation, keyspace, table) + } + } + + cleanup: + session.close() + + where: + keyspace | statement | expectedStatement | spanName | operation | table + null | "DROP KEYSPACE IF EXISTS sync_test" | "DROP KEYSPACE IF EXISTS sync_test" | "DB Query" | null | null + null | "CREATE KEYSPACE sync_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | "CREATE KEYSPACE sync_test WITH REPLICATION = {?:?, ?:?}" | "DB Query" | null | null + "sync_test" | "CREATE TABLE sync_test.users ( id UUID PRIMARY KEY, name text )" | "CREATE TABLE sync_test.users ( id UUID PRIMARY KEY, name text )" | "sync_test" | null | null + "sync_test" | "INSERT INTO sync_test.users (id, name) values (uuid(), 'alice')" | "INSERT INTO sync_test.users (id, name) values (uuid(), ?)" | "INSERT sync_test.users" | "INSERT" | "sync_test.users" + "sync_test" | "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "SELECT * FROM users where name = ? ALLOW FILTERING" | "SELECT sync_test.users" | "SELECT" | "users" + } + + def "test async"() { + setup: + CqlSession session = getSession(keyspace) + + runWithSpan("parent") { + session.executeAsync(statement).toCompletableFuture().whenComplete({ result, throwable -> + runWithSpan("child") {} + }).get() + } + + expect: + assertTraces(1) { + trace(0, 3) { + span(0) { + name "parent" + kind SpanKind.INTERNAL + hasNoParent() + } + cassandraSpan(it, 1, spanName, expectedStatement, operation, keyspace, table, span(0)) + span(2) { + name "child" + kind SpanKind.INTERNAL + childOf span(0) + } + } + } + + cleanup: + session.close() + + where: + keyspace | statement | expectedStatement | spanName | operation | table + null | "DROP KEYSPACE IF EXISTS async_test" | "DROP KEYSPACE IF EXISTS async_test" | "DB Query" | null | null + null | "CREATE KEYSPACE async_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | "CREATE KEYSPACE async_test WITH REPLICATION = {?:?, ?:?}" | "DB Query" | null | null + "async_test" | "CREATE TABLE async_test.users ( id UUID PRIMARY KEY, name text )" | "CREATE TABLE async_test.users ( id UUID PRIMARY KEY, name text )" | "async_test" | null | null + "async_test" | "INSERT INTO async_test.users (id, name) values (uuid(), 'alice')" | "INSERT INTO async_test.users (id, name) values (uuid(), ?)" | "INSERT async_test.users" | "INSERT" | "async_test.users" + "async_test" | "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "SELECT * FROM users where name = ? ALLOW FILTERING" | "SELECT async_test.users" | "SELECT" | "users" + } + + def cassandraSpan(TraceAssert trace, int index, String spanName, String statement, String operation, String keyspace, String table, Object parentSpan = null) { + trace.span(index) { + name spanName + kind CLIENT + if (parentSpan == null) { + hasNoParent() + } else { + childOf((SpanData) parentSpan) + } + attributes { + "$SemanticAttributes.NET_SOCK_PEER_ADDR" "127.0.0.1" + "$SemanticAttributes.NET_SOCK_PEER_NAME" "localhost" + "$SemanticAttributes.NET_SOCK_PEER_PORT" cassandraPort + "$SemanticAttributes.DB_SYSTEM" "cassandra" + "$SemanticAttributes.DB_NAME" keyspace + "$SemanticAttributes.DB_STATEMENT" statement + "$SemanticAttributes.DB_OPERATION" operation + "$SemanticAttributes.DB_CASSANDRA_CONSISTENCY_LEVEL" "LOCAL_ONE" + "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_DC" "datacenter1" + "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_ID" String + "$SemanticAttributes.DB_CASSANDRA_IDEMPOTENCE" Boolean + "$SemanticAttributes.DB_CASSANDRA_PAGE_SIZE" 5000 + "$SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT" 0 + // the SqlStatementSanitizer can't handle CREATE statements yet + "$SemanticAttributes.DB_CASSANDRA_TABLE" table + } + } + } + + def getSession(String keyspace) { + DriverConfigLoader configLoader = DefaultDriverConfigLoader.builder() + .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(0)) + .build() + return CqlSession.builder() + .addContactPoint(new InetSocketAddress("localhost", cassandraPort)) + .withConfigLoader(configLoader) + .withLocalDatacenter("datacenter1") + .withKeyspace((String) keyspace) + .build() + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 91f87eb7e579..4f2e6e67da07 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -174,6 +174,7 @@ include(":instrumentation:azure-core:azure-core-1.19:library-instrumentation-sha include(":instrumentation:cassandra:cassandra-3.0:javaagent") include(":instrumentation:cassandra:cassandra-4.0:javaagent") include(":instrumentation:cassandra:cassandra-4.4:javaagent") +include(":instrumentation:cassandra:testing") include(":instrumentation:cdi-testing") include(":instrumentation:graphql-java-12.0:javaagent") include(":instrumentation:graphql-java-12.0:library") From 15e4b4278aba1740bccca0dd70185a049ce68d93 Mon Sep 17 00:00:00 2001 From: SimoneGiusso Date: Sat, 26 Nov 2022 21:13:19 +0100 Subject: [PATCH 08/18] WIP: avoid having both cassandra 4.* modules applied --- .../cassandra/cassandra-4.0/javaagent/build.gradle.kts | 3 +-- .../v4_0/CassandraClientInstrumentationModule.java | 9 +++++++++ .../v4_4/CassandraClientInstrumentationModule.java | 8 ++++++++ .../cassandra/v4_4/CompletionStageFunction.java | 9 ++++++++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index f7b28692f21a..97e6adf60ea1 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -6,8 +6,7 @@ muzzle { pass { group.set("com.datastax.oss") module.set("java-driver-core") - versions.set("[4.0,)") - assertInverse.set(true) + versions.set("[4.0,4.4)") } } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java index fad308fe813a..2a09220397ce 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java @@ -5,12 +5,15 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Collections.singletonList; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) public class CassandraClientInstrumentationModule extends InstrumentationModule { @@ -22,4 +25,10 @@ public CassandraClientInstrumentationModule() { public List typeInstrumentations() { return singletonList(new SessionBuilderInstrumentation()); } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // new public interface introduced in version 4.4 + return not(hasClassesNamed("com.datastax.dse.driver.api.core.cql.reactive.ReactiveSession")); + } } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java index b16b696922e3..a3bf48e642c9 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java @@ -5,12 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) public class CassandraClientInstrumentationModule extends InstrumentationModule { @@ -22,4 +24,10 @@ public CassandraClientInstrumentationModule() { public List typeInstrumentations() { return singletonList(new SessionBuilderInstrumentation()); } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // new public interface introduced in version 4.4 + return hasClassesNamed("com.datastax.dse.driver.api.core.cql.reactive.ReactiveSession"); + } } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java index c1c019003087..6d45825e33a0 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java @@ -5,6 +5,8 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; +import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_4.CassandraSingletons.instrumenter; + import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; @@ -20,6 +22,11 @@ public Object apply(Object session) { return session; } - return new TracingCqlSession((CqlSession) session); + io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession + originalTracingCqlSession = + new io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession( + (CqlSession) session, instrumenter()); + + return new TracingCqlSession(originalTracingCqlSession); } } From ad461f6538fdfc176749ea7f1b5218318f9d14b5 Mon Sep 17 00:00:00 2001 From: SimoneGiusso Date: Sun, 27 Nov 2022 12:35:59 +0100 Subject: [PATCH 09/18] Address last comments from mateuszrzeszutek's review --- .../cassandra-4.0/javaagent/build.gradle.kts | 5 +- .../CassandraClientInstrumentationModule.java | 3 +- .../cassandra/v4_0/CassandraSingletons.java | 24 ++---- .../v4_0/CassandraTelemetryBuilder.java | 39 ---------- .../v4_0/CompletionStageFunction.java | 6 +- .../cassandra-4.0/library/build.gradle.kts | 10 +++ .../v4_0/CassandraAttributesExtractor.java | 0 .../v4_0/CassandraNetAttributesGetter.java | 0 .../cassandra/v4_0/CassandraRequest.java | 0 .../cassandra/v4_0/CassandraSingletons.java | 49 ++++++++++++ .../v4_0/CassandraSqlAttributesGetter.java | 0 .../cassandra/v4_0/CassandraTelemetry.java | 44 +++++++++++ .../v4_0/CassandraTelemetryBuilder.java | 70 +++++++++++++++++ .../cassandra/v4_0/TracingCqlSession.java | 1 + .../cassandra-4.4/javaagent/build.gradle.kts | 2 +- .../v4_4/CassandraAttributesExtractor.java | 78 +++++++++++++++++++ .../v4_4/CassandraNetAttributesGetter.java | 53 +++++++++++++ .../cassandra/v4_4/CassandraSingletons.java | 23 +----- .../v4_4/CassandraSqlAttributesGetter.java | 44 +++++++++++ .../cassandra/v4_4/CassandraTelemetry.java | 49 ++++++++++++ .../v4_4/CassandraTelemetryBuilder.java} | 48 ++++++++---- .../v4_4/CompletionStageFunction.java | 12 +-- .../cassandra/v4_4/TracingCqlSession.java | 2 +- settings.gradle.kts | 1 + 24 files changed, 448 insertions(+), 115 deletions(-) delete mode 100644 instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java create mode 100644 instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts rename instrumentation/cassandra/cassandra-4.0/{javaagent => library}/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java (100%) rename instrumentation/cassandra/cassandra-4.0/{javaagent => library}/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java (100%) rename instrumentation/cassandra/cassandra-4.0/{javaagent => library}/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java (100%) create mode 100644 instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java rename instrumentation/cassandra/cassandra-4.0/{javaagent => library}/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java (100%) create mode 100644 instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java create mode 100644 instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java rename instrumentation/cassandra/cassandra-4.0/{javaagent => library}/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java (99%) create mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java create mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java create mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java create mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java rename instrumentation/cassandra/{cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java => cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java} (51%) diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index 97e6adf60ea1..bf9c32cc54dc 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -11,10 +11,9 @@ muzzle { } dependencies { - library("com.datastax.oss:java-driver-core:4.0.0") + implementation(project(":instrumentation:cassandra:cassandra-4.0:library")) - compileOnly("com.google.auto.value:auto-value-annotations") - annotationProcessor("com.google.auto.value:auto-value") + library("com.datastax.oss:java-driver-core:4.0.0") testImplementation(project(":instrumentation:cassandra:testing")) } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java index 2a09220397ce..e0e7c35128c5 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java @@ -7,7 +7,6 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Collections.singletonList; -import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; @@ -29,6 +28,6 @@ public List typeInstrumentations() { @Override public ElementMatcher.Junction classLoaderMatcher() { // new public interface introduced in version 4.4 - return not(hasClassesNamed("com.datastax.dse.driver.api.core.cql.reactive.ReactiveSession")); + return hasClassesNamed("com.datastax.dse.driver.api.core.cql.reactive.ReactiveSession"); } } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java index f9b66b2a0079..350b5382e359 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -5,28 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; -import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; -public final class CassandraSingletons { - // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException - private static final Instrumenter INSTRUMENTER; - - static { - CassandraTelemetry telemetry = - CassandraTelemetry.builder(GlobalOpenTelemetry.get()) - .setInstrumentationName("io.opentelemetry.cassandra-4.0") - .setStatementSanitizationEnabled(CommonConfig.get().isStatementSanitizationEnabled()) - .build(); - - INSTRUMENTER = telemetry.getInstrumenter(); - } - - public static Instrumenter instrumenter() { - return INSTRUMENTER; - } +final class CassandraSingletons { + static final CassandraTelemetry telemetry = + CassandraTelemetry.builder(GlobalOpenTelemetry.get()) + .setStatementSanitizationEnabled(CommonConfig.get().isStatementSanitizationEnabled()) + .build(); private CassandraSingletons() {} } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java deleted file mode 100644 index 4d131a111726..000000000000 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.api.OpenTelemetry; - -public class CassandraTelemetryBuilder { - - static final String DEFAULT_INSTRUMENTATION_NAME = "io.opentelemetry.cassandra"; - - private final OpenTelemetry openTelemetry; - - private String instrumentationName = DEFAULT_INSTRUMENTATION_NAME; - private boolean statementSanitizationEnabled; - - public CassandraTelemetryBuilder(OpenTelemetry openTelemetry) { - this.openTelemetry = openTelemetry; - } - - @CanIgnoreReturnValue - public CassandraTelemetryBuilder setInstrumentationName(String instrumentationName) { - this.instrumentationName = instrumentationName; - return this; - } - - @CanIgnoreReturnValue - public CassandraTelemetryBuilder setStatementSanitizationEnabled(boolean enabled) { - this.statementSanitizationEnabled = enabled; - return this; - } - - public CassandraTelemetry build() { - return new CassandraTelemetry(openTelemetry, instrumentationName, statementSanitizationEnabled); - } -} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java index 144bb3020b96..a0d05fca4de9 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java @@ -5,12 +5,10 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; -import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraSingletons.instrumenter; - import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; -public class CompletionStageFunction implements Function { +class CompletionStageFunction implements Function { @Override public Object apply(Object session) { @@ -21,6 +19,6 @@ public Object apply(Object session) { if (session.getClass().getName().endsWith("cassandra4.TracingCqlSession")) { return session; } - return new TracingCqlSession((CqlSession) session, instrumenter()); + return new TracingCqlSession((CqlSession) session); } } diff --git a/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts new file mode 100644 index 000000000000..48918ccfa492 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + id("otel.library-instrumentation") +} + +dependencies { + library("com.datastax.oss:java-driver-core:4.0.0") + + compileOnly("com.google.auto.value:auto-value-annotations") + annotationProcessor("com.google.auto.value:auto-value") +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java new file mode 100644 index 000000000000..b84df6935485 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; + +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; +import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; + +public final class CassandraSingletons { + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.cassandra-4.0"; + + // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException + private static final Instrumenter INSTRUMENTER; + + static { + CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); + + INSTRUMENTER = + Instrumenter.builder( + GlobalOpenTelemetry.get(), + INSTRUMENTATION_NAME, + DbClientSpanNameExtractor.create(attributesGetter)) + .addAttributesExtractor( + SqlClientAttributesExtractor.builder(attributesGetter) + .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) + .setStatementSanitizationEnabled( + CommonConfig.get().isStatementSanitizationEnabled()) + .build()) + .addAttributesExtractor( + NetClientAttributesExtractor.create(new CassandraNetAttributesGetter())) + .addAttributesExtractor(new CassandraAttributesExtractor()) + .buildInstrumenter(SpanKindExtractor.alwaysClient()); + } + + public static Instrumenter instrumenter() { + return INSTRUMENTER; + } + + private CassandraSingletons() {} +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java new file mode 100644 index 000000000000..37461b48953f --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java @@ -0,0 +1,44 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; + +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; + +/** Entrypoint for instrumenting cassandra sessions. */ +public class CassandraTelemetry { + + /** Returns a new {@link CassandraTelemetry} configured with the given {@link OpenTelemetry}. */ + public static CassandraTelemetry create(OpenTelemetry openTelemetry) { + return builder(openTelemetry).build(); + } + + /** + * Returns a new {@link CassandraTelemetryBuilder} configured with the given {@link + * OpenTelemetry}. + */ + public static CassandraTelemetryBuilder builder(OpenTelemetry openTelemetry) { + return new CassandraTelemetryBuilder(openTelemetry); + } + + private final Instrumenter instrumenter; + + protected CassandraTelemetry(Instrumenter instrumenter) { + this.instrumenter = instrumenter; + } + + /** + * Construct a new tracing-enable CqlSession using the provided {@link CqlSession} instance. + * + * @param session An instance of CqlSession configured as desired. + * @return a {@link TracingCqlSession}. + */ + public CqlSession wrap(CqlSession session) { + return new TracingCqlSession(session, instrumenter); + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java new file mode 100644 index 000000000000..dd50acd51e61 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java @@ -0,0 +1,70 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; + +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; + +/** A builder of {@link CassandraTelemetry}. */ +public class CassandraTelemetryBuilder { + + private final OpenTelemetry openTelemetry; + + private boolean statementSanitizationEnabled = true; + + protected CassandraTelemetryBuilder(OpenTelemetry openTelemetry) { + this.openTelemetry = openTelemetry; + } + + /** + * Sets whether the {@code db.statement} attribute on the spans emitted by the constructed {@link + * CassandraTelemetry} should be sanitized. If set to {@code true}, all parameters that can + * potentially contain sensitive information will be masked. Enabled by default. + */ + @CanIgnoreReturnValue + public CassandraTelemetryBuilder setStatementSanitizationEnabled(boolean enabled) { + this.statementSanitizationEnabled = enabled; + return this; + } + + /** + * Returns a new {@link CassandraTelemetry} with the settings of this {@link + * CassandraTelemetryBuilder}. + */ + public CassandraTelemetry build() { + return new CassandraTelemetry(createInstrumenter(openTelemetry, statementSanitizationEnabled)); + } + + protected Instrumenter createInstrumenter( + OpenTelemetry openTelemetry, boolean statementSanitizationEnabled) { + CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); + + return Instrumenter.builder( + openTelemetry, + getInstrumenterName(), + DbClientSpanNameExtractor.create(attributesGetter)) + .addAttributesExtractor( + SqlClientAttributesExtractor.builder(attributesGetter) + .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) + .setStatementSanitizationEnabled(statementSanitizationEnabled) + .build()) + .addAttributesExtractor( + NetClientAttributesExtractor.create(new CassandraNetAttributesGetter())) + .addAttributesExtractor(new CassandraAttributesExtractor()) + .buildInstrumenter(SpanKindExtractor.alwaysClient()); + } + + protected String getInstrumenterName() { + return "io.opentelemetry.cassandra-4.0"; + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java similarity index 99% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java index 67d53883565a..20fea980a693 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java @@ -32,6 +32,7 @@ public class TracingCqlSession implements CqlSession { private final CqlSession session; + private final Instrumenter instrumenter; public TracingCqlSession( diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts index cdecd70df255..1e9fa1d49b2c 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts @@ -11,7 +11,7 @@ muzzle { } dependencies { - implementation(project(":instrumentation:cassandra:cassandra-4.0:javaagent")) + implementation(project(":instrumentation:cassandra:cassandra-4.0:library")) library("com.datastax.oss:java-driver-core:4.4.0") diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java new file mode 100644 index 000000000000..b7d03ab01f9d --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java @@ -0,0 +1,78 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; + +import com.datastax.oss.driver.api.core.config.DefaultDriverOption; +import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import com.datastax.oss.driver.api.core.cql.Statement; +import com.datastax.oss.driver.api.core.metadata.Node; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import javax.annotation.Nullable; + +final class CassandraAttributesExtractor + implements AttributesExtractor { + + @Override + public void onStart( + AttributesBuilder attributes, Context parentContext, CassandraRequest request) {} + + @Override + public void onEnd( + AttributesBuilder attributes, + Context context, + CassandraRequest request, + @Nullable ExecutionInfo executionInfo, + @Nullable Throwable error) { + if (executionInfo == null) { + return; + } + + Node coordinator = executionInfo.getCoordinator(); + if (coordinator != null) { + if (coordinator.getDatacenter() != null) { + attributes.put(SemanticAttributes.DB_CASSANDRA_COORDINATOR_DC, coordinator.getDatacenter()); + } + if (coordinator.getHostId() != null) { + attributes.put( + SemanticAttributes.DB_CASSANDRA_COORDINATOR_ID, coordinator.getHostId().toString()); + } + } + attributes.put( + SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, + executionInfo.getSpeculativeExecutionCount()); + + Statement statement = (Statement) executionInfo.getRequest(); + String consistencyLevel; + DriverExecutionProfile config = + request.getSession().getContext().getConfig().getDefaultProfile(); + if (statement.getConsistencyLevel() != null) { + consistencyLevel = statement.getConsistencyLevel().name(); + } else { + consistencyLevel = config.getString(DefaultDriverOption.REQUEST_CONSISTENCY); + } + attributes.put(SemanticAttributes.DB_CASSANDRA_CONSISTENCY_LEVEL, consistencyLevel); + + if (statement.getPageSize() > 0) { + attributes.put(SemanticAttributes.DB_CASSANDRA_PAGE_SIZE, statement.getPageSize()); + } else { + int pageSize = config.getInt(DefaultDriverOption.REQUEST_PAGE_SIZE); + if (pageSize > 0) { + attributes.put(SemanticAttributes.DB_CASSANDRA_PAGE_SIZE, pageSize); + } + } + + Boolean idempotent = statement.isIdempotent(); + if (idempotent == null) { + idempotent = config.getBoolean(DefaultDriverOption.REQUEST_DEFAULT_IDEMPOTENCE); + } + attributes.put(SemanticAttributes.DB_CASSANDRA_IDEMPOTENCE, idempotent); + } +} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java new file mode 100644 index 000000000000..0b777a1ce1af --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java @@ -0,0 +1,53 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; + +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import com.datastax.oss.driver.api.core.metadata.Node; +import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesGetter; +import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import javax.annotation.Nullable; + +final class CassandraNetAttributesGetter + extends InetSocketAddressNetClientAttributesGetter { + + @Override + @Nullable + public String transport(CassandraRequest request, @Nullable ExecutionInfo executionInfo) { + return null; + } + + @Nullable + @Override + public String peerName(CassandraRequest request) { + return null; + } + + @Nullable + @Override + public Integer peerPort(CassandraRequest request) { + return null; + } + + @Override + @Nullable + protected InetSocketAddress getPeerSocketAddress( + CassandraRequest request, @Nullable ExecutionInfo executionInfo) { + if (executionInfo == null) { + return null; + } + Node coordinator = executionInfo.getCoordinator(); + if (coordinator == null) { + return null; + } + // resolve() returns an existing InetSocketAddress, it does not do a dns resolve, + // at least in the only current EndPoint implementation (DefaultEndPoint) + SocketAddress address = coordinator.getEndPoint().resolve(); + return address instanceof InetSocketAddress ? (InetSocketAddress) address : null; + } +} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java index d57bc58aa3af..32c686c31339 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java @@ -5,30 +5,15 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; -import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; -import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; -import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraTelemetry; final class CassandraSingletons { - // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException - private static final Instrumenter INSTRUMENTER; - static { - CassandraTelemetry telemetry = - CassandraTelemetry.builder(GlobalOpenTelemetry.get()) - .setInstrumentationName("io.opentelemetry.cassandra-4.4") - .setStatementSanitizationEnabled(CommonConfig.get().isStatementSanitizationEnabled()) - .build(); - - INSTRUMENTER = telemetry.getInstrumenter(); - } - - public static Instrumenter instrumenter() { - return INSTRUMENTER; - } + static final CassandraTelemetry telemetry = + CassandraTelemetry.builder(GlobalOpenTelemetry.get()) + .setStatementSanitizationEnabled(CommonConfig.get().isStatementSanitizationEnabled()) + .build(); private CassandraSingletons() {} } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java new file mode 100644 index 000000000000..3f3eb9c3d087 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java @@ -0,0 +1,44 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesGetter; +import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import javax.annotation.Nullable; + +final class CassandraSqlAttributesGetter implements SqlClientAttributesGetter { + + @Override + public String system(CassandraRequest request) { + return SemanticAttributes.DbSystemValues.CASSANDRA; + } + + @Override + @Nullable + public String user(CassandraRequest request) { + return null; + } + + @Override + @Nullable + public String name(CassandraRequest request) { + return request.getSession().getKeyspace().map(CqlIdentifier::toString).orElse(null); + } + + @Override + @Nullable + public String connectionString(CassandraRequest request) { + return null; + } + + @Override + @Nullable + public String rawStatement(CassandraRequest request) { + return request.getStatement(); + } +} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java new file mode 100644 index 000000000000..765f79f7f9cc --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java @@ -0,0 +1,49 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; + +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; + +/** Entrypoint for instrumenting cassandra sessions. */ +public final class CassandraTelemetry { + + /** Returns a new {@link CassandraTelemetry} configured with the given {@link OpenTelemetry}. */ + public static CassandraTelemetry create(OpenTelemetry openTelemetry) { + return builder(openTelemetry).build(); + } + + /** + * Returns a new {@link CassandraTelemetryBuilder} configured with the given {@link + * OpenTelemetry}. + */ + public static CassandraTelemetryBuilder builder(OpenTelemetry openTelemetry) { + return new CassandraTelemetryBuilder(openTelemetry); + } + + private final Instrumenter instrumenter; + + CassandraTelemetry(Instrumenter instrumenter) { + this.instrumenter = instrumenter; + } + + /** + * Construct a new tracing-enable CqlSession using the provided {@link CqlSession} instance. + * + * @param session An instance of CqlSession configured as desired. + * @return a {@link TracingCqlSession}. + */ + public CqlSession wrap(CqlSession session) { + io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession + originalTracingCqlSession = + new io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession( + session, instrumenter); + return new TracingCqlSession(originalTracingCqlSession); + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java similarity index 51% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java rename to instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java index c6b5ce2dc0bc..de158b7ee7d3 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java @@ -3,39 +3,57 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; +import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -public final class CassandraTelemetry { +/** A builder of {@link CassandraTelemetry}. */ +public class CassandraTelemetryBuilder { - public static CassandraTelemetryBuilder builder(OpenTelemetry openTelemetry) { - return new CassandraTelemetryBuilder(openTelemetry); + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.cassandra-4.4"; + + private final OpenTelemetry openTelemetry; + + private boolean statementSanitizationEnabled; + + CassandraTelemetryBuilder(OpenTelemetry openTelemetry) { + this.openTelemetry = openTelemetry; } - private final Instrumenter instrumenter; + /** + * Sets whether the {@code db.statement} attribute on the spans emitted by the constructed {@link + * CassandraTelemetry} should be sanitized. If set to {@code true}, all parameters that can + * potentially contain sensitive information will be masked. Enabled by default. + */ + @CanIgnoreReturnValue + public CassandraTelemetryBuilder setStatementSanitizationEnabled(boolean enabled) { + this.statementSanitizationEnabled = enabled; + return this; + } - CassandraTelemetry( - OpenTelemetry openTelemetry, - String instrumentationName, - boolean statementSanitizationEnabled) { - this.instrumenter = - createInstrumenter(openTelemetry, instrumentationName, statementSanitizationEnabled); + /** + * Returns a new {@link CassandraTelemetry} with the settings of this {@link + * CassandraTelemetryBuilder}. + */ + public CassandraTelemetry build() { + return new CassandraTelemetry(createInstrumenter(openTelemetry, statementSanitizationEnabled)); } private static Instrumenter createInstrumenter( - OpenTelemetry openTelemetry, String instrumenterName, boolean statementSanitizationEnabled) { + OpenTelemetry openTelemetry, boolean statementSanitizationEnabled) { CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); return Instrumenter.builder( - openTelemetry, instrumenterName, DbClientSpanNameExtractor.create(attributesGetter)) + openTelemetry, INSTRUMENTATION_NAME, DbClientSpanNameExtractor.create(attributesGetter)) .addAttributesExtractor( SqlClientAttributesExtractor.builder(attributesGetter) .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) @@ -46,8 +64,4 @@ private static Instrumenter createInstrumenter( .addAttributesExtractor(new CassandraAttributesExtractor()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } - - public Instrumenter getInstrumenter() { - return instrumenter; - } } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java index 6d45825e33a0..400cfd67bdcf 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java @@ -5,12 +5,10 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; -import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_4.CassandraSingletons.instrumenter; - import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; -public class CompletionStageFunction implements Function { +class CompletionStageFunction implements Function { @Override public Object apply(Object session) { @@ -21,12 +19,6 @@ public Object apply(Object session) { if (session.getClass().getName().endsWith("cassandra4.TracingCqlSession")) { return session; } - - io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession - originalTracingCqlSession = - new io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession( - (CqlSession) session, instrumenter()); - - return new TracingCqlSession(originalTracingCqlSession); + return CassandraSingletons.telemetry.wrap((CqlSession) session); } } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java index 7cc78c866c57..310c99a25813 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java @@ -24,7 +24,7 @@ import java.util.concurrent.CompletionStage; import javax.annotation.Nullable; -public class TracingCqlSession implements CqlSession { +class TracingCqlSession implements CqlSession { private final CqlSession originalTracingCqlSession; diff --git a/settings.gradle.kts b/settings.gradle.kts index 72f53d66c0aa..ddf02543cb09 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -173,6 +173,7 @@ include(":instrumentation:azure-core:azure-core-1.19:javaagent") include(":instrumentation:azure-core:azure-core-1.19:library-instrumentation-shaded") include(":instrumentation:cassandra:cassandra-3.0:javaagent") include(":instrumentation:cassandra:cassandra-4.0:javaagent") +include(":instrumentation:cassandra:cassandra-4.0:library") include(":instrumentation:cassandra:cassandra-4.4:javaagent") include(":instrumentation:cassandra:testing") include(":instrumentation:cdi-testing") From 3e8ea442b6d19da19ea97ffb3ab5b6b3ccfa5ca3 Mon Sep 17 00:00:00 2001 From: SimoneGiusso Date: Sun, 27 Nov 2022 15:45:01 +0100 Subject: [PATCH 10/18] Share code keeping it package protected + clean-up --- .../CassandraClientInstrumentationModule.java | 8 -- .../v4_0/CompletionStageFunction.java | 2 +- .../cassandra/v4_0/CassandraSingletons.java | 49 ------------ .../v4_4/CassandraAttributesExtractor.java | 78 ------------------- .../v4_4/CassandraNetAttributesGetter.java | 53 ------------- .../v4_4/CassandraSqlAttributesGetter.java | 44 ----------- .../cassandra/v4_4/CassandraTelemetry.java | 12 +-- .../v4_4/CassandraTelemetryBuilder.java | 46 +++-------- 8 files changed, 14 insertions(+), 278 deletions(-) delete mode 100644 instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java delete mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java delete mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java delete mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java index e0e7c35128c5..fad308fe813a 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java @@ -5,14 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import java.util.List; -import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) public class CassandraClientInstrumentationModule extends InstrumentationModule { @@ -24,10 +22,4 @@ public CassandraClientInstrumentationModule() { public List typeInstrumentations() { return singletonList(new SessionBuilderInstrumentation()); } - - @Override - public ElementMatcher.Junction classLoaderMatcher() { - // new public interface introduced in version 4.4 - return hasClassesNamed("com.datastax.dse.driver.api.core.cql.reactive.ReactiveSession"); - } } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java index a0d05fca4de9..66dd85d8bde7 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java @@ -19,6 +19,6 @@ public Object apply(Object session) { if (session.getClass().getName().endsWith("cassandra4.TracingCqlSession")) { return session; } - return new TracingCqlSession((CqlSession) session); + return CassandraSingletons.telemetry.wrap((CqlSession) session); } } diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java deleted file mode 100644 index b84df6935485..000000000000 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; - -import com.datastax.oss.driver.api.core.cql.ExecutionInfo; -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; -import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; - -public final class CassandraSingletons { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.cassandra-4.0"; - - // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException - private static final Instrumenter INSTRUMENTER; - - static { - CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); - - INSTRUMENTER = - Instrumenter.builder( - GlobalOpenTelemetry.get(), - INSTRUMENTATION_NAME, - DbClientSpanNameExtractor.create(attributesGetter)) - .addAttributesExtractor( - SqlClientAttributesExtractor.builder(attributesGetter) - .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) - .setStatementSanitizationEnabled( - CommonConfig.get().isStatementSanitizationEnabled()) - .build()) - .addAttributesExtractor( - NetClientAttributesExtractor.create(new CassandraNetAttributesGetter())) - .addAttributesExtractor(new CassandraAttributesExtractor()) - .buildInstrumenter(SpanKindExtractor.alwaysClient()); - } - - public static Instrumenter instrumenter() { - return INSTRUMENTER; - } - - private CassandraSingletons() {} -} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java deleted file mode 100644 index b7d03ab01f9d..000000000000 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; - -import com.datastax.oss.driver.api.core.config.DefaultDriverOption; -import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; -import com.datastax.oss.driver.api.core.cql.ExecutionInfo; -import com.datastax.oss.driver.api.core.cql.Statement; -import com.datastax.oss.driver.api.core.metadata.Node; -import io.opentelemetry.api.common.AttributesBuilder; -import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -import javax.annotation.Nullable; - -final class CassandraAttributesExtractor - implements AttributesExtractor { - - @Override - public void onStart( - AttributesBuilder attributes, Context parentContext, CassandraRequest request) {} - - @Override - public void onEnd( - AttributesBuilder attributes, - Context context, - CassandraRequest request, - @Nullable ExecutionInfo executionInfo, - @Nullable Throwable error) { - if (executionInfo == null) { - return; - } - - Node coordinator = executionInfo.getCoordinator(); - if (coordinator != null) { - if (coordinator.getDatacenter() != null) { - attributes.put(SemanticAttributes.DB_CASSANDRA_COORDINATOR_DC, coordinator.getDatacenter()); - } - if (coordinator.getHostId() != null) { - attributes.put( - SemanticAttributes.DB_CASSANDRA_COORDINATOR_ID, coordinator.getHostId().toString()); - } - } - attributes.put( - SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, - executionInfo.getSpeculativeExecutionCount()); - - Statement statement = (Statement) executionInfo.getRequest(); - String consistencyLevel; - DriverExecutionProfile config = - request.getSession().getContext().getConfig().getDefaultProfile(); - if (statement.getConsistencyLevel() != null) { - consistencyLevel = statement.getConsistencyLevel().name(); - } else { - consistencyLevel = config.getString(DefaultDriverOption.REQUEST_CONSISTENCY); - } - attributes.put(SemanticAttributes.DB_CASSANDRA_CONSISTENCY_LEVEL, consistencyLevel); - - if (statement.getPageSize() > 0) { - attributes.put(SemanticAttributes.DB_CASSANDRA_PAGE_SIZE, statement.getPageSize()); - } else { - int pageSize = config.getInt(DefaultDriverOption.REQUEST_PAGE_SIZE); - if (pageSize > 0) { - attributes.put(SemanticAttributes.DB_CASSANDRA_PAGE_SIZE, pageSize); - } - } - - Boolean idempotent = statement.isIdempotent(); - if (idempotent == null) { - idempotent = config.getBoolean(DefaultDriverOption.REQUEST_DEFAULT_IDEMPOTENCE); - } - attributes.put(SemanticAttributes.DB_CASSANDRA_IDEMPOTENCE, idempotent); - } -} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java deleted file mode 100644 index 0b777a1ce1af..000000000000 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; - -import com.datastax.oss.driver.api.core.cql.ExecutionInfo; -import com.datastax.oss.driver.api.core.metadata.Node; -import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesGetter; -import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import javax.annotation.Nullable; - -final class CassandraNetAttributesGetter - extends InetSocketAddressNetClientAttributesGetter { - - @Override - @Nullable - public String transport(CassandraRequest request, @Nullable ExecutionInfo executionInfo) { - return null; - } - - @Nullable - @Override - public String peerName(CassandraRequest request) { - return null; - } - - @Nullable - @Override - public Integer peerPort(CassandraRequest request) { - return null; - } - - @Override - @Nullable - protected InetSocketAddress getPeerSocketAddress( - CassandraRequest request, @Nullable ExecutionInfo executionInfo) { - if (executionInfo == null) { - return null; - } - Node coordinator = executionInfo.getCoordinator(); - if (coordinator == null) { - return null; - } - // resolve() returns an existing InetSocketAddress, it does not do a dns resolve, - // at least in the only current EndPoint implementation (DefaultEndPoint) - SocketAddress address = coordinator.getEndPoint().resolve(); - return address instanceof InetSocketAddress ? (InetSocketAddress) address : null; - } -} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java deleted file mode 100644 index 3f3eb9c3d087..000000000000 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; - -import com.datastax.oss.driver.api.core.CqlIdentifier; -import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesGetter; -import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -import javax.annotation.Nullable; - -final class CassandraSqlAttributesGetter implements SqlClientAttributesGetter { - - @Override - public String system(CassandraRequest request) { - return SemanticAttributes.DbSystemValues.CASSANDRA; - } - - @Override - @Nullable - public String user(CassandraRequest request) { - return null; - } - - @Override - @Nullable - public String name(CassandraRequest request) { - return request.getSession().getKeyspace().map(CqlIdentifier::toString).orElse(null); - } - - @Override - @Nullable - public String connectionString(CassandraRequest request) { - return null; - } - - @Override - @Nullable - public String rawStatement(CassandraRequest request) { - return request.getStatement(); - } -} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java index 765f79f7f9cc..020085291914 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java @@ -11,8 +11,8 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; -/** Entrypoint for instrumenting cassandra sessions. */ -public final class CassandraTelemetry { +public final class CassandraTelemetry + extends io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraTelemetry { /** Returns a new {@link CassandraTelemetry} configured with the given {@link OpenTelemetry}. */ public static CassandraTelemetry create(OpenTelemetry openTelemetry) { @@ -30,15 +30,11 @@ public static CassandraTelemetryBuilder builder(OpenTelemetry openTelemetry) { private final Instrumenter instrumenter; CassandraTelemetry(Instrumenter instrumenter) { + super(instrumenter); this.instrumenter = instrumenter; } - /** - * Construct a new tracing-enable CqlSession using the provided {@link CqlSession} instance. - * - * @param session An instance of CqlSession configured as desired. - * @return a {@link TracingCqlSession}. - */ + @Override public CqlSession wrap(CqlSession session) { io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession originalTracingCqlSession = diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java index de158b7ee7d3..d0cf99c7ea48 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java @@ -5,63 +5,35 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; -import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesExtractor; -import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; -import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -/** A builder of {@link CassandraTelemetry}. */ -public class CassandraTelemetryBuilder { - - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.cassandra-4.4"; +public class CassandraTelemetryBuilder + extends io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraTelemetryBuilder { private final OpenTelemetry openTelemetry; - private boolean statementSanitizationEnabled; + private boolean statementSanitizationEnabled = true; CassandraTelemetryBuilder(OpenTelemetry openTelemetry) { + super(openTelemetry); this.openTelemetry = openTelemetry; } - /** - * Sets whether the {@code db.statement} attribute on the spans emitted by the constructed {@link - * CassandraTelemetry} should be sanitized. If set to {@code true}, all parameters that can - * potentially contain sensitive information will be masked. Enabled by default. - */ + @Override @CanIgnoreReturnValue public CassandraTelemetryBuilder setStatementSanitizationEnabled(boolean enabled) { this.statementSanitizationEnabled = enabled; return this; } - /** - * Returns a new {@link CassandraTelemetry} with the settings of this {@link - * CassandraTelemetryBuilder}. - */ + @Override public CassandraTelemetry build() { return new CassandraTelemetry(createInstrumenter(openTelemetry, statementSanitizationEnabled)); } - private static Instrumenter createInstrumenter( - OpenTelemetry openTelemetry, boolean statementSanitizationEnabled) { - CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); - - return Instrumenter.builder( - openTelemetry, INSTRUMENTATION_NAME, DbClientSpanNameExtractor.create(attributesGetter)) - .addAttributesExtractor( - SqlClientAttributesExtractor.builder(attributesGetter) - .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) - .setStatementSanitizationEnabled(statementSanitizationEnabled) - .build()) - .addAttributesExtractor( - NetClientAttributesExtractor.create(new CassandraNetAttributesGetter())) - .addAttributesExtractor(new CassandraAttributesExtractor()) - .buildInstrumenter(SpanKindExtractor.alwaysClient()); + @Override + protected String getInstrumenterName() { + return "io.opentelemetry.cassandra-4.4"; } } From 74fd80358725aa0417aa0c548aa06f1ee0554bbb Mon Sep 17 00:00:00 2001 From: SimoneGiusso Date: Sun, 27 Nov 2022 18:43:39 +0100 Subject: [PATCH 11/18] Make CompletionStageFunction public and rename package for classes under the new library module (removing 'javaagent' from the package path) --- .../cassandra/v4_0/CassandraSingletons.java | 1 + .../cassandra/v4_0/CompletionStageFunction.java | 2 +- .../cassandra}/CassandraAttributesExtractor.java | 2 +- .../cassandra}/CassandraNetAttributesGetter.java | 2 +- .../cassandra}/CassandraRequest.java | 2 +- .../cassandra}/CassandraSqlAttributesGetter.java | 2 +- .../cassandra}/CassandraTelemetry.java | 2 +- .../cassandra}/CassandraTelemetryBuilder.java | 2 +- .../cassandra}/TracingCqlSession.java | 2 +- .../cassandra/v4_4/CassandraTelemetry.java | 10 ++++------ .../cassandra/v4_4/CassandraTelemetryBuilder.java | 2 +- .../cassandra/v4_4/CompletionStageFunction.java | 2 +- 12 files changed, 15 insertions(+), 16 deletions(-) rename instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/{javaagent/instrumentation/cassandra/v4_0 => instrumentation/cassandra}/CassandraAttributesExtractor.java (97%) rename instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/{javaagent/instrumentation/cassandra/v4_0 => instrumentation/cassandra}/CassandraNetAttributesGetter.java (95%) rename instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/{javaagent/instrumentation/cassandra/v4_0 => instrumentation/cassandra}/CassandraRequest.java (87%) rename instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/{javaagent/instrumentation/cassandra/v4_0 => instrumentation/cassandra}/CassandraSqlAttributesGetter.java (93%) rename instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/{javaagent/instrumentation/cassandra/v4_0 => instrumentation/cassandra}/CassandraTelemetry.java (95%) rename instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/{javaagent/instrumentation/cassandra/v4_0 => instrumentation/cassandra}/CassandraTelemetryBuilder.java (97%) rename instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/{javaagent/instrumentation/cassandra/v4_0 => instrumentation/cassandra}/TracingCqlSession.java (99%) diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java index 350b5382e359..3c992c4cc022 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.cassandra.CassandraTelemetry; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; final class CassandraSingletons { diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java index 66dd85d8bde7..59d3e4322454 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java @@ -8,7 +8,7 @@ import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; -class CompletionStageFunction implements Function { +public class CompletionStageFunction implements Function { @Override public Object apply(Object session) { diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java similarity index 97% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java index be41c016b491..795069fc78c4 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra; import com.datastax.oss.driver.api.core.config.DefaultDriverOption; import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java similarity index 95% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java index 373c2da7389e..8f30cb5baa5c 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.datastax.oss.driver.api.core.metadata.Node; diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java similarity index 87% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java index 9c783cc3f196..1fe42d0ad759 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra; import com.datastax.oss.driver.api.core.session.Session; import com.google.auto.value.AutoValue; diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java similarity index 93% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java index 686966166f3c..1d19b5bc6933 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra; import com.datastax.oss.driver.api.core.CqlIdentifier; import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesGetter; diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java similarity index 95% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java index 37461b48953f..18a5f7c1367d 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetry.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java similarity index 97% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java index dd50acd51e61..08a6f3e7096a 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTelemetryBuilder.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.google.errorprone.annotations.CanIgnoreReturnValue; diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java similarity index 99% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java rename to instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java index 20fea980a693..0f632a6b50fd 100644 --- a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +package io.opentelemetry.instrumentation.cassandra; import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java index 020085291914..3c02b40a1542 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java @@ -9,10 +9,10 @@ import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraRequest; +import io.opentelemetry.instrumentation.cassandra.CassandraRequest; public final class CassandraTelemetry - extends io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraTelemetry { + extends io.opentelemetry.instrumentation.cassandra.CassandraTelemetry { /** Returns a new {@link CassandraTelemetry} configured with the given {@link OpenTelemetry}. */ public static CassandraTelemetry create(OpenTelemetry openTelemetry) { @@ -36,10 +36,8 @@ public static CassandraTelemetryBuilder builder(OpenTelemetry openTelemetry) { @Override public CqlSession wrap(CqlSession session) { - io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession - originalTracingCqlSession = - new io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.TracingCqlSession( - session, instrumenter); + io.opentelemetry.instrumentation.cassandra.TracingCqlSession originalTracingCqlSession = + new io.opentelemetry.instrumentation.cassandra.TracingCqlSession(session, instrumenter); return new TracingCqlSession(originalTracingCqlSession); } } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java index d0cf99c7ea48..649a786bea53 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java @@ -9,7 +9,7 @@ import io.opentelemetry.api.OpenTelemetry; public class CassandraTelemetryBuilder - extends io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraTelemetryBuilder { + extends io.opentelemetry.instrumentation.cassandra.CassandraTelemetryBuilder { private final OpenTelemetry openTelemetry; diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java index 400cfd67bdcf..51fdd3d8749a 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CompletionStageFunction.java @@ -8,7 +8,7 @@ import com.datastax.oss.driver.api.core.CqlSession; import java.util.function.Function; -class CompletionStageFunction implements Function { +public class CompletionStageFunction implements Function { @Override public Object apply(Object session) { From aced6eec1b3515c494cf698676014c076f506807 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 26 Feb 2023 16:29:58 -0800 Subject: [PATCH 12/18] Move library to 4.4 --- .../cassandra/cassandra-4.0/javaagent/build.gradle.kts | 3 ++- .../cassandra/cassandra-4.4/javaagent/build.gradle.kts | 3 ++- .../{cassandra-4.0 => cassandra-4.4}/library/build.gradle.kts | 0 .../cassandra/CassandraAttributesExtractor.java | 0 .../cassandra/CassandraNetAttributesGetter.java | 0 .../instrumentation/cassandra/CassandraRequest.java | 0 .../cassandra/CassandraSqlAttributesGetter.java | 0 .../instrumentation/cassandra/CassandraTelemetry.java | 0 .../instrumentation/cassandra/CassandraTelemetryBuilder.java | 0 .../instrumentation/cassandra/TracingCqlSession.java | 0 settings.gradle.kts | 2 +- 11 files changed, 5 insertions(+), 3 deletions(-) rename instrumentation/cassandra/{cassandra-4.0 => cassandra-4.4}/library/build.gradle.kts (100%) rename instrumentation/cassandra/{cassandra-4.0 => cassandra-4.4}/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java (100%) rename instrumentation/cassandra/{cassandra-4.0 => cassandra-4.4}/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java (100%) rename instrumentation/cassandra/{cassandra-4.0 => cassandra-4.4}/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java (100%) rename instrumentation/cassandra/{cassandra-4.0 => cassandra-4.4}/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java (100%) rename instrumentation/cassandra/{cassandra-4.0 => cassandra-4.4}/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java (100%) rename instrumentation/cassandra/{cassandra-4.0 => cassandra-4.4}/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java (100%) rename instrumentation/cassandra/{cassandra-4.0 => cassandra-4.4}/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java (100%) diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index bf9c32cc54dc..afb7991535e2 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -7,11 +7,12 @@ muzzle { group.set("com.datastax.oss") module.set("java-driver-core") versions.set("[4.0,4.4)") + assertInverse.set(true) } } dependencies { - implementation(project(":instrumentation:cassandra:cassandra-4.0:library")) + implementation(project(":instrumentation:cassandra:cassandra-4.4:library")) library("com.datastax.oss:java-driver-core:4.0.0") diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts index 1e9fa1d49b2c..df5efbeaca4b 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts @@ -7,11 +7,12 @@ muzzle { group.set("com.datastax.oss") module.set("java-driver-core") versions.set("[4.4,]") + assertInverse.set(true) } } dependencies { - implementation(project(":instrumentation:cassandra:cassandra-4.0:library")) + implementation(project(":instrumentation:cassandra:cassandra-4.4:library")) library("com.datastax.oss:java-driver-core:4.4.0") diff --git a/instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/library/build.gradle.kts rename to instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java diff --git a/instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java similarity index 100% rename from instrumentation/cassandra/cassandra-4.0/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java diff --git a/settings.gradle.kts b/settings.gradle.kts index d7873a0581ff..7f246fe69dfa 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -173,8 +173,8 @@ hideFromDependabot(":instrumentation:azure-core:azure-core-1.36:javaagent") hideFromDependabot(":instrumentation:azure-core:azure-core-1.36:library-instrumentation-shaded") hideFromDependabot(":instrumentation:cassandra:cassandra-3.0:javaagent") hideFromDependabot(":instrumentation:cassandra:cassandra-4.0:javaagent") -hideFromDependabot(":instrumentation:cassandra:cassandra-4.0:library") hideFromDependabot(":instrumentation:cassandra:cassandra-4.4:javaagent") +hideFromDependabot(":instrumentation:cassandra:cassandra-4.4:library") hideFromDependabot(":instrumentation:cassandra:testing") hideFromDependabot(":instrumentation:cdi-testing") hideFromDependabot(":instrumentation:graphql-java-12.0:javaagent") From ed61c54fadf3c944f40a1fef15fa3185bf0a0a7b Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 26 Feb 2023 16:58:25 -0800 Subject: [PATCH 13/18] more --- .../cassandra/v4_0/CassandraSingletons.java | 2 +- .../cassandra/v4_4/CassandraSingletons.java | 1 + .../cassandra/v4_4/CassandraTelemetry.java | 43 ----- .../v4_4/CassandraTelemetryBuilder.java | 39 ---- .../cassandra/v4_4/TracingCqlSession.java | 176 ------------------ .../cassandra-4.4/library/build.gradle.kts | 2 +- .../CassandraAttributesExtractor.java | 3 +- .../CassandraNetAttributesGetter.java | 2 +- .../{ => v4_4}/CassandraRequest.java | 2 +- .../CassandraSqlAttributesGetter.java | 2 +- .../{ => v4_4}/CassandraTelemetry.java | 2 +- .../{ => v4_4}/CassandraTelemetryBuilder.java | 12 +- .../{ => v4_4}/TracingCqlSession.java | 9 +- 13 files changed, 21 insertions(+), 274 deletions(-) delete mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java delete mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java delete mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java rename instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/{ => v4_4}/CassandraAttributesExtractor.java (94%) rename instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/{ => v4_4}/CassandraNetAttributesGetter.java (96%) rename instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/{ => v4_4}/CassandraRequest.java (89%) rename instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/{ => v4_4}/CassandraSqlAttributesGetter.java (94%) rename instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/{ => v4_4}/CassandraTelemetry.java (96%) rename instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/{ => v4_4}/CassandraTelemetryBuilder.java (90%) rename instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/{ => v4_4}/TracingCqlSession.java (95%) diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java index 3c992c4cc022..a8156cfe2928 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.cassandra.CassandraTelemetry; +import io.opentelemetry.instrumentation.cassandra.v4_4.CassandraTelemetry; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; final class CassandraSingletons { diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java index 32c686c31339..7803fbd26174 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraSingletons.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.cassandra.v4_4.CassandraTelemetry; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; final class CassandraSingletons { diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java deleted file mode 100644 index 3c02b40a1542..000000000000 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetry.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; - -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.cql.ExecutionInfo; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.cassandra.CassandraRequest; - -public final class CassandraTelemetry - extends io.opentelemetry.instrumentation.cassandra.CassandraTelemetry { - - /** Returns a new {@link CassandraTelemetry} configured with the given {@link OpenTelemetry}. */ - public static CassandraTelemetry create(OpenTelemetry openTelemetry) { - return builder(openTelemetry).build(); - } - - /** - * Returns a new {@link CassandraTelemetryBuilder} configured with the given {@link - * OpenTelemetry}. - */ - public static CassandraTelemetryBuilder builder(OpenTelemetry openTelemetry) { - return new CassandraTelemetryBuilder(openTelemetry); - } - - private final Instrumenter instrumenter; - - CassandraTelemetry(Instrumenter instrumenter) { - super(instrumenter); - this.instrumenter = instrumenter; - } - - @Override - public CqlSession wrap(CqlSession session) { - io.opentelemetry.instrumentation.cassandra.TracingCqlSession originalTracingCqlSession = - new io.opentelemetry.instrumentation.cassandra.TracingCqlSession(session, instrumenter); - return new TracingCqlSession(originalTracingCqlSession); - } -} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java deleted file mode 100644 index 649a786bea53..000000000000 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; - -import com.google.errorprone.annotations.CanIgnoreReturnValue; -import io.opentelemetry.api.OpenTelemetry; - -public class CassandraTelemetryBuilder - extends io.opentelemetry.instrumentation.cassandra.CassandraTelemetryBuilder { - - private final OpenTelemetry openTelemetry; - - private boolean statementSanitizationEnabled = true; - - CassandraTelemetryBuilder(OpenTelemetry openTelemetry) { - super(openTelemetry); - this.openTelemetry = openTelemetry; - } - - @Override - @CanIgnoreReturnValue - public CassandraTelemetryBuilder setStatementSanitizationEnabled(boolean enabled) { - this.statementSanitizationEnabled = enabled; - return this; - } - - @Override - public CassandraTelemetry build() { - return new CassandraTelemetry(createInstrumenter(openTelemetry, statementSanitizationEnabled)); - } - - @Override - protected String getInstrumenterName() { - return "io.opentelemetry.cassandra-4.4"; - } -} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java deleted file mode 100644 index 310c99a25813..000000000000 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/TracingCqlSession.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; - -import com.datastax.dse.driver.api.core.cql.reactive.ReactiveResultSet; -import com.datastax.dse.driver.internal.core.cql.reactive.DefaultReactiveResultSet; -import com.datastax.oss.driver.api.core.CqlIdentifier; -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.context.DriverContext; -import com.datastax.oss.driver.api.core.cql.AsyncResultSet; -import com.datastax.oss.driver.api.core.cql.PrepareRequest; -import com.datastax.oss.driver.api.core.cql.PreparedStatement; -import com.datastax.oss.driver.api.core.cql.ResultSet; -import com.datastax.oss.driver.api.core.cql.SimpleStatement; -import com.datastax.oss.driver.api.core.cql.Statement; -import com.datastax.oss.driver.api.core.metadata.Metadata; -import com.datastax.oss.driver.api.core.metrics.Metrics; -import com.datastax.oss.driver.api.core.session.Request; -import com.datastax.oss.driver.api.core.type.reflect.GenericType; -import java.util.Optional; -import java.util.concurrent.CompletionStage; -import javax.annotation.Nullable; - -class TracingCqlSession implements CqlSession { - - private final CqlSession originalTracingCqlSession; - - public TracingCqlSession(CqlSession session) { - originalTracingCqlSession = session; - } - - @Override - public PreparedStatement prepare(SimpleStatement statement) { - return originalTracingCqlSession.prepare(statement); - } - - @Override - public PreparedStatement prepare(String query) { - return originalTracingCqlSession.prepare(query); - } - - @Override - public PreparedStatement prepare(PrepareRequest request) { - return originalTracingCqlSession.prepare(request); - } - - @Override - public CompletionStage prepareAsync(SimpleStatement statement) { - return originalTracingCqlSession.prepareAsync(statement); - } - - @Override - public CompletionStage prepareAsync(String query) { - return originalTracingCqlSession.prepareAsync(query); - } - - @Override - public CompletionStage prepareAsync(PrepareRequest request) { - return originalTracingCqlSession.prepareAsync(request); - } - - @Override - public String getName() { - return originalTracingCqlSession.getName(); - } - - @Override - public Metadata getMetadata() { - return originalTracingCqlSession.getMetadata(); - } - - @Override - public boolean isSchemaMetadataEnabled() { - return originalTracingCqlSession.isSchemaMetadataEnabled(); - } - - @Override - public CompletionStage setSchemaMetadataEnabled(@Nullable Boolean newValue) { - return originalTracingCqlSession.setSchemaMetadataEnabled(newValue); - } - - @Override - public CompletionStage refreshSchemaAsync() { - return originalTracingCqlSession.refreshSchemaAsync(); - } - - @Override - public Metadata refreshSchema() { - return originalTracingCqlSession.refreshSchema(); - } - - @Override - public CompletionStage checkSchemaAgreementAsync() { - return originalTracingCqlSession.checkSchemaAgreementAsync(); - } - - @Override - public boolean checkSchemaAgreement() { - return originalTracingCqlSession.checkSchemaAgreement(); - } - - @Override - public DriverContext getContext() { - return originalTracingCqlSession.getContext(); - } - - @Override - public Optional getKeyspace() { - return originalTracingCqlSession.getKeyspace(); - } - - @Override - public Optional getMetrics() { - return originalTracingCqlSession.getMetrics(); - } - - @Override - public CompletionStage closeFuture() { - return originalTracingCqlSession.closeFuture(); - } - - @Override - public boolean isClosed() { - return originalTracingCqlSession.isClosed(); - } - - @Override - public CompletionStage closeAsync() { - return originalTracingCqlSession.closeAsync(); - } - - @Override - public CompletionStage forceCloseAsync() { - return originalTracingCqlSession.forceCloseAsync(); - } - - @Override - public void close() { - originalTracingCqlSession.close(); - } - - @Override - @Nullable - public RESULT execute( - REQUEST request, GenericType resultType) { - return originalTracingCqlSession.execute(request, resultType); - } - - @Override - public ResultSet execute(String query) { - return originalTracingCqlSession.execute(query); - } - - @Override - public ResultSet execute(Statement statement) { - return originalTracingCqlSession.execute(statement); - } - - @Override - public CompletionStage executeAsync(Statement statement) { - return originalTracingCqlSession.executeAsync(statement); - } - - @Override - public CompletionStage executeAsync(String query) { - return originalTracingCqlSession.executeAsync(query); - } - - @Override - public ReactiveResultSet executeReactive(Statement statement) { - return new DefaultReactiveResultSet(() -> originalTracingCqlSession.executeAsync(statement)); - } -} diff --git a/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts index 48918ccfa492..0bc2f35170f0 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } dependencies { - library("com.datastax.oss:java-driver-core:4.0.0") + library("com.datastax.oss:java-driver-core:4.4.0") compileOnly("com.google.auto.value:auto-value-annotations") annotationProcessor("com.google.auto.value:auto-value") diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java similarity index 94% rename from instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java index 795069fc78c4..d8db3ecf661d 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraAttributesExtractor.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra; +package io.opentelemetry.instrumentation.cassandra.v4_4; import com.datastax.oss.driver.api.core.config.DefaultDriverOption; import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; @@ -24,6 +24,7 @@ public void onStart( AttributesBuilder attributes, Context parentContext, CassandraRequest request) {} @Override + @SuppressWarnings("deprecation") // used for 4.0 compatibility (TODO trask is this needed?) public void onEnd( AttributesBuilder attributes, Context context, diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java similarity index 96% rename from instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java index 525e205878c2..27e64d5e302a 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraNetAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraNetAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra; +package io.opentelemetry.instrumentation.cassandra.v4_4; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.datastax.oss.driver.api.core.metadata.Node; diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraRequest.java similarity index 89% rename from instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraRequest.java index 1fe42d0ad759..021dfc7b6c6d 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraRequest.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraRequest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra; +package io.opentelemetry.instrumentation.cassandra.v4_4; import com.datastax.oss.driver.api.core.session.Session; import com.google.auto.value.AutoValue; diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java similarity index 94% rename from instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java index 38088afb4554..80ceadf8798d 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraSqlAttributesGetter.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraSqlAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra; +package io.opentelemetry.instrumentation.cassandra.v4_4; import com.datastax.oss.driver.api.core.CqlIdentifier; import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesGetter; diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetry.java similarity index 96% rename from instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetry.java index 18a5f7c1367d..cb2214e8fbd3 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetry.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetry.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra; +package io.opentelemetry.instrumentation.cassandra.v4_4; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java similarity index 90% rename from instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java index 08a6f3e7096a..bf8657a09550 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/CassandraTelemetryBuilder.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra; +package io.opentelemetry.instrumentation.cassandra.v4_4; import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import com.google.errorprone.annotations.CanIgnoreReturnValue; @@ -18,6 +18,8 @@ /** A builder of {@link CassandraTelemetry}. */ public class CassandraTelemetryBuilder { + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.cassandra-4.4"; + private final OpenTelemetry openTelemetry; private boolean statementSanitizationEnabled = true; @@ -50,9 +52,7 @@ protected Instrumenter createInstrumenter( CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); return Instrumenter.builder( - openTelemetry, - getInstrumenterName(), - DbClientSpanNameExtractor.create(attributesGetter)) + openTelemetry, INSTRUMENTATION_NAME, DbClientSpanNameExtractor.create(attributesGetter)) .addAttributesExtractor( SqlClientAttributesExtractor.builder(attributesGetter) .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) @@ -63,8 +63,4 @@ protected Instrumenter createInstrumenter( .addAttributesExtractor(new CassandraAttributesExtractor()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } - - protected String getInstrumenterName() { - return "io.opentelemetry.cassandra-4.0"; - } } diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/TracingCqlSession.java similarity index 95% rename from instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java rename to instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/TracingCqlSession.java index 0f632a6b50fd..bc10661699a9 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/TracingCqlSession.java @@ -3,8 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.cassandra; +package io.opentelemetry.instrumentation.cassandra.v4_4; +import com.datastax.dse.driver.api.core.cql.reactive.ReactiveResultSet; +import com.datastax.dse.driver.internal.core.cql.reactive.DefaultReactiveResultSet; import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.DriverException; @@ -217,6 +219,11 @@ context, request, getExecutionInfo(asyncResultSet, throwable), throwable)), } } + @Override + public ReactiveResultSet executeReactive(Statement statement) { + return new DefaultReactiveResultSet(() -> session.executeAsync(statement)); + } + static CompletableFuture wrap(CompletionStage future, Context context) { CompletableFuture result = new CompletableFuture<>(); future.whenComplete( From 865b337b700c5bd8f1f5ebb238069db59955509e Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 26 Feb 2023 18:36:06 -0800 Subject: [PATCH 14/18] more --- .../cassandra-3.0/javaagent/build.gradle.kts | 3 + .../testing/build.gradle.kts | 2 +- .../v4/common/AbstractCassandraTest.java} | 160 ++++++----- .../cassandra-4.0/javaagent/build.gradle.kts | 10 +- .../v4_0/CassandraAttributesExtractor.java | 77 +++++ .../CassandraClientInstrumentationModule.java | 10 + .../v4_0/CassandraNetAttributesGetter.java | 52 ++++ .../cassandra/v4_0/CassandraRequest.java | 21 ++ .../cassandra/v4_0/CassandraSingletons.java | 42 ++- .../v4_0/CassandraSqlAttributesGetter.java | 43 +++ .../v4_0/CompletionStageFunction.java | 2 +- .../cassandra/v4_0/TracingCqlSession.java | 267 ++++++++++++++++++ .../src/test/java/CassandraTest.java | 20 ++ .../cassandra-4.4/javaagent/build.gradle.kts | 5 +- .../CassandraClientInstrumentationModule.java | 1 + .../test/groovy/CassandraClientTest.groovy | 52 ---- .../cassandra/v4_4/CassandraTest.java | 17 ++ .../cassandra-4.4/library/build.gradle.kts | 2 + .../cassandra/v4_4/CassandraTest.java | 23 ++ .../cassandra-4.4/testing/build.gradle.kts | 11 + .../v4_4/AbstractCassandra44Test.java | 8 + .../AbstractCassandraClientTest.groovy | 155 ---------- settings.gradle.kts | 3 +- 23 files changed, 690 insertions(+), 296 deletions(-) rename instrumentation/cassandra/{ => cassandra-4-common}/testing/build.gradle.kts (72%) rename instrumentation/cassandra/{cassandra-4.0/javaagent/src/test/java/CassandraClientTest.java => cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java} (65%) create mode 100644 instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java create mode 100644 instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java create mode 100644 instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java create mode 100644 instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java create mode 100644 instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java create mode 100644 instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/CassandraTest.java delete mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy create mode 100644 instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java create mode 100644 instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java create mode 100644 instrumentation/cassandra/cassandra-4.4/testing/build.gradle.kts create mode 100644 instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java delete mode 100644 instrumentation/cassandra/testing/src/main/groovy/io/opentelemetry/instrumentation/cassandra/AbstractCassandraClientTest.groovy diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts index bbb99dc2547c..21b3efbafe12 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/build.gradle.kts @@ -35,6 +35,9 @@ dependencies { testInstrumentation(project(":instrumentation:guava-10.0:javaagent")) latestDepTestLibrary("com.datastax.cassandra:cassandra-driver-core:3.+") // see cassandra-4.0 module + + testInstrumentation(project(":instrumentation:cassandra:cassandra-4.0:javaagent")) + testInstrumentation(project(":instrumentation:cassandra:cassandra-4.4:javaagent")) } // Requires old Guava. Can't use enforcedPlatform since predates BOM diff --git a/instrumentation/cassandra/testing/build.gradle.kts b/instrumentation/cassandra/cassandra-4-common/testing/build.gradle.kts similarity index 72% rename from instrumentation/cassandra/testing/build.gradle.kts rename to instrumentation/cassandra/cassandra-4-common/testing/build.gradle.kts index da95440e8184..3d12c28f94e9 100644 --- a/instrumentation/cassandra/testing/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4-common/testing/build.gradle.kts @@ -6,5 +6,5 @@ dependencies { api(project(":testing-common")) implementation("org.testcontainers:testcontainers:1.17.5") - implementation("com.datastax.oss:java-driver-core:4.4.0") + implementation("com.datastax.oss:java-driver-core:4.0.0") } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/CassandraClientTest.java b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java similarity index 65% rename from instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/CassandraClientTest.java rename to instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java index 3ffd1b1e21e9..c14e3f02a1fe 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/CassandraClientTest.java +++ b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java @@ -1,7 +1,4 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ +package io.opentelemetry.cassandra.v4.common; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; @@ -26,14 +23,12 @@ import com.datastax.oss.driver.api.core.config.DriverConfigLoader; import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import java.net.InetSocketAddress; import java.time.Duration; import java.util.stream.Stream; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -42,18 +37,21 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; -public class CassandraClientTest { +public abstract class AbstractCassandraTest { - private static final Logger logger = LoggerFactory.getLogger(CassandraClientTest.class); - - @RegisterExtension - static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + private static final Logger logger = LoggerFactory.getLogger(AbstractCassandraTest.class); @SuppressWarnings("rawtypes") private static GenericContainer cassandra; private static int cassandraPort; + protected abstract InstrumentationExtension testing(); + + protected CqlSession wrap(CqlSession session) { + return session; + } + @BeforeAll static void beforeAll() { cassandra = @@ -79,30 +77,33 @@ void syncTest(Parameter parameter) { session.execute(parameter.statement); - testing.waitAndAssertTraces( - trace -> - trace.hasSpansSatisfyingExactly( - span -> - span.hasName(parameter.spanName) - .hasKind(SpanKind.CLIENT) - .hasNoParent() - .hasAttributesSatisfyingExactly( - equalTo(NET_SOCK_PEER_ADDR, "127.0.0.1"), - equalTo(NET_SOCK_PEER_NAME, "localhost"), - equalTo(NET_SOCK_PEER_PORT, cassandraPort), - equalTo(DB_SYSTEM, "cassandra"), - equalTo(DB_NAME, parameter.keyspace), - equalTo(DB_STATEMENT, parameter.expectedStatement), - equalTo(DB_OPERATION, parameter.operation), - equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), - equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), - satisfies( - DB_CASSANDRA_COORDINATOR_ID, val -> val.isInstanceOf(String.class)), - satisfies( - DB_CASSANDRA_IDEMPOTENCE, val -> val.isInstanceOf(Boolean.class)), - equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), - equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), - equalTo(DB_CASSANDRA_TABLE, parameter.table)))); + testing() + .waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName(parameter.spanName) + .hasKind(SpanKind.CLIENT) + .hasNoParent() + .hasAttributesSatisfyingExactly( + equalTo(NET_SOCK_PEER_ADDR, "127.0.0.1"), + equalTo(NET_SOCK_PEER_NAME, "localhost"), + equalTo(NET_SOCK_PEER_PORT, cassandraPort), + equalTo(DB_SYSTEM, "cassandra"), + equalTo(DB_NAME, parameter.keyspace), + equalTo(DB_STATEMENT, parameter.expectedStatement), + equalTo(DB_OPERATION, parameter.operation), + equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), + equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), + satisfies( + DB_CASSANDRA_COORDINATOR_ID, + val -> val.isInstanceOf(String.class)), + satisfies( + DB_CASSANDRA_IDEMPOTENCE, + val -> val.isInstanceOf(Boolean.class)), + equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), + equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), + equalTo(DB_CASSANDRA_TABLE, parameter.table)))); session.close(); } @@ -112,42 +113,48 @@ void syncTest(Parameter parameter) { void asyncTest(Parameter parameter) throws Exception { CqlSession session = getSession(parameter.keyspace); - testing.runWithSpan( - "parent", - () -> - session - .executeAsync(parameter.statement) - .toCompletableFuture() - .whenComplete((result, throwable) -> testing.runWithSpan("child", () -> {})) - .get()); + testing() + .runWithSpan( + "parent", + () -> + session + .executeAsync(parameter.statement) + .toCompletableFuture() + .whenComplete((result, throwable) -> testing().runWithSpan("child", () -> {})) + .get()); - testing.waitAndAssertTraces( - trace -> - trace.hasSpansSatisfyingExactly( - span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), - span -> - span.hasName(parameter.spanName) - .hasKind(SpanKind.CLIENT) - .hasParent(trace.getSpan(0)) - .hasAttributesSatisfyingExactly( - equalTo(NET_SOCK_PEER_ADDR, "127.0.0.1"), - equalTo(NET_SOCK_PEER_NAME, "localhost"), - equalTo(NET_SOCK_PEER_PORT, cassandraPort), - equalTo(DB_SYSTEM, "cassandra"), - equalTo(DB_NAME, parameter.keyspace), - equalTo(DB_STATEMENT, parameter.expectedStatement), - equalTo(DB_OPERATION, parameter.operation), - equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), - equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), - satisfies( - DB_CASSANDRA_COORDINATOR_ID, val -> val.isInstanceOf(String.class)), - satisfies( - DB_CASSANDRA_IDEMPOTENCE, val -> val.isInstanceOf(Boolean.class)), - equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), - equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), - equalTo(DB_CASSANDRA_TABLE, parameter.table)), - span -> - span.hasName("child").hasKind(SpanKind.INTERNAL).hasParent(trace.getSpan(0)))); + testing() + .waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), + span -> + span.hasName(parameter.spanName) + .hasKind(SpanKind.CLIENT) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(NET_SOCK_PEER_ADDR, "127.0.0.1"), + equalTo(NET_SOCK_PEER_NAME, "localhost"), + equalTo(NET_SOCK_PEER_PORT, cassandraPort), + equalTo(DB_SYSTEM, "cassandra"), + equalTo(DB_NAME, parameter.keyspace), + equalTo(DB_STATEMENT, parameter.expectedStatement), + equalTo(DB_OPERATION, parameter.operation), + equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), + equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), + satisfies( + DB_CASSANDRA_COORDINATOR_ID, + val -> val.isInstanceOf(String.class)), + satisfies( + DB_CASSANDRA_IDEMPOTENCE, + val -> val.isInstanceOf(Boolean.class)), + equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), + equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), + equalTo(DB_CASSANDRA_TABLE, parameter.table)), + span -> + span.hasName("child") + .hasKind(SpanKind.INTERNAL) + .hasParent(trace.getSpan(0)))); session.close(); } @@ -289,11 +296,12 @@ CqlSession getSession(String keyspace) { DefaultDriverConfigLoader.builder() .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(0)) .build(); - return CqlSession.builder() - .addContactPoint(new InetSocketAddress("localhost", cassandraPort)) - .withConfigLoader(configLoader) - .withLocalDatacenter("datacenter1") - .withKeyspace(keyspace) - .build(); + return wrap( + CqlSession.builder() + .addContactPoint(new InetSocketAddress("localhost", cassandraPort)) + .withConfigLoader(configLoader) + .withLocalDatacenter("datacenter1") + .withKeyspace(keyspace) + .build()); } } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index afb7991535e2..b3f073ab9c4b 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -12,11 +12,15 @@ muzzle { } dependencies { - implementation(project(":instrumentation:cassandra:cassandra-4.4:library")) - library("com.datastax.oss:java-driver-core:4.0.0") - testImplementation(project(":instrumentation:cassandra:testing")) + compileOnly("com.google.auto.value:auto-value-annotations") + annotationProcessor("com.google.auto.value:auto-value") + + testImplementation(project(":instrumentation:cassandra:cassandra-4-common:testing")) + + testInstrumentation(project(":instrumentation:cassandra:cassandra-3.0:javaagent")) + testInstrumentation(project(":instrumentation:cassandra:cassandra-4.4:javaagent")) } tasks { diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java new file mode 100644 index 000000000000..be41c016b491 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraAttributesExtractor.java @@ -0,0 +1,77 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; + +import com.datastax.oss.driver.api.core.config.DefaultDriverOption; +import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import com.datastax.oss.driver.api.core.cql.Statement; +import com.datastax.oss.driver.api.core.metadata.Node; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import javax.annotation.Nullable; + +final class CassandraAttributesExtractor + implements AttributesExtractor { + + @Override + public void onStart( + AttributesBuilder attributes, Context parentContext, CassandraRequest request) {} + + @Override + public void onEnd( + AttributesBuilder attributes, + Context context, + CassandraRequest request, + @Nullable ExecutionInfo executionInfo, + @Nullable Throwable error) { + if (executionInfo == null) { + return; + } + + Node coordinator = executionInfo.getCoordinator(); + if (coordinator != null) { + if (coordinator.getDatacenter() != null) { + attributes.put(SemanticAttributes.DB_CASSANDRA_COORDINATOR_DC, coordinator.getDatacenter()); + } + if (coordinator.getHostId() != null) { + attributes.put( + SemanticAttributes.DB_CASSANDRA_COORDINATOR_ID, coordinator.getHostId().toString()); + } + } + attributes.put( + SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, + executionInfo.getSpeculativeExecutionCount()); + + Statement statement = executionInfo.getStatement(); + String consistencyLevel; + DriverExecutionProfile config = + request.getSession().getContext().getConfig().getDefaultProfile(); + if (statement.getConsistencyLevel() != null) { + consistencyLevel = statement.getConsistencyLevel().name(); + } else { + consistencyLevel = config.getString(DefaultDriverOption.REQUEST_CONSISTENCY); + } + attributes.put(SemanticAttributes.DB_CASSANDRA_CONSISTENCY_LEVEL, consistencyLevel); + + if (statement.getPageSize() > 0) { + attributes.put(SemanticAttributes.DB_CASSANDRA_PAGE_SIZE, statement.getPageSize()); + } else { + int pageSize = config.getInt(DefaultDriverOption.REQUEST_PAGE_SIZE); + if (pageSize > 0) { + attributes.put(SemanticAttributes.DB_CASSANDRA_PAGE_SIZE, pageSize); + } + } + + Boolean idempotent = statement.isIdempotent(); + if (idempotent == null) { + idempotent = config.getBoolean(DefaultDriverOption.REQUEST_DEFAULT_IDEMPOTENCE); + } + attributes.put(SemanticAttributes.DB_CASSANDRA_IDEMPOTENCE, idempotent); + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java index fad308fe813a..1d450da1b951 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraClientInstrumentationModule.java @@ -5,15 +5,19 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Collections.singletonList; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) public class CassandraClientInstrumentationModule extends InstrumentationModule { + public CassandraClientInstrumentationModule() { super("cassandra", "cassandra-4.0"); } @@ -22,4 +26,10 @@ public CassandraClientInstrumentationModule() { public List typeInstrumentations() { return singletonList(new SessionBuilderInstrumentation()); } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // new public interface introduced in version 4.4 + return not(hasClassesNamed("com.datastax.dse.driver.api.core.cql.reactive.ReactiveSession")); + } } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java new file mode 100644 index 000000000000..5d3dd467e680 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraNetAttributesGetter.java @@ -0,0 +1,52 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; + +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import com.datastax.oss.driver.api.core.metadata.Node; +import io.opentelemetry.instrumentation.api.instrumenter.net.InetSocketAddressNetClientAttributesGetter; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import javax.annotation.Nullable; + +final class CassandraNetAttributesGetter + extends InetSocketAddressNetClientAttributesGetter { + + @Override + @Nullable + public String getTransport(CassandraRequest request, @Nullable ExecutionInfo executionInfo) { + return null; + } + + @Nullable + @Override + public String getPeerName(CassandraRequest request) { + return null; + } + + @Nullable + @Override + public Integer getPeerPort(CassandraRequest request) { + return null; + } + + @Override + @Nullable + protected InetSocketAddress getPeerSocketAddress( + CassandraRequest request, @Nullable ExecutionInfo executionInfo) { + if (executionInfo == null) { + return null; + } + Node coordinator = executionInfo.getCoordinator(); + if (coordinator == null) { + return null; + } + // resolve() returns an existing InetSocketAddress, it does not do a dns resolve, + // at least in the only current EndPoint implementation (DefaultEndPoint) + SocketAddress address = coordinator.getEndPoint().resolve(); + return address instanceof InetSocketAddress ? (InetSocketAddress) address : null; + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java new file mode 100644 index 000000000000..9c783cc3f196 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraRequest.java @@ -0,0 +1,21 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; + +import com.datastax.oss.driver.api.core.session.Session; +import com.google.auto.value.AutoValue; + +@AutoValue +public abstract class CassandraRequest { + + public static CassandraRequest create(Session session, String statement) { + return new AutoValue_CassandraRequest(session, statement); + } + + public abstract Session getSession(); + + public abstract String getStatement(); +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java index a8156cfe2928..b84df6935485 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -5,15 +5,45 @@ package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.cassandra.v4_4.CassandraTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientSpanNameExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor; import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -final class CassandraSingletons { - static final CassandraTelemetry telemetry = - CassandraTelemetry.builder(GlobalOpenTelemetry.get()) - .setStatementSanitizationEnabled(CommonConfig.get().isStatementSanitizationEnabled()) - .build(); +public final class CassandraSingletons { + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.cassandra-4.0"; + + // using ExecutionInfo because we can get that from ResultSet, AsyncResultSet and DriverException + private static final Instrumenter INSTRUMENTER; + + static { + CassandraSqlAttributesGetter attributesGetter = new CassandraSqlAttributesGetter(); + + INSTRUMENTER = + Instrumenter.builder( + GlobalOpenTelemetry.get(), + INSTRUMENTATION_NAME, + DbClientSpanNameExtractor.create(attributesGetter)) + .addAttributesExtractor( + SqlClientAttributesExtractor.builder(attributesGetter) + .setTableAttribute(SemanticAttributes.DB_CASSANDRA_TABLE) + .setStatementSanitizationEnabled( + CommonConfig.get().isStatementSanitizationEnabled()) + .build()) + .addAttributesExtractor( + NetClientAttributesExtractor.create(new CassandraNetAttributesGetter())) + .addAttributesExtractor(new CassandraAttributesExtractor()) + .buildInstrumenter(SpanKindExtractor.alwaysClient()); + } + + public static Instrumenter instrumenter() { + return INSTRUMENTER; + } private CassandraSingletons() {} } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java new file mode 100644 index 000000000000..b56af5fc716c --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSqlAttributesGetter.java @@ -0,0 +1,43 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import io.opentelemetry.instrumentation.api.instrumenter.db.SqlClientAttributesGetter; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import javax.annotation.Nullable; + +final class CassandraSqlAttributesGetter implements SqlClientAttributesGetter { + + @Override + public String getSystem(CassandraRequest request) { + return SemanticAttributes.DbSystemValues.CASSANDRA; + } + + @Override + @Nullable + public String getUser(CassandraRequest request) { + return null; + } + + @Override + @Nullable + public String getName(CassandraRequest request) { + return request.getSession().getKeyspace().map(CqlIdentifier::toString).orElse(null); + } + + @Override + @Nullable + public String getConnectionString(CassandraRequest request) { + return null; + } + + @Override + @Nullable + public String getRawStatement(CassandraRequest request) { + return request.getStatement(); + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java index 59d3e4322454..14aa73c84911 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CompletionStageFunction.java @@ -19,6 +19,6 @@ public Object apply(Object session) { if (session.getClass().getName().endsWith("cassandra4.TracingCqlSession")) { return session; } - return CassandraSingletons.telemetry.wrap((CqlSession) session); + return new TracingCqlSession((CqlSession) session); } } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java new file mode 100644 index 000000000000..726ea9e4db89 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/TracingCqlSession.java @@ -0,0 +1,267 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_0; + +import static io.opentelemetry.javaagent.instrumentation.cassandra.v4_0.CassandraSingletons.instrumenter; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.DriverException; +import com.datastax.oss.driver.api.core.context.DriverContext; +import com.datastax.oss.driver.api.core.cql.AsyncResultSet; +import com.datastax.oss.driver.api.core.cql.BoundStatement; +import com.datastax.oss.driver.api.core.cql.ExecutionInfo; +import com.datastax.oss.driver.api.core.cql.PrepareRequest; +import com.datastax.oss.driver.api.core.cql.PreparedStatement; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.core.cql.Statement; +import com.datastax.oss.driver.api.core.metadata.Metadata; +import com.datastax.oss.driver.api.core.metrics.Metrics; +import com.datastax.oss.driver.api.core.session.Request; +import com.datastax.oss.driver.api.core.type.reflect.GenericType; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import java.util.function.Supplier; +import javax.annotation.Nullable; + +public class TracingCqlSession implements CqlSession { + private final CqlSession session; + + public TracingCqlSession(CqlSession session) { + this.session = session; + } + + @Override + public PreparedStatement prepare(SimpleStatement statement) { + return session.prepare(statement); + } + + @Override + public PreparedStatement prepare(String query) { + return session.prepare(query); + } + + @Override + public PreparedStatement prepare(PrepareRequest request) { + return session.prepare(request); + } + + @Override + public CompletionStage prepareAsync(SimpleStatement statement) { + return session.prepareAsync(statement); + } + + @Override + public CompletionStage prepareAsync(String query) { + return session.prepareAsync(query); + } + + @Override + public CompletionStage prepareAsync(PrepareRequest request) { + return session.prepareAsync(request); + } + + @Override + public String getName() { + return session.getName(); + } + + @Override + public Metadata getMetadata() { + return session.getMetadata(); + } + + @Override + public boolean isSchemaMetadataEnabled() { + return session.isSchemaMetadataEnabled(); + } + + @Override + public CompletionStage setSchemaMetadataEnabled(@Nullable Boolean newValue) { + return session.setSchemaMetadataEnabled(newValue); + } + + @Override + public CompletionStage refreshSchemaAsync() { + return session.refreshSchemaAsync(); + } + + @Override + public Metadata refreshSchema() { + return session.refreshSchema(); + } + + @Override + public CompletionStage checkSchemaAgreementAsync() { + return session.checkSchemaAgreementAsync(); + } + + @Override + public boolean checkSchemaAgreement() { + return session.checkSchemaAgreement(); + } + + @Override + public DriverContext getContext() { + return session.getContext(); + } + + @Override + public Optional getKeyspace() { + return session.getKeyspace(); + } + + @Override + public Optional getMetrics() { + return session.getMetrics(); + } + + @Override + public CompletionStage closeFuture() { + return session.closeFuture(); + } + + @Override + public boolean isClosed() { + return session.isClosed(); + } + + @Override + public CompletionStage closeAsync() { + return session.closeAsync(); + } + + @Override + public CompletionStage forceCloseAsync() { + return session.forceCloseAsync(); + } + + @Override + public void close() { + session.close(); + } + + @Override + @Nullable + public RESULT execute( + REQUEST request, GenericType resultType) { + return session.execute(request, resultType); + } + + @Override + public ResultSet execute(String query) { + CassandraRequest request = CassandraRequest.create(session, query); + Context context = instrumenter().start(Context.current(), request); + ResultSet resultSet; + try (Scope ignored = context.makeCurrent()) { + resultSet = session.execute(query); + } catch (RuntimeException e) { + instrumenter().end(context, request, getExecutionInfo(e), e); + throw e; + } + instrumenter().end(context, request, resultSet.getExecutionInfo(), null); + return resultSet; + } + + @Override + public ResultSet execute(Statement statement) { + String query = getQuery(statement); + CassandraRequest request = CassandraRequest.create(session, query); + Context context = instrumenter().start(Context.current(), request); + ResultSet resultSet; + try (Scope ignored = context.makeCurrent()) { + resultSet = session.execute(statement); + } catch (RuntimeException e) { + instrumenter().end(context, request, getExecutionInfo(e), e); + throw e; + } + instrumenter().end(context, request, resultSet.getExecutionInfo(), null); + return resultSet; + } + + @Override + public CompletionStage executeAsync(Statement statement) { + String query = getQuery(statement); + CassandraRequest request = CassandraRequest.create(session, query); + return executeAsync(request, () -> session.executeAsync(statement)); + } + + @Override + public CompletionStage executeAsync(String query) { + CassandraRequest request = CassandraRequest.create(session, query); + return executeAsync(request, () -> session.executeAsync(query)); + } + + private static CompletionStage executeAsync( + CassandraRequest request, Supplier> query) { + Context parentContext = Context.current(); + Context context = instrumenter().start(parentContext, request); + try (Scope ignored = context.makeCurrent()) { + CompletionStage stage = query.get(); + return wrap( + stage.whenComplete( + (asyncResultSet, throwable) -> + instrumenter() + .end( + context, + request, + getExecutionInfo(asyncResultSet, throwable), + throwable)), + parentContext); + } + } + + static CompletableFuture wrap(CompletionStage future, Context context) { + CompletableFuture result = new CompletableFuture<>(); + future.whenComplete( + (T value, Throwable throwable) -> { + try (Scope ignored = context.makeCurrent()) { + if (throwable != null) { + result.completeExceptionally(throwable); + } else { + result.complete(value); + } + } + }); + + return result; + } + + private static String getQuery(Statement statement) { + String query = null; + if (statement instanceof SimpleStatement) { + query = ((SimpleStatement) statement).getQuery(); + } else if (statement instanceof BoundStatement) { + query = ((BoundStatement) statement).getPreparedStatement().getQuery(); + } + + return query == null ? "" : query; + } + + private static ExecutionInfo getExecutionInfo( + @Nullable AsyncResultSet asyncResultSet, @Nullable Throwable throwable) { + if (asyncResultSet != null) { + return asyncResultSet.getExecutionInfo(); + } else { + return getExecutionInfo(throwable); + } + } + + private static ExecutionInfo getExecutionInfo(@Nullable Throwable throwable) { + if (throwable instanceof DriverException) { + return ((DriverException) throwable).getExecutionInfo(); + } else if (throwable != null && throwable.getCause() instanceof DriverException) { + // TODO (trask) find out if this is needed and if so add comment explaining + return ((DriverException) throwable.getCause()).getExecutionInfo(); + } else { + return null; + } + } +} diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/CassandraTest.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/CassandraTest.java new file mode 100644 index 000000000000..4db6a86efbdb --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/CassandraTest.java @@ -0,0 +1,20 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import io.opentelemetry.cassandra.v4.common.AbstractCassandraTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class CassandraTest extends AbstractCassandraTest { + + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts index df5efbeaca4b..f2e744e7c677 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/build.gradle.kts @@ -20,7 +20,10 @@ dependencies { annotationProcessor("com.google.auto.value:auto-value") testImplementation("io.projectreactor:reactor-core:3.4.21") - testImplementation(project(":instrumentation:cassandra:testing")) + testImplementation(project(":instrumentation:cassandra:cassandra-4.4:testing")) + + testInstrumentation(project(":instrumentation:cassandra:cassandra-3.0:javaagent")) + testInstrumentation(project(":instrumentation:cassandra:cassandra-4.0:javaagent")) } tasks { diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java index a3bf48e642c9..7736488a447d 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraClientInstrumentationModule.java @@ -16,6 +16,7 @@ @AutoService(InstrumentationModule.class) public class CassandraClientInstrumentationModule extends InstrumentationModule { + public CassandraClientInstrumentationModule() { super("cassandra", "cassandra-4.4"); } diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy deleted file mode 100644 index 775d3a55557a..000000000000 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/groovy/CassandraClientTest.groovy +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -import com.datastax.oss.driver.api.core.CqlSession -import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.instrumentation.cassandra.AbstractCassandraClientTest -import reactor.core.publisher.Flux - -class CassandraClientTest extends AbstractCassandraClientTest { - - def "test reactive"() { - setup: - CqlSession session = getSession(keyspace) - - runWithSpan("parent") { - Flux.from(session.executeReactive(statement)).doOnComplete({ result -> - runWithSpan("child") {} - }).blockLast() - } - - expect: - assertTraces(1) { - trace(0, 3) { - span(0) { - name "parent" - kind SpanKind.INTERNAL - hasNoParent() - } - cassandraSpan(it, 1, spanName, expectedStatement, operation, keyspace, table, span(0)) - span(2) { - name "child" - kind SpanKind.INTERNAL - childOf span(0) - } - } - } - - cleanup: - session.close() - - where: - keyspace | statement | expectedStatement | spanName | operation | table - null | "DROP KEYSPACE IF EXISTS reactive_test" | "DROP KEYSPACE IF EXISTS reactive_test" | "DB Query" | null | null - null | "CREATE KEYSPACE reactive_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | "CREATE KEYSPACE reactive_test WITH REPLICATION = {?:?, ?:?}" | "DB Query" | null | null - "reactive_test" | "CREATE TABLE reactive_test.users ( id UUID PRIMARY KEY, name text )" | "CREATE TABLE reactive_test.users ( id UUID PRIMARY KEY, name text )" | "reactive_test" | null | null - "reactive_test" | "INSERT INTO reactive_test.users (id, name) values (uuid(), 'alice')" | "INSERT INTO reactive_test.users (id, name) values (uuid(), ?)" | "INSERT reactive_test.users" | "INSERT" | "reactive_test.users" - "reactive_test" | "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "SELECT * FROM users where name = ? ALLOW FILTERING" | "SELECT reactive_test.users" | "SELECT" | "users" - } - -} diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java new file mode 100644 index 000000000000..ce772549f734 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java @@ -0,0 +1,17 @@ +package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; + +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.testing.cassandra.v4_4.AbstractCassandra44Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class CassandraTest extends AbstractCassandra44Test { + + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts index 0bc2f35170f0..c0f0592742a9 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/library/build.gradle.kts @@ -7,4 +7,6 @@ dependencies { compileOnly("com.google.auto.value:auto-value-annotations") annotationProcessor("com.google.auto.value:auto-value") + + testImplementation(project(":instrumentation:cassandra:cassandra-4.4:testing")) } diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java b/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java new file mode 100644 index 000000000000..7de7bd905a46 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java @@ -0,0 +1,23 @@ +package io.opentelemetry.instrumentation.cassandra.v4_4; + +import com.datastax.oss.driver.api.core.CqlSession; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import io.opentelemetry.testing.cassandra.v4_4.AbstractCassandra44Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class CassandraTest extends AbstractCassandra44Test { + + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + protected CqlSession wrap(CqlSession session) { + return CassandraTelemetry.create(testing.getOpenTelemetry()).wrap(session); + } +} diff --git a/instrumentation/cassandra/cassandra-4.4/testing/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/testing/build.gradle.kts new file mode 100644 index 000000000000..1057ebc57bc2 --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.4/testing/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { + api(project(":testing-common")) + + implementation("com.datastax.oss:java-driver-core:4.4.0") + + api(project(":instrumentation:cassandra:cassandra-4-common:testing")) +} diff --git a/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java new file mode 100644 index 000000000000..de31ff357d2c --- /dev/null +++ b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java @@ -0,0 +1,8 @@ +package io.opentelemetry.testing.cassandra.v4_4; + +import io.opentelemetry.cassandra.v4.common.AbstractCassandraTest; + +public abstract class AbstractCassandra44Test extends AbstractCassandraTest { + + // TODO add reactive tests here +} diff --git a/instrumentation/cassandra/testing/src/main/groovy/io/opentelemetry/instrumentation/cassandra/AbstractCassandraClientTest.groovy b/instrumentation/cassandra/testing/src/main/groovy/io/opentelemetry/instrumentation/cassandra/AbstractCassandraClientTest.groovy deleted file mode 100644 index d8f618339f42..000000000000 --- a/instrumentation/cassandra/testing/src/main/groovy/io/opentelemetry/instrumentation/cassandra/AbstractCassandraClientTest.groovy +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.cassandra - -import com.datastax.oss.driver.api.core.CqlSession -import com.datastax.oss.driver.api.core.config.DefaultDriverOption -import com.datastax.oss.driver.api.core.config.DriverConfigLoader -import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader -import io.opentelemetry.api.trace.SpanKind -import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import io.opentelemetry.instrumentation.test.asserts.TraceAssert -import io.opentelemetry.sdk.trace.data.SpanData -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes -import org.slf4j.Logger -import org.slf4j.LoggerFactory -import org.testcontainers.containers.GenericContainer -import org.testcontainers.containers.output.Slf4jLogConsumer -import spock.lang.Shared - -import java.time.Duration - -import static io.opentelemetry.api.trace.SpanKind.CLIENT - -abstract class AbstractCassandraClientTest extends AgentInstrumentationSpecification { - private static final Logger logger = LoggerFactory.getLogger(AbstractCassandraClientTest) - - @Shared - GenericContainer cassandra - @Shared - int cassandraPort - - def setupSpec() { - cassandra = new GenericContainer("cassandra:4.0") - // limit memory usage - .withEnv("JVM_OPTS", "-Xmx128m -Xms128m") - .withExposedPorts(9042) - .withLogConsumer(new Slf4jLogConsumer(logger)) - .withStartupTimeout(Duration.ofSeconds(120)) - cassandra.start() - - cassandraPort = cassandra.getMappedPort(9042) - } - - def cleanupSpec() { - cassandra.stop() - } - - def "test sync"() { - setup: - CqlSession session = getSession(keyspace) - - session.execute(statement) - - expect: - assertTraces(1) { - trace(0, 1) { - cassandraSpan(it, 0, spanName, expectedStatement, operation, keyspace, table) - } - } - - cleanup: - session.close() - - where: - keyspace | statement | expectedStatement | spanName | operation | table - null | "DROP KEYSPACE IF EXISTS sync_test" | "DROP KEYSPACE IF EXISTS sync_test" | "DB Query" | null | null - null | "CREATE KEYSPACE sync_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | "CREATE KEYSPACE sync_test WITH REPLICATION = {?:?, ?:?}" | "DB Query" | null | null - "sync_test" | "CREATE TABLE sync_test.users ( id UUID PRIMARY KEY, name text )" | "CREATE TABLE sync_test.users ( id UUID PRIMARY KEY, name text )" | "sync_test" | null | null - "sync_test" | "INSERT INTO sync_test.users (id, name) values (uuid(), 'alice')" | "INSERT INTO sync_test.users (id, name) values (uuid(), ?)" | "INSERT sync_test.users" | "INSERT" | "sync_test.users" - "sync_test" | "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "SELECT * FROM users where name = ? ALLOW FILTERING" | "SELECT sync_test.users" | "SELECT" | "users" - } - - def "test async"() { - setup: - CqlSession session = getSession(keyspace) - - runWithSpan("parent") { - session.executeAsync(statement).toCompletableFuture().whenComplete({ result, throwable -> - runWithSpan("child") {} - }).get() - } - - expect: - assertTraces(1) { - trace(0, 3) { - span(0) { - name "parent" - kind SpanKind.INTERNAL - hasNoParent() - } - cassandraSpan(it, 1, spanName, expectedStatement, operation, keyspace, table, span(0)) - span(2) { - name "child" - kind SpanKind.INTERNAL - childOf span(0) - } - } - } - - cleanup: - session.close() - - where: - keyspace | statement | expectedStatement | spanName | operation | table - null | "DROP KEYSPACE IF EXISTS async_test" | "DROP KEYSPACE IF EXISTS async_test" | "DB Query" | null | null - null | "CREATE KEYSPACE async_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}" | "CREATE KEYSPACE async_test WITH REPLICATION = {?:?, ?:?}" | "DB Query" | null | null - "async_test" | "CREATE TABLE async_test.users ( id UUID PRIMARY KEY, name text )" | "CREATE TABLE async_test.users ( id UUID PRIMARY KEY, name text )" | "async_test" | null | null - "async_test" | "INSERT INTO async_test.users (id, name) values (uuid(), 'alice')" | "INSERT INTO async_test.users (id, name) values (uuid(), ?)" | "INSERT async_test.users" | "INSERT" | "async_test.users" - "async_test" | "SELECT * FROM users where name = 'alice' ALLOW FILTERING" | "SELECT * FROM users where name = ? ALLOW FILTERING" | "SELECT async_test.users" | "SELECT" | "users" - } - - def cassandraSpan(TraceAssert trace, int index, String spanName, String statement, String operation, String keyspace, String table, Object parentSpan = null) { - trace.span(index) { - name spanName - kind CLIENT - if (parentSpan == null) { - hasNoParent() - } else { - childOf((SpanData) parentSpan) - } - attributes { - "$SemanticAttributes.NET_SOCK_PEER_ADDR" "127.0.0.1" - "$SemanticAttributes.NET_SOCK_PEER_NAME" "localhost" - "$SemanticAttributes.NET_SOCK_PEER_PORT" cassandraPort - "$SemanticAttributes.DB_SYSTEM" "cassandra" - "$SemanticAttributes.DB_NAME" keyspace - "$SemanticAttributes.DB_STATEMENT" statement - "$SemanticAttributes.DB_OPERATION" operation - "$SemanticAttributes.DB_CASSANDRA_CONSISTENCY_LEVEL" "LOCAL_ONE" - "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_DC" "datacenter1" - "$SemanticAttributes.DB_CASSANDRA_COORDINATOR_ID" String - "$SemanticAttributes.DB_CASSANDRA_IDEMPOTENCE" Boolean - "$SemanticAttributes.DB_CASSANDRA_PAGE_SIZE" 5000 - "$SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT" 0 - // the SqlStatementSanitizer can't handle CREATE statements yet - "$SemanticAttributes.DB_CASSANDRA_TABLE" table - } - } - } - - def getSession(String keyspace) { - DriverConfigLoader configLoader = DefaultDriverConfigLoader.builder() - .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(0)) - .build() - return CqlSession.builder() - .addContactPoint(new InetSocketAddress("localhost", cassandraPort)) - .withConfigLoader(configLoader) - .withLocalDatacenter("datacenter1") - .withKeyspace((String) keyspace) - .build() - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 7f246fe69dfa..629c51c2bdb2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -175,7 +175,8 @@ hideFromDependabot(":instrumentation:cassandra:cassandra-3.0:javaagent") hideFromDependabot(":instrumentation:cassandra:cassandra-4.0:javaagent") hideFromDependabot(":instrumentation:cassandra:cassandra-4.4:javaagent") hideFromDependabot(":instrumentation:cassandra:cassandra-4.4:library") -hideFromDependabot(":instrumentation:cassandra:testing") +hideFromDependabot(":instrumentation:cassandra:cassandra-4.4:testing") +hideFromDependabot(":instrumentation:cassandra:cassandra-4-common:testing") hideFromDependabot(":instrumentation:cdi-testing") hideFromDependabot(":instrumentation:graphql-java-12.0:javaagent") hideFromDependabot(":instrumentation:graphql-java-12.0:library") From a924133f78f6cc63b9200ef1ffd9d9efea17ceef Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 26 Feb 2023 18:46:01 -0800 Subject: [PATCH 15/18] todo --- .../cassandra/v4_4/CassandraAttributesExtractor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java index d8db3ecf661d..a4fa48671656 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java @@ -24,7 +24,6 @@ public void onStart( AttributesBuilder attributes, Context parentContext, CassandraRequest request) {} @Override - @SuppressWarnings("deprecation") // used for 4.0 compatibility (TODO trask is this needed?) public void onEnd( AttributesBuilder attributes, Context context, @@ -49,6 +48,8 @@ public void onEnd( SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, executionInfo.getSpeculativeExecutionCount()); + // TODO can this be rewritten using newer API? + @SuppressWarnings("deprecation") Statement statement = executionInfo.getStatement(); String consistencyLevel; DriverExecutionProfile config = From 19225cdb094fed66d70262c6db8aae3e6274adf8 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sun, 26 Feb 2023 18:48:11 -0800 Subject: [PATCH 16/18] Update docs --- docs/supported-libraries.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/supported-libraries.md b/docs/supported-libraries.md index a56ac113a612..37c9bbb23c84 100644 --- a/docs/supported-libraries.md +++ b/docs/supported-libraries.md @@ -42,7 +42,7 @@ These are the supported libraries and frameworks: | [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/java-handler.html) | 1.0+ | [opentelemetry-aws-lambda-core-1.0](../instrumentation/aws-lambda/aws-lambda-core-1.0/library),
[opentelemetry-aws-lambda-events-2.2](../instrumentation/aws-lambda/aws-lambda-events-2.2/library) | [FaaS Server Spans] | | [AWS SDK](https://aws.amazon.com/sdk-for-java/) | 1.11.x and 2.2.0+ | [opentelemetry-aws-sdk-1.11](../instrumentation/aws-sdk/aws-sdk-1.11/library),
[opentelemetry-aws-sdk-1.11-autoconfigure](../instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure),
[opentelemetry-aws-sdk-2.2](../instrumentation/aws-sdk/aws-sdk-2.2/library),
[opentelemetry-aws-sdk-2.2-autoconfigure](../instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure) | [Messaging Spans], [Database Client Spans], [HTTP Client Spans] | | [Azure Core](https://docs.microsoft.com/en-us/java/api/overview/azure/core-readme) | 1.14+ | N/A | Context propagation | -| [Cassandra Driver](https://github.com/datastax/java-driver) | 3.0+ | N/A | [Database Client Spans] | +| [Cassandra Driver](https://github.com/datastax/java-driver) | 3.0+ | [opentelemetry-cassandra-4.4](../instrumentation/cassandra/cassandra-4.4/library) | [Database Client Spans] | | [Couchbase Client](https://github.com/couchbase/couchbase-java-client) | 2.0+ and 3.1+ | N/A | [Database Client Spans] | | [c3p0](https://github.com/swaldman/c3p0) | 0.9.2+ | [opentelemetry-c3p0-0.9](../instrumentation/c3p0-0.9/library) | [Database Pool Metrics] | | [Dropwizard Metrics](https://metrics.dropwizard.io/) | 4.0+ (disabled by default) | N/A | none | From 2385797ceceaa103e0daaadceaafda5f6246ea75 Mon Sep 17 00:00:00 2001 From: Simone Giusso Date: Mon, 27 Feb 2023 22:44:31 +0100 Subject: [PATCH 17/18] Rewrite cassandra reactive test in java --- .../v4/common/AbstractCassandraTest.java | 6 +- .../cassandra/v4_4/TracingCqlSession.java | 2 +- .../cassandra-4.4/testing/build.gradle.kts | 1 + .../v4_4/AbstractCassandra44Test.java | 128 +++++++++++++++++- 4 files changed, 132 insertions(+), 5 deletions(-) diff --git a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java index c14e3f02a1fe..aa62d51e05de 100644 --- a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java +++ b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java @@ -44,7 +44,7 @@ public abstract class AbstractCassandraTest { @SuppressWarnings("rawtypes") private static GenericContainer cassandra; - private static int cassandraPort; + protected static int cassandraPort; protected abstract InstrumentationExtension testing(); @@ -267,7 +267,7 @@ private static Stream provideAsyncParameters() { "users")))); } - private static class Parameter { + protected static class Parameter { public final String keyspace; public final String statement; public final String expectedStatement; @@ -291,7 +291,7 @@ public Parameter( } } - CqlSession getSession(String keyspace) { + protected CqlSession getSession(String keyspace) { DriverConfigLoader configLoader = DefaultDriverConfigLoader.builder() .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(0)) diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/TracingCqlSession.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/TracingCqlSession.java index bc10661699a9..4a1c43c47d98 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/TracingCqlSession.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/TracingCqlSession.java @@ -221,7 +221,7 @@ context, request, getExecutionInfo(asyncResultSet, throwable), throwable)), @Override public ReactiveResultSet executeReactive(Statement statement) { - return new DefaultReactiveResultSet(() -> session.executeAsync(statement)); + return new DefaultReactiveResultSet(() -> executeAsync(statement)); } static CompletableFuture wrap(CompletionStage future, Context context) { diff --git a/instrumentation/cassandra/cassandra-4.4/testing/build.gradle.kts b/instrumentation/cassandra/cassandra-4.4/testing/build.gradle.kts index 1057ebc57bc2..faaad8aa7951 100644 --- a/instrumentation/cassandra/cassandra-4.4/testing/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.4/testing/build.gradle.kts @@ -6,6 +6,7 @@ dependencies { api(project(":testing-common")) implementation("com.datastax.oss:java-driver-core:4.4.0") + implementation("io.projectreactor:reactor-core:3.5.3") api(project(":instrumentation:cassandra:cassandra-4-common:testing")) } diff --git a/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java index de31ff357d2c..1a5130ee55eb 100644 --- a/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java +++ b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java @@ -1,8 +1,134 @@ package io.opentelemetry.testing.cassandra.v4_4; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_CASSANDRA_CONSISTENCY_LEVEL; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_CASSANDRA_COORDINATOR_DC; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_CASSANDRA_COORDINATOR_ID; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_CASSANDRA_IDEMPOTENCE; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_CASSANDRA_PAGE_SIZE; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_CASSANDRA_TABLE; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_NAME; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.NET_SOCK_PEER_ADDR; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.NET_SOCK_PEER_NAME; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.NET_SOCK_PEER_PORT; +import static org.junit.jupiter.api.Named.named; + +import com.datastax.oss.driver.api.core.CqlSession; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.cassandra.v4.common.AbstractCassandraTest; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import reactor.core.publisher.Flux; public abstract class AbstractCassandra44Test extends AbstractCassandraTest { - // TODO add reactive tests here + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("provideReactiveParameters") + void reactiveTest(Parameter parameter) { + CqlSession session = getSession(parameter.keyspace); + + testing() + .runWithSpan( + "parent", + () -> + Flux.from(session.executeReactive(parameter.statement)) + .doOnComplete(() -> testing().runWithSpan("child", () -> {})) + .blockLast()); + + testing() + .waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), + span -> + span.hasName(parameter.spanName) + .hasKind(SpanKind.CLIENT) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(NET_SOCK_PEER_ADDR, "127.0.0.1"), + equalTo(NET_SOCK_PEER_NAME, "localhost"), + equalTo(NET_SOCK_PEER_PORT, cassandraPort), + equalTo(DB_SYSTEM, "cassandra"), + equalTo(DB_NAME, parameter.keyspace), + equalTo(DB_STATEMENT, parameter.expectedStatement), + equalTo(DB_OPERATION, parameter.operation), + equalTo(DB_CASSANDRA_CONSISTENCY_LEVEL, "LOCAL_ONE"), + equalTo(DB_CASSANDRA_COORDINATOR_DC, "datacenter1"), + satisfies( + DB_CASSANDRA_COORDINATOR_ID, + val -> val.isInstanceOf(String.class)), + satisfies( + DB_CASSANDRA_IDEMPOTENCE, + val -> val.isInstanceOf(Boolean.class)), + equalTo(DB_CASSANDRA_PAGE_SIZE, 5000), + equalTo(DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, 0), + equalTo(DB_CASSANDRA_TABLE, parameter.table)), + span -> + span.hasName("child") + .hasKind(SpanKind.INTERNAL) + .hasParent(trace.getSpan(0)))); + + session.close(); + } + + private static Stream provideReactiveParameters() { + return Stream.of( + Arguments.of( + named( + "Drop keyspace if exists", + new Parameter( + null, + "DROP KEYSPACE IF EXISTS reactive_test", + "DROP KEYSPACE IF EXISTS reactive_test", + "DB Query", + null, + null))), + Arguments.of( + named( + "Create keyspace with replication", + new Parameter( + null, + "CREATE KEYSPACE reactive_test WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3}", + "CREATE KEYSPACE reactive_test WITH REPLICATION = {?:?, ?:?}", + "DB Query", + null, + null))), + Arguments.of( + named( + "Create table", + new Parameter( + "reactive_test", + "CREATE TABLE reactive_test.users ( id UUID PRIMARY KEY, name text )", + "CREATE TABLE reactive_test.users ( id UUID PRIMARY KEY, name text )", + "reactive_test", + null, + null))), + Arguments.of( + named( + "Insert data", + new Parameter( + "reactive_test", + "INSERT INTO reactive_test.users (id, name) values (uuid(), 'alice')", + "INSERT INTO reactive_test.users (id, name) values (uuid(), ?)", + "INSERT reactive_test.users", + "INSERT", + "reactive_test.users"))), + Arguments.of( + named( + "Select data", + new Parameter( + "reactive_test", + "SELECT * FROM users where name = 'alice' ALLOW FILTERING", + "SELECT * FROM users where name = ? ALLOW FILTERING", + "SELECT reactive_test.users", + "SELECT", + "users")))); + } } From 8593fe492abd94c07b7101052f53b4f57b8e56a1 Mon Sep 17 00:00:00 2001 From: SimoneGiusso Date: Mon, 27 Feb 2023 23:16:26 +0100 Subject: [PATCH 18/18] Remove deprecated ExecutionInfo#getStatement method --- .../cassandra/v4/common/AbstractCassandraTest.java | 5 +++++ .../instrumentation/cassandra/v4_4/CassandraTest.java | 5 +++++ .../cassandra/v4_4/CassandraAttributesExtractor.java | 4 +--- .../instrumentation/cassandra/v4_4/CassandraTest.java | 5 +++++ .../testing/cassandra/v4_4/AbstractCassandra44Test.java | 5 +++++ 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java index aa62d51e05de..9b3b06a5770f 100644 --- a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java +++ b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.cassandra.v4.common; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java index ce772549f734..bb281d630b02 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.instrumentation.cassandra.v4_4; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java index a4fa48671656..08c93b9eb33f 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraAttributesExtractor.java @@ -48,9 +48,7 @@ public void onEnd( SemanticAttributes.DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT, executionInfo.getSpeculativeExecutionCount()); - // TODO can this be rewritten using newer API? - @SuppressWarnings("deprecation") - Statement statement = executionInfo.getStatement(); + Statement statement = (Statement) executionInfo.getRequest(); String consistencyLevel; DriverExecutionProfile config = request.getSession().getContext().getConfig().getDefaultProfile(); diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java b/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java index 7de7bd905a46..dcb2bb7848f0 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.cassandra.v4_4; import com.datastax.oss.driver.api.core.CqlSession; diff --git a/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java index 1a5130ee55eb..33f00b1790df 100644 --- a/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java +++ b/instrumentation/cassandra/cassandra-4.4/testing/src/main/java/io/opentelemetry/testing/cassandra/v4_4/AbstractCassandra44Test.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.testing.cassandra.v4_4; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;