From d6a8100100044a14a84e29d4d66d54dba6f5b4e2 Mon Sep 17 00:00:00 2001 From: Zixin Zhou Date: Sun, 16 Feb 2025 22:53:53 +0800 Subject: [PATCH 1/8] Add support for spring-pulsar 1.0 --- .fossa.yml | 3 + ...ntelemetry-instrumentation-annotations.txt | 2 +- .../opentelemetry-instrumentation-api.txt | 8 +- ...pentelemetry-spring-boot-autoconfigure.txt | 2 +- .../opentelemetry-spring-boot-starter.txt | 2 +- .../javaagent/build.gradle.kts | 31 ++++ ...ssageListenerContainerInstrumentation.java | 66 +++++++ .../pulsar/v1_0/MessageHeaderGetter.java | 25 +++ .../SpringPulsarInstrumentationModule.java | 25 +++ .../SpringPulsarMessageAttributesGetter.java | 90 ++++++++++ .../pulsar/v1_0/SpringPulsarSingletons.java | 41 +++++ .../spring/pulsar/v1_0/SpringPulsarTest.java | 161 ++++++++++++++++++ settings.gradle.kts | 1 + 13 files changed, 448 insertions(+), 9 deletions(-) create mode 100644 instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts create mode 100644 instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java create mode 100644 instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java create mode 100644 instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java create mode 100644 instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java create mode 100644 instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java create mode 100644 instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java diff --git a/.fossa.yml b/.fossa.yml index d0f8da960f6a..65248d617bcb 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -892,6 +892,9 @@ targets: - type: gradle path: ./ target: ':instrumentation:spring:spring-kafka-2.7:library' + - type: gradle + path: ./ + target: ':instrumentation:spring:spring-pulsar-1.0:javaagent' - type: gradle path: ./ target: ':instrumentation:spring:spring-rabbit-1.0:javaagent' diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt index 2e4aeb4d9a7b..db407fa46aa1 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-annotations.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-instrumentation-annotations-2.14.0-SNAPSHOT.jar against opentelemetry-instrumentation-annotations-2.12.0.jar +Comparing source compatibility of opentelemetry-instrumentation-annotations-2.14.0-SNAPSHOT.jar against opentelemetry-instrumentation-annotations-2.13.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-api.txt b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-api.txt index 5858cab07dd3..41bb84541e8b 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-api.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-instrumentation-api.txt @@ -1,6 +1,2 @@ -Comparing source compatibility of opentelemetry-instrumentation-api-2.14.0-SNAPSHOT.jar against opentelemetry-instrumentation-api-2.12.0.jar -+++ NEW CLASS: PUBLIC(+) FINAL(+) io.opentelemetry.instrumentation.api.semconv.util.SpanNames (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) STATIC(+) java.lang.String fromMethod(java.lang.reflect.Method) - +++ NEW METHOD: PUBLIC(+) STATIC(+) java.lang.String fromMethod(java.lang.Class, java.lang.String) +Comparing source compatibility of opentelemetry-instrumentation-api-2.14.0-SNAPSHOT.jar against opentelemetry-instrumentation-api-2.13.0.jar +No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-autoconfigure.txt b/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-autoconfigure.txt index b18c977efab4..cf17885ce061 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-autoconfigure.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-autoconfigure.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-spring-boot-autoconfigure-2.14.0-SNAPSHOT.jar against opentelemetry-spring-boot-autoconfigure-2.12.0.jar +Comparing source compatibility of opentelemetry-spring-boot-autoconfigure-2.14.0-SNAPSHOT.jar against opentelemetry-spring-boot-autoconfigure-2.13.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-starter.txt b/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-starter.txt index 2d60b4845c8a..8daf86a0d4a9 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-starter.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-spring-boot-starter.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-spring-boot-starter-2.14.0-SNAPSHOT.jar against opentelemetry-spring-boot-starter-2.12.0.jar +Comparing source compatibility of opentelemetry-spring-boot-starter-2.14.0-SNAPSHOT.jar against opentelemetry-spring-boot-starter-2.13.0.jar No changes. \ No newline at end of file diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts new file mode 100644 index 000000000000..aa5320ca5ad4 --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("org.springframework.pulsar") + module.set("spring-pulsar") + versions.set("[1.2.0,]") + } +} + +dependencies { + library("org.springframework.pulsar:spring-pulsar:1.2.0") + + testInstrumentation(project(":instrumentation:pulsar:pulsar-2.8:javaagent")) + testImplementation("org.testcontainers:pulsar") + + testLibrary("org.springframework.pulsar:spring-pulsar:1.2.0") + testLibrary("org.springframework.boot:spring-boot-starter-test:3.2.4") + testLibrary("org.springframework.boot:spring-boot-starter:3.2.4") +} + +val latestDepTest = findProperty("testLatestDeps") as Boolean + +// spring 6 (spring boot 3) requires java 17 +if (latestDepTest) { + otelJava { + minJavaVersionSupported.set(JavaVersion.VERSION_17) + } +} diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java new file mode 100644 index 000000000000..44d741500073 --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java @@ -0,0 +1,66 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; + +import static io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0.SpringPulsarSingletons.instrumenter; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; +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; +import org.apache.pulsar.client.api.Message; + +public class DefaultPulsarMessageListenerContainerInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named( + "org.springframework.pulsar.listener.DefaultPulsarMessageListenerContainer$Listener"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + named("dispatchMessageToListener") + .and(takesArguments(3)) + .and(takesArgument(0, named("org.apache.pulsar.client.api.Message"))), + getClass().getName() + "$DispatchMessageToListenerAdvice"); + } + + @SuppressWarnings("unused") + public static class DispatchMessageToListenerAdvice { + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Argument(0) Message message, + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope) { + Context parentContext = Java8BytecodeBridge.currentContext(); + if (instrumenter().shouldStart(parentContext, message)) { + context = instrumenter().start(parentContext, message); + scope = context.makeCurrent(); + } + } + + @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) + public static void onExit( + @Advice.Argument(0) Message message, + @Advice.Local("otelContext") Context context, + @Advice.Local("otelScope") Scope scope, + @Advice.Thrown Throwable throwable) { + if (scope == null) { + return; + } + scope.close(); + instrumenter().end(context, message, null, throwable); + } + } +} diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java new file mode 100644 index 000000000000..00e8313adaf4 --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; + +import io.opentelemetry.context.propagation.TextMapGetter; +import javax.annotation.Nullable; +import org.apache.pulsar.client.api.Message; + +enum MessageHeaderGetter implements TextMapGetter> { + INSTANCE; + + @Override + public Iterable keys(Message carrier) { + return carrier.getProperties().keySet(); + } + + @Nullable + @Override + public String get(@Nullable Message carrier, String key) { + return carrier == null ? null : carrier.getProperties().get(key); + } +} diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java new file mode 100644 index 000000000000..3af0a2e660b9 --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; + +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 SpringPulsarInstrumentationModule extends InstrumentationModule { + public SpringPulsarInstrumentationModule() { + super("spring-pulsar", "spring-pulsar-1.0"); + } + + @Override + public List typeInstrumentations() { + return singletonList(new DefaultPulsarMessageListenerContainerInstrumentation()); + } +} diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java new file mode 100644 index 000000000000..47e91df44e18 --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java @@ -0,0 +1,90 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; + +import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesGetter; +import java.util.List; +import javax.annotation.Nullable; +import org.apache.pulsar.client.api.Message; + +enum SpringPulsarMessageAttributesGetter implements MessagingAttributesGetter, Void> { + INSTANCE; + + @Override + public String getSystem(Message message) { + return "pulsar"; + } + + @Override + @Nullable + public String getDestination(Message message) { + return message.getTopicName(); + } + + @Nullable + @Override + public String getDestinationTemplate(Message message) { + return null; + } + + @Override + public boolean isTemporaryDestination(Message message) { + return false; + } + + @Override + public boolean isAnonymousDestination(Message message) { + return false; + } + + @Override + @Nullable + public String getConversationId(Message message) { + return null; + } + + @Override + public Long getMessageBodySize(Message message) { + return (long) message.size(); + } + + @Nullable + @Override + public Long getMessageEnvelopeSize(Message message) { + return null; + } + + @Override + @Nullable + public String getMessageId(Message message, @Nullable Void unused) { + if (message.getMessageId() != null) { + return message.getMessageId().toString(); + } + + return null; + } + + @Nullable + @Override + public String getClientId(Message message) { + return null; + } + + @Nullable + @Override + public Long getBatchMessageCount(Message message, @Nullable Void unused) { + return null; + } + + @Override + public List getMessageHeader(Message message, String name) { + String value = message.getProperty(name); + return value != null ? singletonList(value) : emptyList(); + } +} diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java new file mode 100644 index 000000000000..1d892f580a17 --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java @@ -0,0 +1,41 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation; +import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingSpanNameExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; +import org.apache.pulsar.client.api.Message; + +public final class SpringPulsarSingletons { + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-pulsar-1.0"; + private static final Instrumenter, Void> INSTRUMENTER; + + static { + SpringPulsarMessageAttributesGetter getter = SpringPulsarMessageAttributesGetter.INSTANCE; + MessageOperation operation = MessageOperation.PROCESS; + + INSTRUMENTER = + Instrumenter., Void>builder( + GlobalOpenTelemetry.get(), + INSTRUMENTATION_NAME, + MessagingSpanNameExtractor.create(getter, operation)) + .addAttributesExtractor( + MessagingAttributesExtractor.builder(getter, operation) + .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) + .build()) + .buildConsumerInstrumenter(MessageHeaderGetter.INSTANCE); + } + + public static Instrumenter, Void> instrumenter() { + return INSTRUMENTER; + } + + private SpringPulsarSingletons() {} +} diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java new file mode 100644 index 000000000000..a6faf83c8d32 --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java @@ -0,0 +1,161 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; + +import static io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0.SpringPulsarTest.ConsumerConfig.OTEL_TOPIC; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_BATCH_MESSAGE_COUNT; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; + +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.GlobalTraceUtil; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; +import org.apache.pulsar.client.api.PulsarClient; +import org.apache.pulsar.client.api.PulsarClientException; +import org.assertj.core.api.AbstractLongAssert; +import org.assertj.core.api.AbstractStringAssert; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.pulsar.annotation.PulsarListener; +import org.springframework.pulsar.core.PulsarTemplate; +import org.testcontainers.containers.PulsarContainer; +import org.testcontainers.utility.DockerImageName; + +public class SpringPulsarTest { + + @RegisterExtension + private static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + private static final DockerImageName DEFAULT_IMAGE_NAME = + DockerImageName.parse("apachepulsar/pulsar:4.0.2"); + private static PulsarContainer pulsarContainer; + private static ConfigurableApplicationContext applicationContext; + private static PulsarTemplate pulsarTemplate; + static String brokerHost; + static int brokerPort; + static PulsarClient client; + static String ip; + + @BeforeAll + @SuppressWarnings("unchecked") + static void setUp() throws PulsarClientException, UnknownHostException { + pulsarContainer = + new PulsarContainer(DEFAULT_IMAGE_NAME) + .withEnv("PULSAR_MEM", "-Xmx128m") + .withStartupTimeout(Duration.ofMinutes(2)); + pulsarContainer.start(); + brokerHost = pulsarContainer.getHost(); + brokerPort = pulsarContainer.getMappedPort(6650); + + SpringApplication app = new SpringApplication(ConsumerConfig.class); + Map props = new HashMap<>(); + props.put("spring.main.web-application-type", "none"); + props.put("spring.pulsar.client.service-url", pulsarContainer.getPulsarBrokerUrl()); + props.put("spring.pulsar.consumer.subscription.initial-position", "earliest"); + app.setDefaultProperties(props); + applicationContext = app.run(); + pulsarTemplate = applicationContext.getBean(PulsarTemplate.class); + + client = PulsarClient.builder().serviceUrl(pulsarContainer.getPulsarBrokerUrl()).build(); + ip = InetAddress.getByName(pulsarContainer.getHost()).getHostAddress(); + } + + @AfterAll + static void teardown() { + if (pulsarContainer != null) { + pulsarContainer.stop(); + } + if (applicationContext != null) { + applicationContext.close(); + } + } + + @Test + @SuppressWarnings("deprecation") // using deprecated semconv + public void shouldCreateSpansForMessageProcess() { + testing.runWithSpan( + "parent", + () -> { + pulsarTemplate.send(OTEL_TOPIC, "test"); + }); + testing.waitAndAssertTraces( + trace -> { + trace.hasSpansSatisfyingExactly( + span -> span.hasName("parent").hasKind(SpanKind.INTERNAL), + span -> + span.hasName(OTEL_TOPIC + " publish") + .hasKind(SpanKind.PRODUCER) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotEmpty), + equalTo(SERVER_ADDRESS, brokerHost), + equalTo(SERVER_PORT, brokerPort)), + span -> + span.hasName(String.format("%s process", OTEL_TOPIC)) + .hasKind(SpanKind.CONSUMER) + .hasParent(trace.getSpan(1)) + .hasAttributesSatisfyingExactly( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotEmpty), + equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC)), + span -> { + span.hasName("consumer").hasKind(SpanKind.INTERNAL).hasParent(trace.getSpan(2)); + }); + }, + trace -> { + trace.hasSpansSatisfyingExactly( + span -> + span.hasName(String.format("%s receive", OTEL_TOPIC)) + .hasKind(SpanKind.CONSUMER) + .hasAttributesSatisfyingExactly( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), + equalTo(SERVER_ADDRESS, brokerHost), + satisfies( + MESSAGING_BATCH_MESSAGE_COUNT, AbstractLongAssert::isNotNegative), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), + equalTo(SERVER_PORT, brokerPort))); + }); + } + + @SpringBootConfiguration + @EnableAutoConfiguration + static class ConsumerConfig { + static final String OTEL_TOPIC = "persistent://public/default/otel-topic"; + static final String OTEL_SUBSCRIPTION = "otel-subscription"; + + @PulsarListener(subscriptionName = OTEL_SUBSCRIPTION, topics = OTEL_TOPIC) + void consumer(String ignored) { + GlobalTraceUtil.runWithSpan("consumer", () -> {}); + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 7297f7a09484..5cd34288e75c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -551,6 +551,7 @@ include(":instrumentation:spring:spring-jms:spring-jms-6.0:javaagent") include(":instrumentation:spring:spring-kafka-2.7:javaagent") include(":instrumentation:spring:spring-kafka-2.7:library") include(":instrumentation:spring:spring-kafka-2.7:testing") +include(":instrumentation:spring:spring-pulsar-1.0:javaagent") include(":instrumentation:spring:spring-rabbit-1.0:javaagent") include(":instrumentation:spring:spring-rmi-4.0:javaagent") include(":instrumentation:spring:spring-scheduling-3.1:bootstrap") From bd365678f5771b2ba7dd1421e64ffbd88a229e9d Mon Sep 17 00:00:00 2001 From: Zixin Zhou Date: Fri, 28 Feb 2025 00:04:11 +0800 Subject: [PATCH 2/8] Fix issues in round1 --- .fossa.yml | 2 +- .../javaagent/build.gradle.kts | 31 ---- .../javaagent/build.gradle.kts | 52 +++++++ ...ssageListenerContainerInstrumentation.java | 4 +- .../pulsar/v1_2}/MessageHeaderGetter.java | 2 +- .../SpringPulsarInstrumentationModule.java | 4 +- .../SpringPulsarMessageAttributesGetter.java | 2 +- .../pulsar/v1_2}/SpringPulsarSingletons.java | 4 +- .../spring/pulsar/v1_2/SpringPulsarTest.java | 43 ++++++ .../SpringPulsarSuppressReceiveSpansTest.java | 37 +++++ .../testing/build.gradle.kts | 12 ++ .../v1_0/AbstractSpringPulsarTest.java} | 133 +++++++++--------- settings.gradle.kts | 3 +- 13 files changed, 221 insertions(+), 108 deletions(-) delete mode 100644 instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts create mode 100644 instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts rename instrumentation/spring/{spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0 => spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2}/DefaultPulsarMessageListenerContainerInstrumentation.java (97%) rename instrumentation/spring/{spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0 => spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2}/MessageHeaderGetter.java (98%) rename instrumentation/spring/{spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0 => spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2}/SpringPulsarInstrumentationModule.java (93%) rename instrumentation/spring/{spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0 => spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2}/SpringPulsarMessageAttributesGetter.java (99%) rename instrumentation/spring/{spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0 => spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2}/SpringPulsarSingletons.java (98%) create mode 100644 instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java create mode 100644 instrumentation/spring/spring-pulsar-1.2/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSuppressReceiveSpansTest.java create mode 100644 instrumentation/spring/spring-pulsar-1.2/testing/build.gradle.kts rename instrumentation/spring/{spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java => spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java} (53%) diff --git a/.fossa.yml b/.fossa.yml index 65248d617bcb..571a38bdddd4 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -894,7 +894,7 @@ targets: target: ':instrumentation:spring:spring-kafka-2.7:library' - type: gradle path: ./ - target: ':instrumentation:spring:spring-pulsar-1.0:javaagent' + target: ':instrumentation:spring:spring-pulsar-1.2:javaagent' - type: gradle path: ./ target: ':instrumentation:spring:spring-rabbit-1.0:javaagent' diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts b/instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts deleted file mode 100644 index aa5320ca5ad4..000000000000 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts +++ /dev/null @@ -1,31 +0,0 @@ -plugins { - id("otel.javaagent-instrumentation") -} - -muzzle { - pass { - group.set("org.springframework.pulsar") - module.set("spring-pulsar") - versions.set("[1.2.0,]") - } -} - -dependencies { - library("org.springframework.pulsar:spring-pulsar:1.2.0") - - testInstrumentation(project(":instrumentation:pulsar:pulsar-2.8:javaagent")) - testImplementation("org.testcontainers:pulsar") - - testLibrary("org.springframework.pulsar:spring-pulsar:1.2.0") - testLibrary("org.springframework.boot:spring-boot-starter-test:3.2.4") - testLibrary("org.springframework.boot:spring-boot-starter:3.2.4") -} - -val latestDepTest = findProperty("testLatestDeps") as Boolean - -// spring 6 (spring boot 3) requires java 17 -if (latestDepTest) { - otelJava { - minJavaVersionSupported.set(JavaVersion.VERSION_17) - } -} diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts b/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts new file mode 100644 index 000000000000..7df1257a343f --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts @@ -0,0 +1,52 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("org.springframework.pulsar") + module.set("spring-pulsar") + versions.set("[1.2.0,]") + } +} + +dependencies { + library("org.springframework.pulsar:spring-pulsar:1.2.0") + + testInstrumentation(project(":instrumentation:pulsar:pulsar-2.8:javaagent")) + testImplementation(project(":instrumentation:spring:spring-pulsar-1.2:testing")) + testLibrary("org.springframework.pulsar:spring-pulsar:1.2.0") + + testLibrary("org.springframework.boot:spring-boot-starter-test:3.2.4") + testLibrary("org.springframework.boot:spring-boot-starter:3.2.4") +} + +testing { + suites { + val testReceiveSpansDisabled by registering(JvmTestSuite::class) { + dependencies { + implementation(project(":instrumentation:spring:spring-pulsar-1.2:testing")) + implementation("org.springframework.pulsar:spring-pulsar:1.2.0") + implementation("org.springframework.boot:spring-boot-starter-test:3.2.4") + implementation("org.springframework.boot:spring-boot-starter:3.2.4") + } + } + } +} + +tasks { + withType().configureEach { + jvmArgs("-Dotel.instrumentation.pulsar.experimental-span-attributes=true") + jvmArgs("-Dotel.instrumentation.messaging.experimental.receive-telemetry.enabled=true") + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + } + + check { + dependsOn(testing.suites) + } +} + +// spring 6 requires java 17 +otelJava { + minJavaVersionSupported.set(JavaVersion.VERSION_17) +} diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java similarity index 97% rename from instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java rename to instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java index 44d741500073..dc0dc7e2903e 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; -import static io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0.SpringPulsarSingletons.instrumenter; +import static io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2.SpringPulsarSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/MessageHeaderGetter.java similarity index 98% rename from instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java rename to instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/MessageHeaderGetter.java index 00e8313adaf4..51b9d2282971 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/MessageHeaderGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; import io.opentelemetry.context.propagation.TextMapGetter; import javax.annotation.Nullable; diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarInstrumentationModule.java similarity index 93% rename from instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java rename to instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarInstrumentationModule.java index 3af0a2e660b9..af3883b6f8e7 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarInstrumentationModule.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; import static java.util.Collections.singletonList; @@ -15,7 +15,7 @@ @AutoService(InstrumentationModule.class) public class SpringPulsarInstrumentationModule extends InstrumentationModule { public SpringPulsarInstrumentationModule() { - super("spring-pulsar", "spring-pulsar-1.0"); + super("spring-pulsar", "spring-pulsar-1.2"); } @Override diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarMessageAttributesGetter.java similarity index 99% rename from instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java rename to instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarMessageAttributesGetter.java index 47e91df44e18..26a3850d46ad 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarMessageAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java similarity index 98% rename from instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java rename to instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java index 1d892f580a17..780ba2886169 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation; @@ -14,7 +14,7 @@ import org.apache.pulsar.client.api.Message; public final class SpringPulsarSingletons { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-pulsar-1.0"; + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-pulsar-1.2"; private static final Instrumenter, Void> INSTRUMENTER; static { diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java new file mode 100644 index 000000000000..525605e9117e --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java @@ -0,0 +1,43 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; + +import static io.opentelemetry.api.trace.SpanKind.CONSUMER; +import static io.opentelemetry.api.trace.SpanKind.INTERNAL; +import static io.opentelemetry.api.trace.SpanKind.PRODUCER; +import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanKind; + +import io.opentelemetry.instrumentation.spring.pulsar.v1_0.AbstractSpringPulsarTest; + +class SpringPulsarTest extends AbstractSpringPulsarTest { + + @Override + protected void assertSpringPulsar() { + testing.waitAndAssertSortedTraces( + orderByRootSpanKind(INTERNAL, CONSUMER), + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("parent").hasNoParent(), + span -> + span.hasName(OTEL_TOPIC + " publish") + .hasKind(PRODUCER) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly(publishAttributes()), + span -> + span.hasName(String.format("%s process", OTEL_TOPIC)) + .hasKind(CONSUMER) + .hasParent(trace.getSpan(1)) + .hasAttributesSatisfyingExactly(processAttributes()), + span -> span.hasName("consumer").hasParent(trace.getSpan(2))), + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName(String.format("%s receive", OTEL_TOPIC)) + .hasKind(CONSUMER) + .hasNoParent() + .hasAttributesSatisfyingExactly(receiveAttributes()))); + } +} diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSuppressReceiveSpansTest.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSuppressReceiveSpansTest.java new file mode 100644 index 000000000000..b783bf6df567 --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSuppressReceiveSpansTest.java @@ -0,0 +1,37 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; + +import static io.opentelemetry.api.trace.SpanKind.CONSUMER; +import static io.opentelemetry.api.trace.SpanKind.PRODUCER; + +import io.opentelemetry.instrumentation.spring.pulsar.v1_0.AbstractSpringPulsarTest; + +class SpringPulsarSuppressReceiveSpansTest extends AbstractSpringPulsarTest { + + @Override + protected void assertSpringPulsar() { + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("parent").hasNoParent(), + span -> + span.hasName(OTEL_TOPIC + " publish") + .hasKind(PRODUCER) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly(publishAttributes()), + span -> + span.hasName(String.format("%s process", OTEL_TOPIC)) + .hasKind(CONSUMER) + .hasParent(trace.getSpan(1)) + .hasTotalRecordedLinks(0) + .hasAttributesSatisfyingExactly(processAttributes()), + span -> span.hasName("consumer").hasParent(trace.getSpan(2))), + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName(String.format("%s receive", OTEL_TOPIC)).hasKind(CONSUMER))); + } +} diff --git a/instrumentation/spring/spring-pulsar-1.2/testing/build.gradle.kts b/instrumentation/spring/spring-pulsar-1.2/testing/build.gradle.kts new file mode 100644 index 000000000000..6bcc6b4d88c7 --- /dev/null +++ b/instrumentation/spring/spring-pulsar-1.2/testing/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { + implementation(project(":testing-common")) + implementation("org.testcontainers:pulsar") + + compileOnly("org.springframework.pulsar:spring-pulsar:1.2.0") + compileOnly("org.springframework.boot:spring-boot-starter-test:3.2.4") + compileOnly("org.springframework.boot:spring-boot-starter:3.2.4") +} diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java similarity index 53% rename from instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java rename to instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java index a6faf83c8d32..7b8482db5631 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java +++ b/instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java @@ -3,9 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; +package io.opentelemetry.instrumentation.spring.pulsar.v1_0; -import static io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0.SpringPulsarTest.ConsumerConfig.OTEL_TOPIC; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; @@ -17,15 +16,20 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; -import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.GlobalTraceUtil; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import java.net.InetAddress; import java.net.UnknownHostException; import java.time.Duration; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import org.apache.pulsar.client.api.PulsarClient; import org.apache.pulsar.client.api.PulsarClientException; import org.assertj.core.api.AbstractLongAssert; @@ -43,20 +47,24 @@ import org.testcontainers.containers.PulsarContainer; import org.testcontainers.utility.DockerImageName; -public class SpringPulsarTest { +@SuppressWarnings("deprecation") // using deprecated semconv +public abstract class AbstractSpringPulsarTest { @RegisterExtension - private static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + protected static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - private static final DockerImageName DEFAULT_IMAGE_NAME = + static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("apachepulsar/pulsar:4.0.2"); - private static PulsarContainer pulsarContainer; - private static ConfigurableApplicationContext applicationContext; - private static PulsarTemplate pulsarTemplate; - static String brokerHost; - static int brokerPort; + static PulsarContainer pulsarContainer; + static ConfigurableApplicationContext applicationContext; + static PulsarTemplate pulsarTemplate; static PulsarClient client; static String ip; + static CountDownLatch latch = new CountDownLatch(1); + static final String OTEL_SUBSCRIPTION = "otel-subscription"; + protected static String brokerHost; + protected static int brokerPort; + protected static final String OTEL_TOPIC = "persistent://public/default/otel-topic"; @BeforeAll @SuppressWarnings("unchecked") @@ -82,6 +90,17 @@ static void setUp() throws PulsarClientException, UnknownHostException { ip = InetAddress.getByName(pulsarContainer.getHost()).getHostAddress(); } + @Test + void testSpringPulsar() throws PulsarClientException, InterruptedException { + testing.runWithSpan( + "parent", + () -> { + pulsarTemplate.send(OTEL_TOPIC, "test"); + }); + latch.await(10, TimeUnit.SECONDS); + assertSpringPulsar(); + } + @AfterAll static void teardown() { if (pulsarContainer != null) { @@ -92,70 +111,50 @@ static void teardown() { } } - @Test - @SuppressWarnings("deprecation") // using deprecated semconv - public void shouldCreateSpansForMessageProcess() { - testing.runWithSpan( - "parent", - () -> { - pulsarTemplate.send(OTEL_TOPIC, "test"); - }); - testing.waitAndAssertTraces( - trace -> { - trace.hasSpansSatisfyingExactly( - span -> span.hasName("parent").hasKind(SpanKind.INTERNAL), - span -> - span.hasName(OTEL_TOPIC + " publish") - .hasKind(SpanKind.PRODUCER) - .hasParent(trace.getSpan(0)) - .hasAttributesSatisfyingExactly( - equalTo(MESSAGING_SYSTEM, "pulsar"), - equalTo(MESSAGING_OPERATION, "publish"), - equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), - satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), - satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotEmpty), - equalTo(SERVER_ADDRESS, brokerHost), - equalTo(SERVER_PORT, brokerPort)), - span -> - span.hasName(String.format("%s process", OTEL_TOPIC)) - .hasKind(SpanKind.CONSUMER) - .hasParent(trace.getSpan(1)) - .hasAttributesSatisfyingExactly( - equalTo(MESSAGING_SYSTEM, "pulsar"), - equalTo(MESSAGING_OPERATION, "process"), - satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), - satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotEmpty), - equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC)), - span -> { - span.hasName("consumer").hasKind(SpanKind.INTERNAL).hasParent(trace.getSpan(2)); - }); - }, - trace -> { - trace.hasSpansSatisfyingExactly( - span -> - span.hasName(String.format("%s receive", OTEL_TOPIC)) - .hasKind(SpanKind.CONSUMER) - .hasAttributesSatisfyingExactly( - equalTo(MESSAGING_SYSTEM, "pulsar"), - equalTo(MESSAGING_OPERATION, "receive"), - equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), - equalTo(SERVER_ADDRESS, brokerHost), - satisfies( - MESSAGING_BATCH_MESSAGE_COUNT, AbstractLongAssert::isNotNegative), - satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), - equalTo(SERVER_PORT, brokerPort))); - }); + protected abstract void assertSpringPulsar(); + + static final AttributeKey MESSAGE_TYPE = + AttributeKey.stringKey("messaging.pulsar.message.type"); + + protected List publishAttributes() { + return Arrays.asList( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION, "publish"), + equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotEmpty), + equalTo(SERVER_ADDRESS, brokerHost), + equalTo(SERVER_PORT, brokerPort), + equalTo(MESSAGE_TYPE, "normal")); + } + + protected List processAttributes() { + return Arrays.asList( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION, "process"), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), + satisfies(MESSAGING_MESSAGE_ID, AbstractStringAssert::isNotEmpty), + equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC)); + } + + protected List receiveAttributes() { + return Arrays.asList( + equalTo(MESSAGING_SYSTEM, "pulsar"), + equalTo(MESSAGING_OPERATION, "receive"), + equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), + satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), + satisfies(MESSAGING_BATCH_MESSAGE_COUNT, AbstractLongAssert::isNotNegative), + equalTo(SERVER_ADDRESS, brokerHost), + equalTo(SERVER_PORT, brokerPort)); } @SpringBootConfiguration @EnableAutoConfiguration static class ConsumerConfig { - static final String OTEL_TOPIC = "persistent://public/default/otel-topic"; - static final String OTEL_SUBSCRIPTION = "otel-subscription"; - @PulsarListener(subscriptionName = OTEL_SUBSCRIPTION, topics = OTEL_TOPIC) void consumer(String ignored) { GlobalTraceUtil.runWithSpan("consumer", () -> {}); + latch.countDown(); } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 5cd34288e75c..79492e0217f2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -551,7 +551,8 @@ include(":instrumentation:spring:spring-jms:spring-jms-6.0:javaagent") include(":instrumentation:spring:spring-kafka-2.7:javaagent") include(":instrumentation:spring:spring-kafka-2.7:library") include(":instrumentation:spring:spring-kafka-2.7:testing") -include(":instrumentation:spring:spring-pulsar-1.0:javaagent") +include(":instrumentation:spring:spring-pulsar-1.2:javaagent") +include(":instrumentation:spring:spring-pulsar-1.2:testing") include(":instrumentation:spring:spring-rabbit-1.0:javaagent") include(":instrumentation:spring:spring-rmi-4.0:javaagent") include(":instrumentation:spring:spring-scheduling-3.1:bootstrap") From 2db1ce8b6ebb5ac8153cf447cbc3fda5307244ab Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 10 Mar 2025 16:39:07 +0200 Subject: [PATCH 3/8] correct spans when receive telemetry is enabled --- .../v2_8/telemetry/PulsarSingletons.java | 2 ++ .../javaagent/build.gradle.kts | 20 +++++++++-- ...ssageListenerContainerInstrumentation.java | 4 +-- .../pulsar/v1_2/SpringPulsarSingletons.java | 22 ++++++++++--- .../spring/pulsar/v1_2/SpringPulsarTest.java | 33 ++++++++++++------- .../pulsar/v1_0/AbstractSpringPulsarTest.java | 14 +++----- 6 files changed, 65 insertions(+), 30 deletions(-) diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java index 14ad9a137aa0..c26022efea02 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/telemetry/PulsarSingletons.java @@ -263,6 +263,8 @@ public static CompletableFuture> wrapBatch( (messages, throwable) -> { Context context = startAndEndConsumerReceive(parent, messages, timer, consumer, throwable); + // injected context is used in the spring-pulsar instrumentation + messages.forEach(message -> VirtualFieldStore.inject(message, context)); runWithContext( context, () -> { diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts b/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts index 7df1257a343f..dc51d9c9159f 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts @@ -12,11 +12,13 @@ muzzle { dependencies { library("org.springframework.pulsar:spring-pulsar:1.2.0") + implementation(project(":instrumentation:pulsar:pulsar-2.8:javaagent")) testInstrumentation(project(":instrumentation:pulsar:pulsar-2.8:javaagent")) + testImplementation(project(":instrumentation:spring:spring-pulsar-1.2:testing")) - testLibrary("org.springframework.pulsar:spring-pulsar:1.2.0") + testLibrary("org.springframework.pulsar:spring-pulsar:1.2.0") testLibrary("org.springframework.boot:spring-boot-starter-test:3.2.4") testLibrary("org.springframework.boot:spring-boot-starter:3.2.4") } @@ -30,15 +32,27 @@ testing { implementation("org.springframework.boot:spring-boot-starter-test:3.2.4") implementation("org.springframework.boot:spring-boot-starter:3.2.4") } + + targets { + all { + testTask.configure { + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + + jvmArgs("-Dotel.instrumentation.pulsar.experimental-span-attributes=true") + jvmArgs("-Dotel.instrumentation.messaging.experimental.receive-telemetry.enabled=false") + } + } + } } } } tasks { - withType().configureEach { + test { + usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + jvmArgs("-Dotel.instrumentation.pulsar.experimental-span-attributes=true") jvmArgs("-Dotel.instrumentation.messaging.experimental.receive-telemetry.enabled=true") - usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) } check { diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java index dc0dc7e2903e..7b9027a1def2 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java @@ -12,9 +12,9 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.pulsar.v2_8.VirtualFieldStore; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -43,7 +43,7 @@ public static void onEnter( @Advice.Argument(0) Message message, @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { - Context parentContext = Java8BytecodeBridge.currentContext(); + Context parentContext = VirtualFieldStore.extract(message); if (instrumenter().shouldStart(parentContext, message)) { context = instrumenter().start(parentContext, message); scope = context.makeCurrent(); diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java index 780ba2886169..aae4696abd4e 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java @@ -6,10 +6,14 @@ package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessageOperation; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.messaging.MessagingSpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder; +import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; +import io.opentelemetry.instrumentation.api.internal.PropagatorBasedSpanLinksExtractor; import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; import org.apache.pulsar.client.api.Message; @@ -18,19 +22,29 @@ public final class SpringPulsarSingletons { private static final Instrumenter, Void> INSTRUMENTER; static { + OpenTelemetry openTelemetry = GlobalOpenTelemetry.get(); SpringPulsarMessageAttributesGetter getter = SpringPulsarMessageAttributesGetter.INSTANCE; MessageOperation operation = MessageOperation.PROCESS; + boolean messagingReceiveInstrumentationEnabled = + ExperimentalConfig.get().messagingReceiveInstrumentationEnabled(); - INSTRUMENTER = + InstrumenterBuilder, Void> builder = Instrumenter., Void>builder( - GlobalOpenTelemetry.get(), + openTelemetry, INSTRUMENTATION_NAME, MessagingSpanNameExtractor.create(getter, operation)) .addAttributesExtractor( MessagingAttributesExtractor.builder(getter, operation) .setCapturedHeaders(ExperimentalConfig.get().getMessagingHeaders()) - .build()) - .buildConsumerInstrumenter(MessageHeaderGetter.INSTANCE); + .build()); + if (messagingReceiveInstrumentationEnabled) { + builder.addSpanLinksExtractor( + new PropagatorBasedSpanLinksExtractor<>( + openTelemetry.getPropagators().getTextMapPropagator(), MessageHeaderGetter.INSTANCE)); + INSTRUMENTER = builder.buildInstrumenter(SpanKindExtractor.alwaysConsumer()); + } else { + INSTRUMENTER = builder.buildConsumerInstrumenter(MessageHeaderGetter.INSTANCE); + } } public static Instrumenter, Void> instrumenter() { diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java index 525605e9117e..2523f68aacce 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java @@ -11,33 +11,42 @@ import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.orderByRootSpanKind; import io.opentelemetry.instrumentation.spring.pulsar.v1_0.AbstractSpringPulsarTest; +import io.opentelemetry.sdk.trace.data.LinkData; +import io.opentelemetry.sdk.trace.data.SpanData; +import java.util.concurrent.atomic.AtomicReference; class SpringPulsarTest extends AbstractSpringPulsarTest { @Override protected void assertSpringPulsar() { + AtomicReference producer = new AtomicReference<>(); + testing.waitAndAssertSortedTraces( orderByRootSpanKind(INTERNAL, CONSUMER), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasNoParent(), - span -> - span.hasName(OTEL_TOPIC + " publish") - .hasKind(PRODUCER) - .hasParent(trace.getSpan(0)) - .hasAttributesSatisfyingExactly(publishAttributes()), - span -> - span.hasName(String.format("%s process", OTEL_TOPIC)) - .hasKind(CONSUMER) - .hasParent(trace.getSpan(1)) - .hasAttributesSatisfyingExactly(processAttributes()), - span -> span.hasName("consumer").hasParent(trace.getSpan(2))), + span -> { + span.hasName(OTEL_TOPIC + " publish") + .hasKind(PRODUCER) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly(publishAttributes()); + + producer.set(trace.getSpan(1)); + }), trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName(String.format("%s receive", OTEL_TOPIC)) .hasKind(CONSUMER) .hasNoParent() - .hasAttributesSatisfyingExactly(receiveAttributes()))); + .hasAttributesSatisfyingExactly(receiveAttributes()), + span -> + span.hasName(String.format("%s process", OTEL_TOPIC)) + .hasKind(CONSUMER) + .hasParent(trace.getSpan(0)) + .hasLinks(LinkData.create(producer.get().getSpanContext())) + .hasAttributesSatisfyingExactly(processAttributes()), + span -> span.hasName("consumer").hasParent(trace.getSpan(1)))); } } diff --git a/instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java index 7b8482db5631..7563f71f9d32 100644 --- a/instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java +++ b/instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java @@ -21,8 +21,6 @@ import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.time.Duration; import java.util.Arrays; import java.util.HashMap; @@ -59,7 +57,6 @@ public abstract class AbstractSpringPulsarTest { static ConfigurableApplicationContext applicationContext; static PulsarTemplate pulsarTemplate; static PulsarClient client; - static String ip; static CountDownLatch latch = new CountDownLatch(1); static final String OTEL_SUBSCRIPTION = "otel-subscription"; protected static String brokerHost; @@ -68,7 +65,7 @@ public abstract class AbstractSpringPulsarTest { @BeforeAll @SuppressWarnings("unchecked") - static void setUp() throws PulsarClientException, UnknownHostException { + static void setUp() throws PulsarClientException { pulsarContainer = new PulsarContainer(DEFAULT_IMAGE_NAME) .withEnv("PULSAR_MEM", "-Xmx128m") @@ -87,11 +84,10 @@ static void setUp() throws PulsarClientException, UnknownHostException { pulsarTemplate = applicationContext.getBean(PulsarTemplate.class); client = PulsarClient.builder().serviceUrl(pulsarContainer.getPulsarBrokerUrl()).build(); - ip = InetAddress.getByName(pulsarContainer.getHost()).getHostAddress(); } @Test - void testSpringPulsar() throws PulsarClientException, InterruptedException { + void testSpringPulsar() throws InterruptedException { testing.runWithSpan( "parent", () -> { @@ -103,12 +99,12 @@ void testSpringPulsar() throws PulsarClientException, InterruptedException { @AfterAll static void teardown() { - if (pulsarContainer != null) { - pulsarContainer.stop(); - } if (applicationContext != null) { applicationContext.close(); } + if (pulsarContainer != null) { + pulsarContainer.stop(); + } } protected abstract void assertSpringPulsar(); From c6991a3321db9aaf8d1871de48baa6e6bc9e1445 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 10 Mar 2025 16:41:26 +0200 Subject: [PATCH 4/8] add to supported libraries --- docs/supported-libraries.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/supported-libraries.md b/docs/supported-libraries.md index c120ff44cde2..3909e2054123 100644 --- a/docs/supported-libraries.md +++ b/docs/supported-libraries.md @@ -138,6 +138,7 @@ These are the supported libraries and frameworks: | [Spring Integration](https://spring.io/projects/spring-integration) | 4.1+ (not including 6.0+ yet) | [opentelemetry-spring-integration-4.1](../instrumentation/spring/spring-integration-4.1/library) | [Messaging Spans] | | [Spring JMS](https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#jms) | 2.0+ | N/A | [Messaging Spans] | | [Spring Kafka](https://spring.io/projects/spring-kafka) | 2.7+ | [opentelemetry-spring-kafka-2.7](../instrumentation/spring/spring-kafka-2.7/library) | [Messaging Spans] | +| [Spring Pulsar](https://spring.io/projects/spring-pulsar) | 1.2+ | | [Messaging Spans] | | [Spring RabbitMQ](https://spring.io/projects/spring-amqp) | 1.0+ | N/A | [Messaging Spans] | | [Spring RestTemplate](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/package-summary.html) | 3.1+ | [opentelemetry-spring-web-3.1](../instrumentation/spring/spring-web/spring-web-3.1/library) | [HTTP Client Spans], [HTTP Client Metrics] | | [Spring RMI](https://docs.spring.io/spring-framework/docs/4.0.x/javadoc-api/org/springframework/remoting/rmi/package-summary.html) | 4.0+ | N/A | [RPC Client Spans], [RPC Server Spans] | From 8b73c7294e37d584366e980c1232eff8aee497dd Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 10 Mar 2025 16:45:09 +0200 Subject: [PATCH 5/8] latest dep test for the testReceiveSpansDisabled suite --- .../javaagent/build.gradle.kts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts b/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts index dc51d9c9159f..3d152718f226 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts @@ -6,7 +6,7 @@ muzzle { pass { group.set("org.springframework.pulsar") module.set("spring-pulsar") - versions.set("[1.2.0,]") + versions.set("[1.2.0,)") } } @@ -23,14 +23,23 @@ dependencies { testLibrary("org.springframework.boot:spring-boot-starter:3.2.4") } +val latestDepTest = findProperty("testLatestDeps") as Boolean + testing { suites { val testReceiveSpansDisabled by registering(JvmTestSuite::class) { dependencies { implementation(project(":instrumentation:spring:spring-pulsar-1.2:testing")) - implementation("org.springframework.pulsar:spring-pulsar:1.2.0") - implementation("org.springframework.boot:spring-boot-starter-test:3.2.4") - implementation("org.springframework.boot:spring-boot-starter:3.2.4") + + if (latestDepTest) { + implementation("org.springframework.pulsar:spring-pulsar:latest.release") + implementation("org.springframework.boot:spring-boot-starter-test:latest.release") + implementation("org.springframework.boot:spring-boot-starter:latest.release") + } else { + implementation("org.springframework.pulsar:spring-pulsar:1.2.0") + implementation("org.springframework.boot:spring-boot-starter-test:3.2.4") + implementation("org.springframework.boot:spring-boot-starter:3.2.4") + } } targets { From 8d96e75e4b91abed836c23fd8595d07101b1329a Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 10 Mar 2025 20:31:20 +0200 Subject: [PATCH 6/8] address review comments --- docs/supported-libraries.md | 2 +- .../javaagent/build.gradle.kts | 13 +++++++------ ...lsarMessageListenerContainerInstrumentation.java | 6 +++--- .../spring/pulsar/v1_0}/MessageHeaderGetter.java | 2 +- .../v1_0}/SpringPulsarInstrumentationModule.java | 13 +++++++++++-- .../v1_0}/SpringPulsarMessageAttributesGetter.java | 2 +- .../spring/pulsar/v1_0}/SpringPulsarSingletons.java | 4 ++-- .../spring/pulsar/v1_2/SpringPulsarTest.java | 0 .../v1_0}/SpringPulsarSuppressReceiveSpansTest.java | 2 +- .../testing/build.gradle.kts | 2 +- .../pulsar/v1_0/AbstractSpringPulsarTest.java | 10 +++++----- settings.gradle.kts | 4 ++-- 12 files changed, 35 insertions(+), 25 deletions(-) rename instrumentation/spring/{spring-pulsar-1.2 => spring-pulsar-1.0}/javaagent/build.gradle.kts (90%) rename instrumentation/spring/{spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2 => spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0}/DefaultPulsarMessageListenerContainerInstrumentation.java (95%) rename instrumentation/spring/{spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2 => spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0}/MessageHeaderGetter.java (98%) rename instrumentation/spring/{spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2 => spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0}/SpringPulsarInstrumentationModule.java (64%) rename instrumentation/spring/{spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2 => spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0}/SpringPulsarMessageAttributesGetter.java (99%) rename instrumentation/spring/{spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2 => spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0}/SpringPulsarSingletons.java (98%) rename instrumentation/spring/{spring-pulsar-1.2 => spring-pulsar-1.0}/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java (100%) rename instrumentation/spring/{spring-pulsar-1.2/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2 => spring-pulsar-1.0/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0}/SpringPulsarSuppressReceiveSpansTest.java (99%) rename instrumentation/spring/{spring-pulsar-1.2 => spring-pulsar-1.0}/testing/build.gradle.kts (82%) rename instrumentation/spring/{spring-pulsar-1.2 => spring-pulsar-1.0}/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java (97%) diff --git a/docs/supported-libraries.md b/docs/supported-libraries.md index 3909e2054123..578837ed5077 100644 --- a/docs/supported-libraries.md +++ b/docs/supported-libraries.md @@ -138,7 +138,7 @@ These are the supported libraries and frameworks: | [Spring Integration](https://spring.io/projects/spring-integration) | 4.1+ (not including 6.0+ yet) | [opentelemetry-spring-integration-4.1](../instrumentation/spring/spring-integration-4.1/library) | [Messaging Spans] | | [Spring JMS](https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#jms) | 2.0+ | N/A | [Messaging Spans] | | [Spring Kafka](https://spring.io/projects/spring-kafka) | 2.7+ | [opentelemetry-spring-kafka-2.7](../instrumentation/spring/spring-kafka-2.7/library) | [Messaging Spans] | -| [Spring Pulsar](https://spring.io/projects/spring-pulsar) | 1.2+ | | [Messaging Spans] | +| [Spring Pulsar](https://spring.io/projects/spring-pulsar) | 1.0+ | | [Messaging Spans] | | [Spring RabbitMQ](https://spring.io/projects/spring-amqp) | 1.0+ | N/A | [Messaging Spans] | | [Spring RestTemplate](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/package-summary.html) | 3.1+ | [opentelemetry-spring-web-3.1](../instrumentation/spring/spring-web/spring-web-3.1/library) | [HTTP Client Spans], [HTTP Client Metrics] | | [Spring RMI](https://docs.spring.io/spring-framework/docs/4.0.x/javadoc-api/org/springframework/remoting/rmi/package-summary.html) | 4.0+ | N/A | [RPC Client Spans], [RPC Server Spans] | diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts b/instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts similarity index 90% rename from instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts rename to instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts index 3d152718f226..9364d6f73d9e 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/build.gradle.kts +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/build.gradle.kts @@ -6,19 +6,20 @@ muzzle { pass { group.set("org.springframework.pulsar") module.set("spring-pulsar") - versions.set("[1.2.0,)") + versions.set("[1.0.0,)") + assertInverse.set(true) + excludeInstrumentationName("pulsar-2.8") } } dependencies { - library("org.springframework.pulsar:spring-pulsar:1.2.0") + library("org.springframework.pulsar:spring-pulsar:1.0.0") implementation(project(":instrumentation:pulsar:pulsar-2.8:javaagent")) testInstrumentation(project(":instrumentation:pulsar:pulsar-2.8:javaagent")) - testImplementation(project(":instrumentation:spring:spring-pulsar-1.2:testing")) + testImplementation(project(":instrumentation:spring:spring-pulsar-1.0:testing")) - testLibrary("org.springframework.pulsar:spring-pulsar:1.2.0") testLibrary("org.springframework.boot:spring-boot-starter-test:3.2.4") testLibrary("org.springframework.boot:spring-boot-starter:3.2.4") } @@ -29,14 +30,14 @@ testing { suites { val testReceiveSpansDisabled by registering(JvmTestSuite::class) { dependencies { - implementation(project(":instrumentation:spring:spring-pulsar-1.2:testing")) + implementation(project(":instrumentation:spring:spring-pulsar-1.0:testing")) if (latestDepTest) { implementation("org.springframework.pulsar:spring-pulsar:latest.release") implementation("org.springframework.boot:spring-boot-starter-test:latest.release") implementation("org.springframework.boot:spring-boot-starter:latest.release") } else { - implementation("org.springframework.pulsar:spring-pulsar:1.2.0") + implementation("org.springframework.pulsar:spring-pulsar:1.0.0") implementation("org.springframework.boot:spring-boot-starter-test:3.2.4") implementation("org.springframework.boot:spring-boot-starter:3.2.4") } diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java similarity index 95% rename from instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java rename to instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java index 7b9027a1def2..5952cefaf5f0 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/DefaultPulsarMessageListenerContainerInstrumentation.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/DefaultPulsarMessageListenerContainerInstrumentation.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; -import static io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2.SpringPulsarSingletons.instrumenter; +import static io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0.SpringPulsarSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -31,7 +31,7 @@ public ElementMatcher typeMatcher() { public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( named("dispatchMessageToListener") - .and(takesArguments(3)) + .and(takesArguments(3).or(takesArguments(2))) .and(takesArgument(0, named("org.apache.pulsar.client.api.Message"))), getClass().getName() + "$DispatchMessageToListenerAdvice"); } diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/MessageHeaderGetter.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java similarity index 98% rename from instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/MessageHeaderGetter.java rename to instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java index 51b9d2282971..00e8313adaf4 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/MessageHeaderGetter.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/MessageHeaderGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; import io.opentelemetry.context.propagation.TextMapGetter; import javax.annotation.Nullable; diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarInstrumentationModule.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java similarity index 64% rename from instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarInstrumentationModule.java rename to instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java index af3883b6f8e7..c9681bf7765e 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarInstrumentationModule.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarInstrumentationModule.java @@ -3,19 +3,28 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_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 SpringPulsarInstrumentationModule extends InstrumentationModule { public SpringPulsarInstrumentationModule() { - super("spring-pulsar", "spring-pulsar-1.2"); + super("spring-pulsar", "spring-pulsar-1.0"); + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // added in 1.0.0 + return hasClassesNamed( + "org.springframework.pulsar.annotation.PulsarListenerConsumerBuilderCustomizer"); } @Override diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarMessageAttributesGetter.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java similarity index 99% rename from instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarMessageAttributesGetter.java rename to instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java index 26a3850d46ad..47e91df44e18 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarMessageAttributesGetter.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarMessageAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java similarity index 98% rename from instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java rename to instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java index aae4696abd4e..fc9c454dcda2 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSingletons.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSingletons.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; @@ -18,7 +18,7 @@ import org.apache.pulsar.client.api.Message; public final class SpringPulsarSingletons { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-pulsar-1.2"; + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-pulsar-1.0"; private static final Instrumenter, Void> INSTRUMENTER; static { diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java similarity index 100% rename from instrumentation/spring/spring-pulsar-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java rename to instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java diff --git a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSuppressReceiveSpansTest.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSuppressReceiveSpansTest.java similarity index 99% rename from instrumentation/spring/spring-pulsar-1.2/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSuppressReceiveSpansTest.java rename to instrumentation/spring/spring-pulsar-1.0/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSuppressReceiveSpansTest.java index b783bf6df567..f4abc0b566c6 100644 --- a/instrumentation/spring/spring-pulsar-1.2/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarSuppressReceiveSpansTest.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/testReceiveSpansDisabled/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarSuppressReceiveSpansTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; import static io.opentelemetry.api.trace.SpanKind.CONSUMER; import static io.opentelemetry.api.trace.SpanKind.PRODUCER; diff --git a/instrumentation/spring/spring-pulsar-1.2/testing/build.gradle.kts b/instrumentation/spring/spring-pulsar-1.0/testing/build.gradle.kts similarity index 82% rename from instrumentation/spring/spring-pulsar-1.2/testing/build.gradle.kts rename to instrumentation/spring/spring-pulsar-1.0/testing/build.gradle.kts index 6bcc6b4d88c7..53bba3f14dd0 100644 --- a/instrumentation/spring/spring-pulsar-1.2/testing/build.gradle.kts +++ b/instrumentation/spring/spring-pulsar-1.0/testing/build.gradle.kts @@ -6,7 +6,7 @@ dependencies { implementation(project(":testing-common")) implementation("org.testcontainers:pulsar") - compileOnly("org.springframework.pulsar:spring-pulsar:1.2.0") + compileOnly("org.springframework.pulsar:spring-pulsar:1.0.0") compileOnly("org.springframework.boot:spring-boot-starter-test:3.2.4") compileOnly("org.springframework.boot:spring-boot-starter:3.2.4") } diff --git a/instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java similarity index 97% rename from instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java rename to instrumentation/spring/spring-pulsar-1.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java index 7563f71f9d32..336a722fa030 100644 --- a/instrumentation/spring/spring-pulsar-1.2/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java +++ b/instrumentation/spring/spring-pulsar-1.0/testing/src/main/java/io/opentelemetry/instrumentation/spring/pulsar/v1_0/AbstractSpringPulsarTest.java @@ -15,6 +15,7 @@ import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; +import static java.util.Arrays.asList; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.GlobalTraceUtil; @@ -22,7 +23,6 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import java.time.Duration; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -87,7 +87,7 @@ static void setUp() throws PulsarClientException { } @Test - void testSpringPulsar() throws InterruptedException { + void testSpringPulsar() throws PulsarClientException, InterruptedException { testing.runWithSpan( "parent", () -> { @@ -113,7 +113,7 @@ static void teardown() { AttributeKey.stringKey("messaging.pulsar.message.type"); protected List publishAttributes() { - return Arrays.asList( + return asList( equalTo(MESSAGING_SYSTEM, "pulsar"), equalTo(MESSAGING_OPERATION, "publish"), equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), @@ -125,7 +125,7 @@ protected List publishAttributes() { } protected List processAttributes() { - return Arrays.asList( + return asList( equalTo(MESSAGING_SYSTEM, "pulsar"), equalTo(MESSAGING_OPERATION, "process"), satisfies(MESSAGING_MESSAGE_BODY_SIZE, AbstractLongAssert::isNotNegative), @@ -134,7 +134,7 @@ protected List processAttributes() { } protected List receiveAttributes() { - return Arrays.asList( + return asList( equalTo(MESSAGING_SYSTEM, "pulsar"), equalTo(MESSAGING_OPERATION, "receive"), equalTo(MESSAGING_DESTINATION_NAME, OTEL_TOPIC), diff --git a/settings.gradle.kts b/settings.gradle.kts index 1c9fa5cbf9bb..69161e34a7eb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -552,8 +552,8 @@ include(":instrumentation:spring:spring-jms:spring-jms-6.0:javaagent") include(":instrumentation:spring:spring-kafka-2.7:javaagent") include(":instrumentation:spring:spring-kafka-2.7:library") include(":instrumentation:spring:spring-kafka-2.7:testing") -include(":instrumentation:spring:spring-pulsar-1.2:javaagent") -include(":instrumentation:spring:spring-pulsar-1.2:testing") +include(":instrumentation:spring:spring-pulsar-1.0:javaagent") +include(":instrumentation:spring:spring-pulsar-1.0:testing") include(":instrumentation:spring:spring-rabbit-1.0:javaagent") include(":instrumentation:spring:spring-rmi-4.0:javaagent") include(":instrumentation:spring:spring-scheduling-3.1:bootstrap") From bb4f3ed680a479bc6018d5b85c7263d0698509a2 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 10 Mar 2025 20:37:29 +0200 Subject: [PATCH 7/8] update fossa configuration --- .fossa.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.fossa.yml b/.fossa.yml index cf3da6e7a1eb..281b3c6e2976 100644 --- a/.fossa.yml +++ b/.fossa.yml @@ -897,7 +897,7 @@ targets: target: ':instrumentation:spring:spring-kafka-2.7:library' - type: gradle path: ./ - target: ':instrumentation:spring:spring-pulsar-1.2:javaagent' + target: ':instrumentation:spring:spring-pulsar-1.0:javaagent' - type: gradle path: ./ target: ':instrumentation:spring:spring-rabbit-1.0:javaagent' From 6fcb20005ed1cf626df3ac51496b59a60738c723 Mon Sep 17 00:00:00 2001 From: Zixin Zhou Date: Tue, 11 Mar 2025 12:01:45 +0800 Subject: [PATCH 8/8] update --- .../spring/pulsar/{v1_2 => v1_0}/SpringPulsarTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/{v1_2 => v1_0}/SpringPulsarTest.java (99%) diff --git a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java similarity index 99% rename from instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java rename to instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java index 2523f68aacce..2fba60091be1 100644 --- a/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_2/SpringPulsarTest.java +++ b/instrumentation/spring/spring-pulsar-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/pulsar/v1_0/SpringPulsarTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_2; +package io.opentelemetry.javaagent.instrumentation.spring.pulsar.v1_0; import static io.opentelemetry.api.trace.SpanKind.CONSUMER; import static io.opentelemetry.api.trace.SpanKind.INTERNAL;