From fc9609d814eedf6a2bec0cb98911e0a1c7bc0ada Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Wed, 21 Jul 2021 16:46:31 +0300 Subject: [PATCH] couchbase 3.2.0 (#3645) --- .../javaagent/build.gradle.kts | 9 ++- .../CouchbaseEnvironmentInstrumentation.java | 2 +- .../CouchbaseInstrumentationModule.java | 2 +- .../build.gradle.kts | 25 +++++++ .../couchbase-3.1/javaagent/build.gradle.kts | 4 +- .../CouchbaseEnvironmentInstrumentation.java | 4 +- .../v3_1/CouchbaseInstrumentationModule.java | 2 +- .../build.gradle.kts | 25 +++++++ .../couchbase-3.2/javaagent/build.gradle.kts | 26 +++++++ .../CouchbaseEnvironmentInstrumentation.java | 42 +++++++++++ .../v3_2/CouchbaseInstrumentationModule.java | 38 ++++++++++ .../test/groovy/CouchbaseClient32Test.groovy | 73 +++++++++++++++++++ .../build.gradle.kts | 25 +++++++ settings.gradle.kts | 4 + 14 files changed, 269 insertions(+), 12 deletions(-) create mode 100644 instrumentation/couchbase/couchbase-3.1.6/tracing-opentelemetry-shaded/build.gradle.kts create mode 100644 instrumentation/couchbase/couchbase-3.1/tracing-opentelemetry-shaded/build.gradle.kts create mode 100644 instrumentation/couchbase/couchbase-3.2/javaagent/build.gradle.kts create mode 100644 instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseEnvironmentInstrumentation.java create mode 100644 instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseInstrumentationModule.java create mode 100644 instrumentation/couchbase/couchbase-3.2/javaagent/src/test/groovy/CouchbaseClient32Test.groovy create mode 100644 instrumentation/couchbase/couchbase-3.2/tracing-opentelemetry-shaded/build.gradle.kts diff --git a/instrumentation/couchbase/couchbase-3.1.6/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-3.1.6/javaagent/build.gradle.kts index 91c226bb01..9f1f33a214 100644 --- a/instrumentation/couchbase/couchbase-3.1.6/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-3.1.6/javaagent/build.gradle.kts @@ -6,7 +6,7 @@ muzzle { pass { group.set("com.couchbase.client") module.set("java-client") - versions.set("[3.1.6,)") + versions.set("[3.1.6,3.2.0)") // these versions were released as ".bundle" instead of ".jar" skip("2.7.5", "2.7.8") assertInverse.set(true) @@ -16,13 +16,14 @@ muzzle { val versions: Map by project dependencies { - implementation("com.couchbase.client:tracing-opentelemetry:0.3.6") { - exclude("com.couchbase.client", "core-io") - } + implementation(project(path = ":instrumentation:couchbase:couchbase-3.1.6:tracing-opentelemetry-shaded", configuration = "shadow")) library("com.couchbase.client:core-io:2.1.6") testLibrary("com.couchbase.client:java-client:3.1.6") testImplementation("org.testcontainers:couchbase:${versions["org.testcontainers"]}") + + latestDepTestLibrary("com.couchbase.client:java-client:3.1.6") + latestDepTestLibrary("com.couchbase.client:core-io:2.1.6") } \ No newline at end of file diff --git a/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseEnvironmentInstrumentation.java b/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseEnvironmentInstrumentation.java index 5ccff74722..6bca59f335 100644 --- a/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseEnvironmentInstrumentation.java +++ b/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseEnvironmentInstrumentation.java @@ -9,7 +9,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; import com.couchbase.client.core.env.CoreEnvironment; -import com.couchbase.client.tracing.opentelemetry.OpenTelemetryRequestTracer; +import com.couchbase.v3_1_6.client.tracing.opentelemetry.OpenTelemetryRequestTracer; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseInstrumentationModule.java index b2fef4bb75..da83ed1864 100644 --- a/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseInstrumentationModule.java +++ b/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseInstrumentationModule.java @@ -22,7 +22,7 @@ public class CouchbaseInstrumentationModule extends InstrumentationModule { @Override public boolean isHelperClass(String className) { - return className.startsWith("com.couchbase.client.tracing.opentelemetry"); + return className.startsWith("com.couchbase.v3_1_6.client.tracing.opentelemetry"); } @Override diff --git a/instrumentation/couchbase/couchbase-3.1.6/tracing-opentelemetry-shaded/build.gradle.kts b/instrumentation/couchbase/couchbase-3.1.6/tracing-opentelemetry-shaded/build.gradle.kts new file mode 100644 index 0000000000..fa6fb22ccb --- /dev/null +++ b/instrumentation/couchbase/couchbase-3.1.6/tracing-opentelemetry-shaded/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("com.github.johnrengelman.shadow") + + id("otel.java-conventions") +} + +group = "io.opentelemetry.javaagent.instrumentation" + +dependencies { + implementation("com.couchbase.client:tracing-opentelemetry:0.3.6") +} + +tasks { + shadowJar { + dependencies { + // including only tracing-opentelemetry excludes its transitive dependencies + include(dependency("com.couchbase.client:tracing-opentelemetry")) + } + relocate("com.couchbase.client.tracing.opentelemetry", "com.couchbase.v3_1_6.client.tracing.opentelemetry") + } + + assemble { + dependsOn(shadowJar) + } +} \ No newline at end of file diff --git a/instrumentation/couchbase/couchbase-3.1/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-3.1/javaagent/build.gradle.kts index d7b7dddc9f..1fd892273b 100644 --- a/instrumentation/couchbase/couchbase-3.1/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-3.1/javaagent/build.gradle.kts @@ -16,9 +16,7 @@ muzzle { val versions: Map by project dependencies { - implementation("com.couchbase.client:tracing-opentelemetry:0.3.3") { - exclude("com.couchbase.client", "core-io") - } + implementation(project(path = ":instrumentation:couchbase:couchbase-3.1:tracing-opentelemetry-shaded", configuration = "shadow")) library("com.couchbase.client:core-io:2.1.0") diff --git a/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseEnvironmentInstrumentation.java b/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseEnvironmentInstrumentation.java index ecc05ae8c7..6827e03f48 100644 --- a/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseEnvironmentInstrumentation.java +++ b/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseEnvironmentInstrumentation.java @@ -9,7 +9,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; import com.couchbase.client.core.env.CoreEnvironment; -import com.couchbase.client.tracing.opentelemetry.OpenTelemetryRequestTracer; +import com.couchbase.v3_1.client.tracing.opentelemetry.OpenTelemetryRequestTracer; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -38,7 +38,7 @@ public class CouchbaseEnvironmentInstrumentation implements TypeInstrumentation public static void onExit(@Advice.This CoreEnvironment.Builder builder) { builder.requestTracer( OpenTelemetryRequestTracer.wrap( - GlobalOpenTelemetry.getTracer("io.opentelemetry.javaagent.couchbase-3.0"))); + GlobalOpenTelemetry.getTracer("io.opentelemetry.javaagent.couchbase-3.1"))); } } } diff --git a/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java index c92f003d97..8c249c0ddd 100644 --- a/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java +++ b/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java @@ -22,7 +22,7 @@ public class CouchbaseInstrumentationModule extends InstrumentationModule { @Override public boolean isHelperClass(String className) { - return className.startsWith("com.couchbase.client.tracing.opentelemetry"); + return className.startsWith("com.couchbase.v3_1.client.tracing.opentelemetry"); } @Override diff --git a/instrumentation/couchbase/couchbase-3.1/tracing-opentelemetry-shaded/build.gradle.kts b/instrumentation/couchbase/couchbase-3.1/tracing-opentelemetry-shaded/build.gradle.kts new file mode 100644 index 0000000000..e55aa18c65 --- /dev/null +++ b/instrumentation/couchbase/couchbase-3.1/tracing-opentelemetry-shaded/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("com.github.johnrengelman.shadow") + + id("otel.java-conventions") +} + +group = "io.opentelemetry.javaagent.instrumentation" + +dependencies { + implementation("com.couchbase.client:tracing-opentelemetry:0.3.3") +} + +tasks { + shadowJar { + dependencies { + // including only tracing-opentelemetry excludes its transitive dependencies + include(dependency("com.couchbase.client:tracing-opentelemetry")) + } + relocate("com.couchbase.client.tracing.opentelemetry", "com.couchbase.v3_1.client.tracing.opentelemetry") + } + + assemble { + dependsOn(shadowJar) + } +} \ No newline at end of file diff --git a/instrumentation/couchbase/couchbase-3.2/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-3.2/javaagent/build.gradle.kts new file mode 100644 index 0000000000..dad4030327 --- /dev/null +++ b/instrumentation/couchbase/couchbase-3.2/javaagent/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("com.couchbase.client") + module.set("java-client") + versions.set("[3.2.0,)") + // these versions were released as ".bundle" instead of ".jar" + skip("2.7.5", "2.7.8") + assertInverse.set(true) + } +} + +val versions: Map by project + +dependencies { + implementation(project(path = ":instrumentation:couchbase:couchbase-3.2:tracing-opentelemetry-shaded", configuration = "shadow")) + + library("com.couchbase.client:core-io:2.1.6") + + testLibrary("com.couchbase.client:java-client:3.2.0") + + testImplementation("org.testcontainers:couchbase:${versions["org.testcontainers"]}") +} \ No newline at end of file diff --git a/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseEnvironmentInstrumentation.java b/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseEnvironmentInstrumentation.java new file mode 100644 index 0000000000..ac3ed64b5e --- /dev/null +++ b/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseEnvironmentInstrumentation.java @@ -0,0 +1,42 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.couchbase.v3_2; + +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.named; + +import com.couchbase.client.core.env.CoreEnvironment; +import com.couchbase.v3_2.client.tracing.opentelemetry.OpenTelemetryRequestTracer; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public class CouchbaseEnvironmentInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("com.couchbase.client.core.env.CoreEnvironment$Builder"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isConstructor(), + CouchbaseEnvironmentInstrumentation.class.getName() + "$ConstructorAdvice"); + } + + @SuppressWarnings("unused") + public static class ConstructorAdvice { + + @Advice.OnMethodExit(suppress = Throwable.class) + public static void onExit(@Advice.This CoreEnvironment.Builder builder) { + builder.requestTracer(OpenTelemetryRequestTracer.wrap(GlobalOpenTelemetry.get())); + } + } +} diff --git a/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseInstrumentationModule.java new file mode 100644 index 0000000000..ec6192d881 --- /dev/null +++ b/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseInstrumentationModule.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.couchbase.v3_2; + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.Collections; +import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public class CouchbaseInstrumentationModule extends InstrumentationModule { + public CouchbaseInstrumentationModule() { + super("couchbase", "couchbase-3.1.6"); + } + + @Override + public boolean isHelperClass(String className) { + return className.startsWith("com.couchbase.v3_2.client.tracing.opentelemetry"); + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // New class introduced in 3.2. + return hasClassesNamed("com.couchbase.client.core.cnc.RequestSpan$StatusCode"); + } + + @Override + public List typeInstrumentations() { + return Collections.singletonList(new CouchbaseEnvironmentInstrumentation()); + } +} diff --git a/instrumentation/couchbase/couchbase-3.2/javaagent/src/test/groovy/CouchbaseClient32Test.groovy b/instrumentation/couchbase/couchbase-3.2/javaagent/src/test/groovy/CouchbaseClient32Test.groovy new file mode 100644 index 0000000000..cbf7a005ce --- /dev/null +++ b/instrumentation/couchbase/couchbase-3.2/javaagent/src/test/groovy/CouchbaseClient32Test.groovy @@ -0,0 +1,73 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import com.couchbase.client.core.error.DocumentNotFoundException +import com.couchbase.client.java.Cluster +import com.couchbase.client.java.Collection +import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification +import java.time.Duration +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.testcontainers.containers.output.Slf4jLogConsumer +import org.testcontainers.couchbase.BucketDefinition +import org.testcontainers.couchbase.CouchbaseContainer +import org.testcontainers.couchbase.CouchbaseService +import spock.lang.Shared + +// Couchbase instrumentation is owned upstream so we don't assert on the contents of the spans, only +// that the instrumentation is properly registered by the agent, meaning some spans were generated. +class CouchbaseClient32Test extends AgentInstrumentationSpecification { + private static final Logger logger = LoggerFactory.getLogger("couchbase-container") + + @Shared + CouchbaseContainer couchbase + @Shared + Cluster cluster + @Shared + Collection collection + + def setupSpec() { + couchbase = new CouchbaseContainer() + .withExposedPorts(8091) + .withEnabledServices(CouchbaseService.KV) + .withBucket(new BucketDefinition("test")) + .withLogConsumer(new Slf4jLogConsumer(logger)) + .withStartupTimeout(Duration.ofSeconds(120)) + couchbase.start() + + cluster = Cluster.connect(couchbase.connectionString, couchbase.username, couchbase.password) + def bucket = cluster.bucket("test") + collection = bucket.defaultCollection() + bucket.waitUntilReady(Duration.ofSeconds(10)) + } + + def cleanupSpec() { + couchbase.stop() + } + + def "emits spans"() { + when: + try { + collection.get("id") + } catch (DocumentNotFoundException e) { + // Expected + } + + then: + assertTraces(1) { + trace(0, 2) { + span(0) { + name(~/.*get/) + } + span(1) { + name(~/.*dispatch_to_server/) + } + } + } + + cleanup: + cluster.disconnect() + } +} diff --git a/instrumentation/couchbase/couchbase-3.2/tracing-opentelemetry-shaded/build.gradle.kts b/instrumentation/couchbase/couchbase-3.2/tracing-opentelemetry-shaded/build.gradle.kts new file mode 100644 index 0000000000..efca3d39ad --- /dev/null +++ b/instrumentation/couchbase/couchbase-3.2/tracing-opentelemetry-shaded/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("com.github.johnrengelman.shadow") + + id("otel.java-conventions") +} + +group = "io.opentelemetry.javaagent.instrumentation" + +dependencies { + implementation("com.couchbase.client:tracing-opentelemetry:1.0.0") +} + +tasks { + shadowJar { + dependencies { + // including only tracing-opentelemetry excludes its transitive dependencies + include(dependency("com.couchbase.client:tracing-opentelemetry")) + } + relocate("com.couchbase.client.tracing.opentelemetry", "com.couchbase.v3_2.client.tracing.opentelemetry") + } + + assemble { + dependsOn(shadowJar) + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 0d5ea31dc1..9d99849904 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -120,7 +120,11 @@ include(":instrumentation:couchbase:couchbase-2.0:javaagent") include(":instrumentation:couchbase:couchbase-2.0:javaagent-unit-tests") include(":instrumentation:couchbase:couchbase-2.6:javaagent") include(":instrumentation:couchbase:couchbase-3.1:javaagent") +include(":instrumentation:couchbase:couchbase-3.1:tracing-opentelemetry-shaded") include(":instrumentation:couchbase:couchbase-3.1.6:javaagent") +include(":instrumentation:couchbase:couchbase-3.1.6:tracing-opentelemetry-shaded") +include(":instrumentation:couchbase:couchbase-3.2:javaagent") +include(":instrumentation:couchbase:couchbase-3.2:tracing-opentelemetry-shaded") include(":instrumentation:couchbase:couchbase-testing") include(":instrumentation:dropwizard-views-0.7:javaagent") include(":instrumentation:dropwizard-testing")