From 693b89bcaf196de6d061fb640b49260085a7bb9e Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 24 Apr 2022 06:51:04 +0800 Subject: [PATCH 01/48] add apache-pulsar support --- build.gradle.kts | 40 ++++ .../apache-pulsar/javaagent/build.gradle.kts | 7 + .../pulsar/ConsumerImplInstrumentation.java | 135 ++++++++++++ .../pulsar/MessageInstrumentation.java | 52 +++++ .../MessageListenerInstrumentation.java | 107 ++++++++++ .../pulsar/ProducerImplInstrumentation.java | 201 ++++++++++++++++++ .../pulsar/PulsarInstrumentationModule.java | 29 +++ .../pulsar/PulsarTelemetry.java | 37 ++++ .../pulsar/info/ClientEnhanceInfo.java | 40 ++++ .../pulsar/info/MessageEnhanceInfo.java | 51 +++++ .../pulsar/textmap/MessageTextMapGetter.java | 25 +++ .../pulsar/textmap/MessageTextMapSetter.java | 21 ++ .../apache-pulsar/testing/build.gradle.kts | 7 + settings.gradle.kts | 4 + 14 files changed, 756 insertions(+) create mode 100644 instrumentation/apache-pulsar/javaagent/build.gradle.kts create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapGetter.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapSetter.java create mode 100644 instrumentation/apache-pulsar/testing/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts index c11fed23b521..cdb7b064d9bf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,4 +31,44 @@ nexusPublishing { } } +//仓库配置 +repositories { + //mavenLocal { setUrl("file://${project.rootDir}/lib") } + //首先去本地仓库找 + mavenLocal() + //然后去阿里仓库找 + // build.gradle: + // maven { url "https://maven.aliyun.com/nexus/content/groups/public/" } + + // build.gradle.kts: + maven { url = uri("https://repo.spring.io/release") } + maven { url = uri("https://repo.spring.io/milestone") } + maven { url = uri("https://plugins.gradle.org/m2/") } + maven { + isAllowInsecureProtocol = true + setUrl("https://maven.aliyun.com/nexus/content/groups/public/") + } + maven { + isAllowInsecureProtocol = true + url = uri("https://maven.aliyun.com/repository/public") } + maven { + isAllowInsecureProtocol = true + url = uri("https://maven.aliyun.com/repository/google") } + maven { + isAllowInsecureProtocol = true + url = uri("https://maven.aliyun.com/repository/gradle-plugin") } + maven { + isAllowInsecureProtocol = true + url = uri("https://maven.aliyun.com/repository/spring-plugin") } + maven { + isAllowInsecureProtocol = true + url = uri("https://maven.aliyun.com/repository/apache-snapshots") } + maven { + isAllowInsecureProtocol = true + url = uri("https://oss.jfrog.org/artifactory/oss-snapshot-local/") } + google() + //最后从maven中央仓库找 + mavenCentral() +} + description = "OpenTelemetry instrumentations for Java" diff --git a/instrumentation/apache-pulsar/javaagent/build.gradle.kts b/instrumentation/apache-pulsar/javaagent/build.gradle.kts new file mode 100644 index 000000000000..a2a38d2eb768 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +dependencies { + library("org.apache.pulsar:pulsar-client:2.8.0") +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java new file mode 100644 index 000000000000..dd7c4b07a2e7 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -0,0 +1,135 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar; + +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.CONSUMER_NAME; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SERVICE_URL; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SUBSCRIPTION; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TOPIC; +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isProtected; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; +import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; +import io.opentelemetry.javaagent.instrumentation.pulsar.textmap.MessageTextMapGetter; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.pulsar.client.api.Message; +import org.apache.pulsar.client.api.PulsarClient; +import org.apache.pulsar.client.impl.ConsumerImpl; +import org.apache.pulsar.client.impl.MessageImpl; +import org.apache.pulsar.client.impl.PulsarClientImpl; + +public class ConsumerImplInstrumentation implements TypeInstrumentation { + private static final Tracer TRACER = PulsarTelemetry.tracer(); + private static final TextMapPropagator PROPAGATOR = PulsarTelemetry.propagator(); + + @Override + public ElementMatcher typeMatcher() { + return named("org.apache.pulsar.client.impl.ConsumerImpl"); + } + + @Override + public void transform(TypeTransformer transformer) { + String klassName = ConsumerImplInstrumentation.class.getName(); + + transformer.applyAdviceToMethod(isConstructor(), klassName + "$ConsumerImplConstructorAdviser"); + + transformer.applyAdviceToMethod( + isMethod() + .and(isProtected()) + .and(named("messageProcessed")) + .and(takesArgument(0, named("org.apache.pulsar.client.api.Message"))), + klassName + "$ConsumerImplMethodAdviser"); + } + + @SuppressWarnings("unused") + public static class ConsumerImplConstructorAdviser { + + @Advice.OnMethodEnter + public static void before( + @Advice.This ConsumerImpl consumer, + @Advice.Argument(value = 0) PulsarClient client, + @Advice.Argument(value = 1) String topic) { + + PulsarClientImpl pulsarClient = (PulsarClientImpl) client; + String url = pulsarClient.getLookup().getServiceUrl(); + + ClientEnhanceInfo info = new ClientEnhanceInfo(topic, url); + ClientEnhanceInfo.virtualField(consumer, info); + } + } + + @SuppressWarnings("unused") + public static class ConsumerImplMethodAdviser { + + @Advice.OnMethodEnter + public static Scope before( + @Advice.This ConsumerImpl consumer, + @Advice.Argument(value = 0) Message message) { + ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(consumer); + if (null == info) { + return Scope.noop(); + } + + MessageImpl messageImpl = (MessageImpl) message; + Context context = + PROPAGATOR.extract(Context.current(), messageImpl, MessageTextMapGetter.INSTANCE); + + return TRACER + .spanBuilder("Pulsar://ConsumerImpl/messageProcessed") + .setParent(context) + .setSpanKind(SpanKind.CONSUMER) + .setAttribute(TOPIC, info.topic) + .setAttribute(SERVICE_URL, info.brokerUrl) + .setAttribute(SUBSCRIPTION, consumer.getSubscription()) + .setAttribute(CONSUMER_NAME, consumer.getConsumerName()) + .startSpan() + .makeCurrent(); + } + + @Advice.OnMethodExit + public static void after( + @Advice.This ConsumerImpl consumer, + @Advice.Argument(value = 0) Message message, + @Advice.Thrown Throwable t, + @Advice.Enter Scope scope) { + ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(consumer); + if (null == info || scope == null) { + if (null != scope) { + scope.close(); + } + return; + } + + MessageEnhanceInfo messageInfo = MessageEnhanceInfo.virtualField(message); + if (null != messageInfo) { + messageInfo.setFields( + Context.current(), consumer.getTopic(), message.getMessageId()); + } + + Span span = Span.current(); + if (t != null) { + span.recordException(t); + } + + span.end(); + scope.close(); + } + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java new file mode 100644 index 000000000000..2fc22c99fc98 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java @@ -0,0 +1,52 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar; + +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.named; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.pulsar.client.api.Message; +import org.apache.pulsar.client.impl.MessageImpl; +import org.apache.pulsar.client.impl.TopicMessageImpl; + +public class MessageInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("org.apache.pulsar.client.impl.MessageImpl") + .or(named("org.apache.pulsar.client.impl.TopicMessageImpl")); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isConstructor(), MessageInstrumentation.class.getName() + "$MessageConstructorAdviser"); + } + + @SuppressWarnings("unused") + public static class MessageConstructorAdviser { + + @Advice.OnMethodEnter + public static void before( + @Advice.This Message message, @Advice.AllArguments Object[] allArguments) { + + if (message instanceof MessageImpl) { + MessageEnhanceInfo.virtualField(message, new MessageEnhanceInfo()); + } else { + Object argument2 = allArguments[2]; + if (message instanceof TopicMessageImpl && argument2 instanceof MessageImpl) { + MessageImpl impl = (MessageImpl) argument2; + MessageEnhanceInfo.virtualField(message, MessageEnhanceInfo.virtualField(impl)); + } + } + } + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java new file mode 100644 index 000000000000..a7c722c06a8f --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java @@ -0,0 +1,107 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar; + +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.CONSUMER_NAME; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.MESSAGE_ID; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SUBSCRIPTION; +import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.MessagingDestinationKindValues.TOPIC; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.named; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.pulsar.client.api.Consumer; +import org.apache.pulsar.client.api.Message; +import org.apache.pulsar.client.api.MessageListener; +import org.apache.pulsar.client.impl.conf.ConsumerConfigurationData; + +public class MessageListenerInstrumentation implements TypeInstrumentation { + private static final Tracer TRACER = PulsarTelemetry.tracer(); + + @Override + public ElementMatcher typeMatcher() { + // return hasSuperType(named("org.apache.pulsar.client.api.MessageListener")); + // can't enhance MessageListener here like above due to jvm can't enhance lambda. + return named("org.apache.pulsar.client.impl.conf.ConsumerConfigurationData"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isMethod().and(isPublic()).and(named("getMessageListener")), + MessageListenerInstrumentation.class.getName() + "$ConsumerConfigurationDataMethodAdviser"); + } + + @SuppressWarnings("unused") + public static class ConsumerConfigurationDataMethodAdviser { + + @Advice.OnMethodExit + @Advice.AssignReturned.ToReturned + public static MessageListener after( + @Advice.This ConsumerConfigurationData data, + @Advice.Return MessageListener listener) { + if (null == listener) { + return null; + } + + return new MessageListenerWrapper<>(listener); + } + } + + public static class MessageListenerWrapper implements MessageListener { + private static final long serialVersionUID = 1L; + + private final MessageListener delegator; + + public MessageListenerWrapper(MessageListener messageListener) { + this.delegator = messageListener; + } + + @Override + public void received(Consumer consumer, Message msg) { + MessageEnhanceInfo info = MessageEnhanceInfo.virtualField(msg); + Context parent = info == null ? Context.current() : info.getContext(); + String topic = null == info ? consumer.getTopic() : info.getTopic(); + String mid = null == info ? "unknown" : info.getMessageId(); + + Span span = + TRACER + .spanBuilder("Pulsar://MessageListener/received") + .setParent(parent) + .setSpanKind(SpanKind.CONSUMER) + .setAttribute(TOPIC, topic) + .setAttribute(MESSAGE_ID, mid) + .setAttribute(SUBSCRIPTION, consumer.getSubscription()) + .setAttribute(CONSUMER_NAME, consumer.getConsumerName()) + .startSpan(); + + try (Scope scope = span.makeCurrent()) { + this.delegator.received(consumer, msg); + } catch (Throwable t) { + span.recordException(t); + throw t; + } finally { + span.end(); + } + } + + @Override + public void reachedEndOfTopic(Consumer consumer) { + this.delegator.reachedEndOfTopic(consumer); + } + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java new file mode 100644 index 000000000000..a92671d3ac62 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -0,0 +1,201 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar; + +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.MESSAGE_ID; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.PRODUCER_NAME; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SERVICE_URL; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TOPIC; +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanBuilder; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; +import io.opentelemetry.javaagent.instrumentation.pulsar.textmap.MessageTextMapSetter; +import java.util.concurrent.CompletableFuture; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.implementation.bind.annotation.Argument; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.pulsar.client.api.MessageId; +import org.apache.pulsar.client.api.PulsarClient; +import org.apache.pulsar.client.impl.MessageIdImpl; +import org.apache.pulsar.client.impl.MessageImpl; +import org.apache.pulsar.client.impl.ProducerImpl; +import org.apache.pulsar.client.impl.PulsarClientImpl; +import org.apache.pulsar.client.impl.SendCallback; + +public class ProducerImplInstrumentation implements TypeInstrumentation { + private static final Tracer TRACER = PulsarTelemetry.tracer(); + private static final TextMapPropagator PROPAGATOR = PulsarTelemetry.propagator(); + + @Override + public ElementMatcher typeMatcher() { + return named("org.apache.pulsar.client.ProducerImpl"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isConstructor().and(takesArgument(1, String.class)), + ProducerImplInstrumentation.class.getName() + "$ProducerImplConstructorAdviser"); + + transformer.applyAdviceToMethod( + isMethod() + .and(named("sendAsync")) + .and(takesArgument(1, named("org.apache.pulsar.client.impl.SendCallback"))), + ProducerImplInstrumentation.class.getName() + "$ProducerSendAsyncMethodAdviser"); + } + + @SuppressWarnings("unused") + public static class ProducerImplConstructorAdviser { + + @Advice.OnMethodEnter + public static void intercept( + @Advice.This ProducerImpl producer, + @Argument(value = 0) PulsarClient client, + @Advice.Argument(value = 1) String topic) { + PulsarClientImpl pulsarClient = (PulsarClientImpl) client; + String url = pulsarClient.getLookup().getServiceUrl(); + ClientEnhanceInfo info = new ClientEnhanceInfo(topic, url); + ClientEnhanceInfo.virtualField(producer, info); + } + } + + @SuppressWarnings("unused") + public static class ProducerSendAsyncMethodAdviser { + + @Advice.OnMethodEnter + public static Scope before( + @Advice.This ProducerImpl producer, + @Advice.AllArguments(readOnly = false) Object[] allArguments) { + ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(producer); + if (null == info) { + return Scope.noop(); + } + + MessageImpl messageImpl = (MessageImpl) allArguments[0]; + Scope scope = + TRACER + .spanBuilder("Pulsar://Producer/sendAsync") + .setParent(Context.current()) + .setSpanKind(SpanKind.PRODUCER) + .setAttribute(TOPIC, info.topic) + .setAttribute(SERVICE_URL, info.brokerUrl) + .setAttribute(PRODUCER_NAME, producer.getProducerName()) + .startSpan() + .makeCurrent(); + + Context current = Context.current(); + PROPAGATOR.inject(current, messageImpl, MessageTextMapSetter.INSTANCE); + + MessageImpl message = (MessageImpl) allArguments[0]; + SendCallback callback = (SendCallback) allArguments[1]; + allArguments[1] = new SendCallbackWrapper(info.topic, current, message, callback); + + return scope; + } + + @Advice.OnMethodExit + public static void after(@Advice.Thrown Throwable t, @Advice.This ProducerImpl producer, + @Advice.Return Scope scope) { + ClientEnhanceInfo info = + VirtualField.find(ProducerImpl.class, ClientEnhanceInfo.class).get(producer); + if (null == info || null == scope) { + if (null != scope) { + scope.close(); + } + return; + } + + Span span = Span.current(); + if (null != t) { + span.recordException(t); + } + + span.end(); + scope.close(); + } + } + + public static class SendCallbackWrapper implements SendCallback { + private static final long serialVersionUID = 1L; + + private final String topic; + private final Context context; + private final MessageImpl message; + private final SendCallback delegator; + + public SendCallbackWrapper( + String topic, Context context, MessageImpl message, SendCallback callback) { + this.topic = topic; + this.context = context; + this.message = message; + this.delegator = callback; + } + + @Override + public void sendComplete(Exception e) { + SpanBuilder builder = + TRACER + .spanBuilder("Pulsar://Producer/Callback") + .setParent(this.context) + .setSpanKind(SpanKind.PRODUCER) + .setAttribute(TOPIC, topic); + + // set message id + if (e == null + && null != message.getMessageId() + && message.getMessageId() instanceof MessageIdImpl) { + MessageIdImpl messageId = (MessageIdImpl) message.getMessageId(); + String midStr = messageId.getLedgerId() + ":" + messageId.getEntryId(); + builder.setAttribute(MESSAGE_ID, midStr); + } + + Span span = builder.startSpan(); + + try (Scope ignore = span.makeCurrent()) { + this.delegator.sendComplete(e); + } catch (Throwable t) { + span.recordException(t); + throw t; + } finally { + span.end(); + } + } + + @Override + public void addCallback(MessageImpl msg, SendCallback scb) { + this.delegator.addCallback(msg, scb); + } + + @Override + public SendCallback getNextSendCallback() { + return this.delegator.getNextSendCallback(); + } + + @Override + public MessageImpl getNextMessage() { + return this.delegator.getNextMessage(); + } + + @Override + public CompletableFuture getFuture() { + return this.delegator.getFuture(); + } + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java new file mode 100644 index 000000000000..1ce783facf1f --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.ArrayList; +import java.util.List; + +@AutoService(InstrumentationModule.class) +public class PulsarInstrumentationModule extends InstrumentationModule { + public PulsarInstrumentationModule() { + super("apache-pulsar", "apache-pulsar-2.8.0"); + } + + @Override + public List typeInstrumentations() { + List instrumentations = new ArrayList<>(4); + instrumentations.add(new ConsumerImplInstrumentation()); + instrumentations.add(new MessageInstrumentation()); + instrumentations.add(new ProducerImplInstrumentation()); + instrumentations.add(new MessageListenerInstrumentation()); + return instrumentations; + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java new file mode 100644 index 000000000000..8e40a140cf56 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java @@ -0,0 +1,37 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.propagation.TextMapPropagator; + +public final class PulsarTelemetry { + + private static final String INSTRUMENTATION = "io.opentelemetry:pulsar-client"; + public static final AttributeKey TOPIC = AttributeKey.stringKey("messaging_pulsar_topic"); + public static final AttributeKey SERVICE_URL = + AttributeKey.stringKey("messaging_pulsar_service_url"); + public static final AttributeKey SUBSCRIPTION = + AttributeKey.stringKey("messaging_pulsar_subscription"); + public static final AttributeKey PRODUCER_NAME = + AttributeKey.stringKey("messaging_pulsar_producer_name"); + public static final AttributeKey CONSUMER_NAME = + AttributeKey.stringKey("messaging_pulsar_consumer_name"); + public static final AttributeKey MESSAGE_ID = + AttributeKey.stringKey("messaging_pulsar_message_id"); + + private PulsarTelemetry() {} + + public static Tracer tracer() { + return GlobalOpenTelemetry.get().getTracer(INSTRUMENTATION); + } + + public static TextMapPropagator propagator() { + return GlobalOpenTelemetry.get().getPropagators().getTextMapPropagator(); + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java new file mode 100644 index 000000000000..1708c4719c7d --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java @@ -0,0 +1,40 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.info; + +import io.opentelemetry.instrumentation.api.field.VirtualField; +import org.apache.pulsar.client.api.Consumer; +import org.apache.pulsar.client.api.Producer; + +/** + * for producer and consumer, cache service_url and determine whether the instance has been + * enhanced. + */ +public class ClientEnhanceInfo { + public final String topic; + public final String brokerUrl; + + public ClientEnhanceInfo(String topic, String brokerUrl) { + this.topic = topic; + this.brokerUrl = brokerUrl; + } + + public static void virtualField(Producer instance, ClientEnhanceInfo info) { + VirtualField.find(Producer.class, ClientEnhanceInfo.class).set(instance, info); + } + + public static ClientEnhanceInfo virtualField(Producer instance) { + return VirtualField.find(Producer.class, ClientEnhanceInfo.class).get(instance); + } + + public static void virtualField(Consumer instance, ClientEnhanceInfo info) { + VirtualField.find(Consumer.class, ClientEnhanceInfo.class).set(instance, info); + } + + public static ClientEnhanceInfo virtualField(Consumer instance) { + return VirtualField.find(Consumer.class, ClientEnhanceInfo.class).get(instance); + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java new file mode 100644 index 000000000000..588ec0d1e682 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java @@ -0,0 +1,51 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.info; + +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.field.VirtualField; +import org.apache.pulsar.client.api.Message; +import org.apache.pulsar.client.api.MessageId; +import org.apache.pulsar.client.impl.MessageIdImpl; + +public class MessageEnhanceInfo { + private String topic; + private String messageId; + private Context context; + + public MessageEnhanceInfo() {} + + public Context getContext() { + return context; + } + + public String getTopic() { + return topic; + } + + public String getMessageId() { + return messageId; + } + + public void setFields(Context context, String topic, MessageId messageId) { + this.context = context; + this.topic = topic; + if (messageId instanceof MessageIdImpl) { + MessageIdImpl impl = (MessageIdImpl) messageId; + this.messageId = impl.getLedgerId() + ":" + impl.getEntryId(); + } else { + this.messageId = "unknown"; + } + } + + public static void virtualField(Message message, MessageEnhanceInfo context) { + VirtualField.find(Message.class, MessageEnhanceInfo.class).set(message, context); + } + + public static MessageEnhanceInfo virtualField(Message message) { + return VirtualField.find(Message.class, MessageEnhanceInfo.class).get(message); + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapGetter.java new file mode 100644 index 000000000000..3f8044b6d072 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapGetter.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.textmap; + +import io.opentelemetry.context.propagation.TextMapGetter; +import javax.annotation.Nullable; +import org.apache.pulsar.client.impl.MessageImpl; + +public final class MessageTextMapGetter implements TextMapGetter> { + public static final TextMapGetter> INSTANCE = new MessageTextMapGetter(); + + @Override + public Iterable keys(MessageImpl message) { + return message.getProperties().keySet(); + } + + @Nullable + @Override + public String get(@Nullable MessageImpl message, String key) { + return null == message ? null : message.getProperties().get(key); + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapSetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapSetter.java new file mode 100644 index 000000000000..b6d972191259 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapSetter.java @@ -0,0 +1,21 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.textmap; + +import io.opentelemetry.context.propagation.TextMapSetter; +import javax.annotation.Nullable; +import org.apache.pulsar.client.impl.MessageImpl; + +public final class MessageTextMapSetter implements TextMapSetter> { + public static final TextMapSetter> INSTANCE = new MessageTextMapSetter(); + + @Override + public void set(@Nullable MessageImpl carrier, String key, String value) { + if (carrier != null) { + carrier.getMessageBuilder().addProperty().setKey(key).setValue(value); + } + } +} diff --git a/instrumentation/apache-pulsar/testing/build.gradle.kts b/instrumentation/apache-pulsar/testing/build.gradle.kts new file mode 100644 index 000000000000..484e04028aaa --- /dev/null +++ b/instrumentation/apache-pulsar/testing/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { + api(project(":testing-common")) +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 683e4f67d93b..943b4b98faca 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -432,6 +432,10 @@ include(":instrumentation:vertx:vertx-web-3.0:javaagent") include(":instrumentation:vertx:vertx-web-3.0:testing") include(":instrumentation:wicket-8.0:javaagent") +//apache pulsar +include(":instrumentation:apache-pulsar:javaagent") +include(":instrumentation:apache-pulsar:testing") + // benchmark include(":benchmark-overhead-jmh") include(":benchmark-jfr-analyzer") From 7086bd8f8390e97900d909a345d44f1200b5fe7f Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 24 Apr 2022 06:53:10 +0800 Subject: [PATCH 02/48] remove repositories --- build.gradle.kts | 40 ---------------------------------------- 1 file changed, 40 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index cdb7b064d9bf..c11fed23b521 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,44 +31,4 @@ nexusPublishing { } } -//仓库配置 -repositories { - //mavenLocal { setUrl("file://${project.rootDir}/lib") } - //首先去本地仓库找 - mavenLocal() - //然后去阿里仓库找 - // build.gradle: - // maven { url "https://maven.aliyun.com/nexus/content/groups/public/" } - - // build.gradle.kts: - maven { url = uri("https://repo.spring.io/release") } - maven { url = uri("https://repo.spring.io/milestone") } - maven { url = uri("https://plugins.gradle.org/m2/") } - maven { - isAllowInsecureProtocol = true - setUrl("https://maven.aliyun.com/nexus/content/groups/public/") - } - maven { - isAllowInsecureProtocol = true - url = uri("https://maven.aliyun.com/repository/public") } - maven { - isAllowInsecureProtocol = true - url = uri("https://maven.aliyun.com/repository/google") } - maven { - isAllowInsecureProtocol = true - url = uri("https://maven.aliyun.com/repository/gradle-plugin") } - maven { - isAllowInsecureProtocol = true - url = uri("https://maven.aliyun.com/repository/spring-plugin") } - maven { - isAllowInsecureProtocol = true - url = uri("https://maven.aliyun.com/repository/apache-snapshots") } - maven { - isAllowInsecureProtocol = true - url = uri("https://oss.jfrog.org/artifactory/oss-snapshot-local/") } - google() - //最后从maven中央仓库找 - mavenCentral() -} - description = "OpenTelemetry instrumentations for Java" From 29cc84933baad7e2d126ca8985267a53cb7eaf13 Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 24 Apr 2022 12:10:24 +0800 Subject: [PATCH 03/48] checkstyle --- .../instrumentation/pulsar/ConsumerImplInstrumentation.java | 6 ++---- .../instrumentation/pulsar/ProducerImplInstrumentation.java | 4 +++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index dd7c4b07a2e7..a979b1e78630 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -80,8 +80,7 @@ public static class ConsumerImplMethodAdviser { @Advice.OnMethodEnter public static Scope before( - @Advice.This ConsumerImpl consumer, - @Advice.Argument(value = 0) Message message) { + @Advice.This ConsumerImpl consumer, @Advice.Argument(value = 0) Message message) { ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(consumer); if (null == info) { return Scope.noop(); @@ -119,8 +118,7 @@ public static void after( MessageEnhanceInfo messageInfo = MessageEnhanceInfo.virtualField(message); if (null != messageInfo) { - messageInfo.setFields( - Context.current(), consumer.getTopic(), message.getMessageId()); + messageInfo.setFields(Context.current(), consumer.getTopic(), message.getMessageId()); } Span span = Span.current(); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index a92671d3ac62..100715184199 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -111,7 +111,9 @@ public static Scope before( } @Advice.OnMethodExit - public static void after(@Advice.Thrown Throwable t, @Advice.This ProducerImpl producer, + public static void after( + @Advice.Thrown Throwable t, + @Advice.This ProducerImpl producer, @Advice.Return Scope scope) { ClientEnhanceInfo info = VirtualField.find(ProducerImpl.class, ClientEnhanceInfo.class).get(producer); From 1ed168681f994adfc094d997ea092e16d0d5d24a Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 24 Apr 2022 13:42:28 +0800 Subject: [PATCH 04/48] checkstyle --- .../instrumentation/pulsar/ProducerImplInstrumentation.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index 100715184199..7f61d05a57f4 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -21,7 +21,6 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.instrumentation.api.field.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; @@ -115,8 +114,7 @@ public static void after( @Advice.Thrown Throwable t, @Advice.This ProducerImpl producer, @Advice.Return Scope scope) { - ClientEnhanceInfo info = - VirtualField.find(ProducerImpl.class, ClientEnhanceInfo.class).get(producer); + ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(producer); if (null == info || null == scope) { if (null != scope) { scope.close(); From e347fa89f0036accf128f2138cec2fa9c017b9b4 Mon Sep 17 00:00:00 2001 From: daojun Date: Tue, 26 Apr 2022 06:33:36 +0800 Subject: [PATCH 05/48] bug fix --- .../apache-pulsar/javaagent/build.gradle.kts | 12 ++++ .../pulsar/ConsumerImplInstrumentation.java | 10 ++- .../pulsar/MessageInstrumentation.java | 2 +- .../MessageListenerInstrumentation.java | 16 ++--- .../pulsar/ProducerImplInstrumentation.java | 39 ++++++----- .../pulsar/PulsarTelemetry.java | 12 ++-- .../pulsar/info/ClientEnhanceInfo.java | 20 +++--- .../pulsar/PulsarClientTest.groovy | 65 +++++++++++++++++++ .../apache-pulsar/testing/build.gradle.kts | 7 -- settings.gradle.kts | 6 +- 10 files changed, 126 insertions(+), 63 deletions(-) create mode 100644 instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy delete mode 100644 instrumentation/apache-pulsar/testing/build.gradle.kts diff --git a/instrumentation/apache-pulsar/javaagent/build.gradle.kts b/instrumentation/apache-pulsar/javaagent/build.gradle.kts index a2a38d2eb768..9a63f3aa92f2 100644 --- a/instrumentation/apache-pulsar/javaagent/build.gradle.kts +++ b/instrumentation/apache-pulsar/javaagent/build.gradle.kts @@ -2,6 +2,18 @@ plugins { id("otel.javaagent-instrumentation") } +muzzle { + pass { + group.set("org.apache.pulsar") + module.set("pulsar-client") + versions.set("[2.8.0,)") + assertInverse.set(true) + } +} + dependencies { library("org.apache.pulsar:pulsar-client:2.8.0") + + testImplementation("javax.annotation:javax.annotation-api:1.3.2") + testImplementation("org.testcontainers:pulsar:1.17.1") } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index a979b1e78630..ef759ca2872d 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -6,9 +6,11 @@ package io.opentelemetry.javaagent.instrumentation.pulsar; import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.CONSUMER_NAME; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.PROPAGATOR; import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SERVICE_URL; import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SUBSCRIPTION; import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TOPIC; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TRACER; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isProtected; @@ -17,10 +19,8 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; @@ -36,8 +36,6 @@ import org.apache.pulsar.client.impl.PulsarClientImpl; public class ConsumerImplInstrumentation implements TypeInstrumentation { - private static final Tracer TRACER = PulsarTelemetry.tracer(); - private static final TextMapPropagator PROPAGATOR = PulsarTelemetry.propagator(); @Override public ElementMatcher typeMatcher() { @@ -61,7 +59,7 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class ConsumerImplConstructorAdviser { - @Advice.OnMethodEnter + @Advice.OnMethodExit public static void before( @Advice.This ConsumerImpl consumer, @Advice.Argument(value = 0) PulsarClient client, @@ -102,7 +100,7 @@ public static Scope before( .makeCurrent(); } - @Advice.OnMethodExit + @Advice.OnMethodExit(onThrowable = Throwable.class) public static void after( @Advice.This ConsumerImpl consumer, @Advice.Argument(value = 0) Message message, diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java index 2fc22c99fc98..6adde9b216e4 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java @@ -34,7 +34,7 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class MessageConstructorAdviser { - @Advice.OnMethodEnter + @Advice.OnMethodExit public static void before( @Advice.This Message message, @Advice.AllArguments Object[] allArguments) { diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java index a7c722c06a8f..af709b6abd22 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java @@ -8,14 +8,14 @@ import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.CONSUMER_NAME; import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.MESSAGE_ID; import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SUBSCRIPTION; -import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.MessagingDestinationKindValues.TOPIC; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TOPIC; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TRACER; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; @@ -23,6 +23,7 @@ import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.implementation.bytecode.assign.Assigner; import net.bytebuddy.matcher.ElementMatcher; import org.apache.pulsar.client.api.Consumer; import org.apache.pulsar.client.api.Message; @@ -30,7 +31,6 @@ import org.apache.pulsar.client.impl.conf.ConsumerConfigurationData; public class MessageListenerInstrumentation implements TypeInstrumentation { - private static final Tracer TRACER = PulsarTelemetry.tracer(); @Override public ElementMatcher typeMatcher() { @@ -50,15 +50,15 @@ public void transform(TypeTransformer transformer) { public static class ConsumerConfigurationDataMethodAdviser { @Advice.OnMethodExit - @Advice.AssignReturned.ToReturned - public static MessageListener after( + public static void after( @Advice.This ConsumerConfigurationData data, - @Advice.Return MessageListener listener) { + @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) + MessageListener listener) { if (null == listener) { - return null; + return; } - return new MessageListenerWrapper<>(listener); + listener = new MessageListenerWrapper<>(listener); } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index 7f61d05a57f4..a516e03c1464 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -7,20 +7,21 @@ import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.MESSAGE_ID; import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.PRODUCER_NAME; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.PROPAGATOR; import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SERVICE_URL; import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TOPIC; +import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TRACER; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; @@ -28,7 +29,7 @@ import java.util.concurrent.CompletableFuture; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.implementation.bind.annotation.Argument; +import net.bytebuddy.implementation.bytecode.assign.Assigner; import net.bytebuddy.matcher.ElementMatcher; import org.apache.pulsar.client.api.MessageId; import org.apache.pulsar.client.api.PulsarClient; @@ -39,18 +40,16 @@ import org.apache.pulsar.client.impl.SendCallback; public class ProducerImplInstrumentation implements TypeInstrumentation { - private static final Tracer TRACER = PulsarTelemetry.tracer(); - private static final TextMapPropagator PROPAGATOR = PulsarTelemetry.propagator(); @Override public ElementMatcher typeMatcher() { - return named("org.apache.pulsar.client.ProducerImpl"); + return named("org.apache.pulsar.client.impl.ProducerImpl"); } @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( - isConstructor().and(takesArgument(1, String.class)), + isConstructor().and(isPublic()), ProducerImplInstrumentation.class.getName() + "$ProducerImplConstructorAdviser"); transformer.applyAdviceToMethod( @@ -63,10 +62,10 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class ProducerImplConstructorAdviser { - @Advice.OnMethodEnter + @Advice.OnMethodExit public static void intercept( @Advice.This ProducerImpl producer, - @Argument(value = 0) PulsarClient client, + @Advice.Argument(value = 0) PulsarClient client, @Advice.Argument(value = 1) String topic) { PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String url = pulsarClient.getLookup().getServiceUrl(); @@ -79,16 +78,19 @@ public static void intercept( public static class ProducerSendAsyncMethodAdviser { @Advice.OnMethodEnter - public static Scope before( + public static void before( @Advice.This ProducerImpl producer, - @Advice.AllArguments(readOnly = false) Object[] allArguments) { + @Advice.AllArguments(readOnly = false, typing = Assigner.Typing.DYNAMIC) + Object[] allArguments, + @Advice.Local(value = "otelScope") Scope scope) { ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(producer); if (null == info) { - return Scope.noop(); + scope = Scope.noop(); + return; } - MessageImpl messageImpl = (MessageImpl) allArguments[0]; - Scope scope = + MessageImpl message = (MessageImpl) allArguments[0]; + scope = TRACER .spanBuilder("Pulsar://Producer/sendAsync") .setParent(Context.current()) @@ -100,20 +102,17 @@ public static Scope before( .makeCurrent(); Context current = Context.current(); - PROPAGATOR.inject(current, messageImpl, MessageTextMapSetter.INSTANCE); + PROPAGATOR.inject(current, message, MessageTextMapSetter.INSTANCE); - MessageImpl message = (MessageImpl) allArguments[0]; SendCallback callback = (SendCallback) allArguments[1]; allArguments[1] = new SendCallbackWrapper(info.topic, current, message, callback); - - return scope; } - @Advice.OnMethodExit + @Advice.OnMethodExit(onThrowable = Throwable.class) public static void after( @Advice.Thrown Throwable t, @Advice.This ProducerImpl producer, - @Advice.Return Scope scope) { + @Advice.Local(value = "otelScope") Scope scope) { ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(producer); if (null == info || null == scope) { if (null != scope) { diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java index 8e40a140cf56..7a67f697b0e6 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java @@ -25,13 +25,9 @@ public final class PulsarTelemetry { public static final AttributeKey MESSAGE_ID = AttributeKey.stringKey("messaging_pulsar_message_id"); - private PulsarTelemetry() {} - - public static Tracer tracer() { - return GlobalOpenTelemetry.get().getTracer(INSTRUMENTATION); - } + public static final Tracer TRACER = GlobalOpenTelemetry.getTracer(INSTRUMENTATION); + public static final TextMapPropagator PROPAGATOR = + GlobalOpenTelemetry.getPropagators().getTextMapPropagator(); - public static TextMapPropagator propagator() { - return GlobalOpenTelemetry.get().getPropagators().getTextMapPropagator(); - } + private PulsarTelemetry() {} } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java index 1708c4719c7d..84f795dfda46 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.pulsar.info; import io.opentelemetry.instrumentation.api.field.VirtualField; -import org.apache.pulsar.client.api.Consumer; -import org.apache.pulsar.client.api.Producer; +import org.apache.pulsar.client.impl.ConsumerImpl; +import org.apache.pulsar.client.impl.ProducerImpl; /** * for producer and consumer, cache service_url and determine whether the instance has been @@ -22,19 +22,19 @@ public ClientEnhanceInfo(String topic, String brokerUrl) { this.brokerUrl = brokerUrl; } - public static void virtualField(Producer instance, ClientEnhanceInfo info) { - VirtualField.find(Producer.class, ClientEnhanceInfo.class).set(instance, info); + public static void virtualField(ProducerImpl instance, ClientEnhanceInfo info) { + VirtualField.find(ProducerImpl.class, ClientEnhanceInfo.class).set(instance, info); } - public static ClientEnhanceInfo virtualField(Producer instance) { - return VirtualField.find(Producer.class, ClientEnhanceInfo.class).get(instance); + public static ClientEnhanceInfo virtualField(ProducerImpl instance) { + return VirtualField.find(ProducerImpl.class, ClientEnhanceInfo.class).get(instance); } - public static void virtualField(Consumer instance, ClientEnhanceInfo info) { - VirtualField.find(Consumer.class, ClientEnhanceInfo.class).set(instance, info); + public static void virtualField(ConsumerImpl instance, ClientEnhanceInfo info) { + VirtualField.find(ConsumerImpl.class, ClientEnhanceInfo.class).set(instance, info); } - public static ClientEnhanceInfo virtualField(Consumer instance) { - return VirtualField.find(Consumer.class, ClientEnhanceInfo.class).get(instance); + public static ClientEnhanceInfo virtualField(ConsumerImpl instance) { + return VirtualField.find(ConsumerImpl.class, ClientEnhanceInfo.class).get(instance); } } diff --git a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy new file mode 100644 index 000000000000..ec6e195ac7ef --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy @@ -0,0 +1,65 @@ +package io.opentelemetry.javaagent.instrumentation.pulsar + +import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification +import org.apache.pulsar.client.api.Consumer +import org.apache.pulsar.client.api.Message +import org.apache.pulsar.client.api.MessageListener +import org.apache.pulsar.client.api.Producer +import org.apache.pulsar.client.api.PulsarClient +import org.testcontainers.containers.PulsarContainer +import org.testcontainers.utility.DockerImageName + +import java.nio.charset.Charset + +import static io.opentelemetry.api.trace.SpanKind.CLIENT +import static io.opentelemetry.api.trace.SpanKind.PRODUCER + +class PulsarClientTest extends AgentInstrumentationSpecification { + + private static final DockerImageName DEFAULT_IMAGE_NAME = + DockerImageName.parse("apachepulsar/pulsar:2.8.0") + + PulsarContainer pulsar + Producer producer + Consumer consumer + + @Override + def setupSpec() { + PulsarContainer pulsar = new PulsarContainer(DEFAULT_IMAGE_NAME); + pulsar.start() + + def url = pulsar.pulsarBrokerUrl + def topic = "persistent://public/default/test_opentelemetry" + UUID.randomUUID().toString() + + def client = PulsarClient.builder().serviceUrl(url).build() + + this.producer = client.newProducer().topic(topic).create() + this.consumer = client.newConsumer() + .topic(topic) + .subscriptionName("test_sub") + .messageListener(new MessageListener() { + @Override + void received(Consumer consumer, Message msg) { + consumer.acknowledge(msg) + } + }) + .subscribe() + } + + @Override + def cleanupSpec() { + producer?.close() + consumer?.close() + pulsar.close() + } + + def "test producer send message"() { + setup: + runWithSpan("parent") { + producer.send(UUID.randomUUID().toString().getBytes(Charset.defaultCharset())) + } + + print('------apache-pulsar------') + print(traces.toString()) + } +} diff --git a/instrumentation/apache-pulsar/testing/build.gradle.kts b/instrumentation/apache-pulsar/testing/build.gradle.kts deleted file mode 100644 index 484e04028aaa..000000000000 --- a/instrumentation/apache-pulsar/testing/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id("otel.java-conventions") -} - -dependencies { - api(project(":testing-common")) -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 943b4b98faca..2dd5e4a70f44 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -126,6 +126,9 @@ include(":smoke-tests:images:servlet:servlet-3.0") include(":smoke-tests:images:servlet:servlet-5.0") include(":smoke-tests:images:spring-boot") +//apache pulsar +include(":instrumentation:apache-pulsar:javaagent") + include(":instrumentation:akka:akka-actor-2.5:javaagent") include(":instrumentation:akka:akka-actor-fork-join-2.5:javaagent") include(":instrumentation:akka:akka-http-10.0:javaagent") @@ -432,9 +435,6 @@ include(":instrumentation:vertx:vertx-web-3.0:javaagent") include(":instrumentation:vertx:vertx-web-3.0:testing") include(":instrumentation:wicket-8.0:javaagent") -//apache pulsar -include(":instrumentation:apache-pulsar:javaagent") -include(":instrumentation:apache-pulsar:testing") // benchmark include(":benchmark-overhead-jmh") From 883c40109a27ece42b51a6de80b156a8adcbb31c Mon Sep 17 00:00:00 2001 From: daojun Date: Tue, 26 Apr 2022 06:34:50 +0800 Subject: [PATCH 06/48] bug fix --- settings.gradle.kts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 2dd5e4a70f44..a3f447a0cec5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -126,9 +126,6 @@ include(":smoke-tests:images:servlet:servlet-3.0") include(":smoke-tests:images:servlet:servlet-5.0") include(":smoke-tests:images:spring-boot") -//apache pulsar -include(":instrumentation:apache-pulsar:javaagent") - include(":instrumentation:akka:akka-actor-2.5:javaagent") include(":instrumentation:akka:akka-actor-fork-join-2.5:javaagent") include(":instrumentation:akka:akka-http-10.0:javaagent") @@ -435,6 +432,8 @@ include(":instrumentation:vertx:vertx-web-3.0:javaagent") include(":instrumentation:vertx:vertx-web-3.0:testing") include(":instrumentation:wicket-8.0:javaagent") +//apache pulsar +include(":instrumentation:apache-pulsar:javaagent") // benchmark include(":benchmark-overhead-jmh") From 47e9f1caa28351eb66985061e643dc78fa880468 Mon Sep 17 00:00:00 2001 From: daojun Date: Tue, 26 Apr 2022 06:35:36 +0800 Subject: [PATCH 07/48] bug fix --- .../pulsar/info/ClientEnhanceInfo.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java index 84f795dfda46..1708c4719c7d 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java @@ -6,8 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.pulsar.info; import io.opentelemetry.instrumentation.api.field.VirtualField; -import org.apache.pulsar.client.impl.ConsumerImpl; -import org.apache.pulsar.client.impl.ProducerImpl; +import org.apache.pulsar.client.api.Consumer; +import org.apache.pulsar.client.api.Producer; /** * for producer and consumer, cache service_url and determine whether the instance has been @@ -22,19 +22,19 @@ public ClientEnhanceInfo(String topic, String brokerUrl) { this.brokerUrl = brokerUrl; } - public static void virtualField(ProducerImpl instance, ClientEnhanceInfo info) { - VirtualField.find(ProducerImpl.class, ClientEnhanceInfo.class).set(instance, info); + public static void virtualField(Producer instance, ClientEnhanceInfo info) { + VirtualField.find(Producer.class, ClientEnhanceInfo.class).set(instance, info); } - public static ClientEnhanceInfo virtualField(ProducerImpl instance) { - return VirtualField.find(ProducerImpl.class, ClientEnhanceInfo.class).get(instance); + public static ClientEnhanceInfo virtualField(Producer instance) { + return VirtualField.find(Producer.class, ClientEnhanceInfo.class).get(instance); } - public static void virtualField(ConsumerImpl instance, ClientEnhanceInfo info) { - VirtualField.find(ConsumerImpl.class, ClientEnhanceInfo.class).set(instance, info); + public static void virtualField(Consumer instance, ClientEnhanceInfo info) { + VirtualField.find(Consumer.class, ClientEnhanceInfo.class).set(instance, info); } - public static ClientEnhanceInfo virtualField(ConsumerImpl instance) { - return VirtualField.find(ConsumerImpl.class, ClientEnhanceInfo.class).get(instance); + public static ClientEnhanceInfo virtualField(Consumer instance) { + return VirtualField.find(Consumer.class, ClientEnhanceInfo.class).get(instance); } } From 9cc4f45d32b0d54920214ffc20da2864f3f2bfd2 Mon Sep 17 00:00:00 2001 From: daojun Date: Tue, 26 Apr 2022 07:45:22 +0800 Subject: [PATCH 08/48] fix pulsar producer send back --- .../pulsar/ProducerImplInstrumentation.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index a516e03c1464..b204e52844ec 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -29,8 +29,8 @@ import java.util.concurrent.CompletableFuture; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.implementation.bytecode.assign.Assigner; import net.bytebuddy.matcher.ElementMatcher; +import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.api.MessageId; import org.apache.pulsar.client.api.PulsarClient; import org.apache.pulsar.client.impl.MessageIdImpl; @@ -80,8 +80,8 @@ public static class ProducerSendAsyncMethodAdviser { @Advice.OnMethodEnter public static void before( @Advice.This ProducerImpl producer, - @Advice.AllArguments(readOnly = false, typing = Assigner.Typing.DYNAMIC) - Object[] allArguments, + @Advice.Argument(value = 0) Message m, + @Advice.Argument(value = 1, readOnly = false) SendCallback callback, @Advice.Local(value = "otelScope") Scope scope) { ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(producer); if (null == info) { @@ -89,7 +89,7 @@ public static void before( return; } - MessageImpl message = (MessageImpl) allArguments[0]; + MessageImpl message = (MessageImpl) m; scope = TRACER .spanBuilder("Pulsar://Producer/sendAsync") @@ -104,8 +104,7 @@ public static void before( Context current = Context.current(); PROPAGATOR.inject(current, message, MessageTextMapSetter.INSTANCE); - SendCallback callback = (SendCallback) allArguments[1]; - allArguments[1] = new SendCallbackWrapper(info.topic, current, message, callback); + callback = new SendCallbackWrapper(info.topic, current, message, callback); } @Advice.OnMethodExit(onThrowable = Throwable.class) From 09052dace1fb4f45605dc654b0accea048b2981e Mon Sep 17 00:00:00 2001 From: daojun Date: Fri, 13 May 2022 01:10:29 +0800 Subject: [PATCH 09/48] review fix --- .../pulsar/ConsumerImplInstrumentation.java | 50 ++++++++++--------- .../pulsar/MessageInstrumentation.java | 4 +- .../MessageListenerInstrumentation.java | 4 +- .../pulsar/ProducerImplInstrumentation.java | 10 ++-- .../pulsar/PulsarTelemetry.java | 16 ++++-- .../pulsar/info/ClientEnhanceInfo.java | 21 +++++--- .../pulsar/info/MessageEnhanceInfo.java | 11 ++-- 7 files changed, 66 insertions(+), 50 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index ef759ca2872d..d07b4ef367ca 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -59,8 +59,8 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class ConsumerImplConstructorAdviser { - @Advice.OnMethodExit - public static void before( + @Advice.OnMethodExit(suppress = Throwable.class) + public static void after( @Advice.This ConsumerImpl consumer, @Advice.Argument(value = 0) PulsarClient client, @Advice.Argument(value = 1) String topic) { @@ -69,7 +69,7 @@ public static void before( String url = pulsarClient.getLookup().getServiceUrl(); ClientEnhanceInfo info = new ClientEnhanceInfo(topic, url); - ClientEnhanceInfo.virtualField(consumer, info); + ClientEnhanceInfo.setConsumerEnhancedField(consumer, info); } } @@ -77,19 +77,21 @@ public static void before( public static class ConsumerImplMethodAdviser { @Advice.OnMethodEnter - public static Scope before( - @Advice.This ConsumerImpl consumer, @Advice.Argument(value = 0) Message message) { - ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(consumer); + public static void before( + @Advice.This ConsumerImpl consumer, + @Advice.Argument(value = 0) Message message, + @Advice.Local(value = "otelScope") Scope scope) { + ClientEnhanceInfo info = ClientEnhanceInfo.getConsumerEnhancedField(consumer); if (null == info) { - return Scope.noop(); + scope = Scope.noop(); } MessageImpl messageImpl = (MessageImpl) message; Context context = PROPAGATOR.extract(Context.current(), messageImpl, MessageTextMapGetter.INSTANCE); - return TRACER - .spanBuilder("Pulsar://ConsumerImpl/messageProcessed") + scope = TRACER + .spanBuilder("ConsumerImpl/messageProcessed") .setParent(context) .setSpanKind(SpanKind.CONSUMER) .setAttribute(TOPIC, info.topic) @@ -105,27 +107,27 @@ public static void after( @Advice.This ConsumerImpl consumer, @Advice.Argument(value = 0) Message message, @Advice.Thrown Throwable t, - @Advice.Enter Scope scope) { - ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(consumer); - if (null == info || scope == null) { + @Advice.Local(value = "otelScope") Scope scope) { + ClientEnhanceInfo info = ClientEnhanceInfo.getConsumerEnhancedField(consumer); + if (null == info || null == scope) { if (null != scope) { scope.close(); } - return; - } + } else { + MessageEnhanceInfo messageInfo = MessageEnhanceInfo.getMessageEnhancedField(message); + if (null != messageInfo) { + messageInfo.setFields(Context.current(), consumer.getTopic(), message.getMessageId()); + } - MessageEnhanceInfo messageInfo = MessageEnhanceInfo.virtualField(message); - if (null != messageInfo) { - messageInfo.setFields(Context.current(), consumer.getTopic(), message.getMessageId()); - } + Span span = Span.current(); + if (t != null) { + span.recordException(t); + } - Span span = Span.current(); - if (t != null) { - span.recordException(t); + span.end(); + scope.close(); } - - span.end(); - scope.close(); } + } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java index 6adde9b216e4..cee8243c5a6b 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java @@ -39,12 +39,12 @@ public static void before( @Advice.This Message message, @Advice.AllArguments Object[] allArguments) { if (message instanceof MessageImpl) { - MessageEnhanceInfo.virtualField(message, new MessageEnhanceInfo()); + MessageEnhanceInfo.setMessageEnhancedField(message, new MessageEnhanceInfo()); } else { Object argument2 = allArguments[2]; if (message instanceof TopicMessageImpl && argument2 instanceof MessageImpl) { MessageImpl impl = (MessageImpl) argument2; - MessageEnhanceInfo.virtualField(message, MessageEnhanceInfo.virtualField(impl)); + MessageEnhanceInfo.setMessageEnhancedField(message, MessageEnhanceInfo.getMessageEnhancedField(impl)); } } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java index af709b6abd22..1a930a8990c9 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java @@ -73,14 +73,14 @@ public MessageListenerWrapper(MessageListener messageListener) { @Override public void received(Consumer consumer, Message msg) { - MessageEnhanceInfo info = MessageEnhanceInfo.virtualField(msg); + MessageEnhanceInfo info = MessageEnhanceInfo.getMessageEnhancedField(msg); Context parent = info == null ? Context.current() : info.getContext(); String topic = null == info ? consumer.getTopic() : info.getTopic(); String mid = null == info ? "unknown" : info.getMessageId(); Span span = TRACER - .spanBuilder("Pulsar://MessageListener/received") + .spanBuilder("MessageListener/received") .setParent(parent) .setSpanKind(SpanKind.CONSUMER) .setAttribute(TOPIC, topic) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index b204e52844ec..5f759bce3b22 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -70,7 +70,7 @@ public static void intercept( PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String url = pulsarClient.getLookup().getServiceUrl(); ClientEnhanceInfo info = new ClientEnhanceInfo(topic, url); - ClientEnhanceInfo.virtualField(producer, info); + ClientEnhanceInfo.setProducerEnhancedField(producer, info); } } @@ -83,7 +83,7 @@ public static void before( @Advice.Argument(value = 0) Message m, @Advice.Argument(value = 1, readOnly = false) SendCallback callback, @Advice.Local(value = "otelScope") Scope scope) { - ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(producer); + ClientEnhanceInfo info = ClientEnhanceInfo.getProducerEnhancedField(producer); if (null == info) { scope = Scope.noop(); return; @@ -92,7 +92,7 @@ public static void before( MessageImpl message = (MessageImpl) m; scope = TRACER - .spanBuilder("Pulsar://Producer/sendAsync") + .spanBuilder("Producer/sendAsync") .setParent(Context.current()) .setSpanKind(SpanKind.PRODUCER) .setAttribute(TOPIC, info.topic) @@ -112,7 +112,7 @@ public static void after( @Advice.Thrown Throwable t, @Advice.This ProducerImpl producer, @Advice.Local(value = "otelScope") Scope scope) { - ClientEnhanceInfo info = ClientEnhanceInfo.virtualField(producer); + ClientEnhanceInfo info = ClientEnhanceInfo.getProducerEnhancedField(producer); if (null == info || null == scope) { if (null != scope) { scope.close(); @@ -150,7 +150,7 @@ public SendCallbackWrapper( public void sendComplete(Exception e) { SpanBuilder builder = TRACER - .spanBuilder("Pulsar://Producer/Callback") + .spanBuilder("Producer/Callback") .setParent(this.context) .setSpanKind(SpanKind.PRODUCER) .setAttribute(TOPIC, topic); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java index 7a67f697b0e6..aa6489f9c0fa 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java @@ -9,23 +9,29 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; public final class PulsarTelemetry { private static final String INSTRUMENTATION = "io.opentelemetry:pulsar-client"; - public static final AttributeKey TOPIC = AttributeKey.stringKey("messaging_pulsar_topic"); - public static final AttributeKey SERVICE_URL = - AttributeKey.stringKey("messaging_pulsar_service_url"); + + public static final AttributeKey TOPIC = SemanticAttributes.MESSAGING_DESTINATION; + + public static final AttributeKey SERVICE_URL = SemanticAttributes.MESSAGING_URL; + public static final AttributeKey SUBSCRIPTION = AttributeKey.stringKey("messaging_pulsar_subscription"); + public static final AttributeKey PRODUCER_NAME = AttributeKey.stringKey("messaging_pulsar_producer_name"); + public static final AttributeKey CONSUMER_NAME = AttributeKey.stringKey("messaging_pulsar_consumer_name"); - public static final AttributeKey MESSAGE_ID = - AttributeKey.stringKey("messaging_pulsar_message_id"); + + public static final AttributeKey MESSAGE_ID =SemanticAttributes.MESSAGING_MESSAGE_ID; public static final Tracer TRACER = GlobalOpenTelemetry.getTracer(INSTRUMENTATION); + public static final TextMapPropagator PROPAGATOR = GlobalOpenTelemetry.getPropagators().getTextMapPropagator(); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java index 1708c4719c7d..21eeb60d1914 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java @@ -14,6 +14,11 @@ * enhanced. */ public class ClientEnhanceInfo { + private static final VirtualField, ClientEnhanceInfo> PRODUCER_ENHANCED_FIELD = + VirtualField.find(Producer.class, ClientEnhanceInfo.class); + private static final VirtualField, ClientEnhanceInfo> CONSUMER_ENHANCED_FIELD = + VirtualField.find(Consumer.class, ClientEnhanceInfo.class); + public final String topic; public final String brokerUrl; @@ -22,19 +27,19 @@ public ClientEnhanceInfo(String topic, String brokerUrl) { this.brokerUrl = brokerUrl; } - public static void virtualField(Producer instance, ClientEnhanceInfo info) { - VirtualField.find(Producer.class, ClientEnhanceInfo.class).set(instance, info); + public static void setProducerEnhancedField(Producer instance, ClientEnhanceInfo info) { + PRODUCER_ENHANCED_FIELD.set(instance, info); } - public static ClientEnhanceInfo virtualField(Producer instance) { - return VirtualField.find(Producer.class, ClientEnhanceInfo.class).get(instance); + public static ClientEnhanceInfo getProducerEnhancedField(Producer instance) { + return PRODUCER_ENHANCED_FIELD.get(instance); } - public static void virtualField(Consumer instance, ClientEnhanceInfo info) { - VirtualField.find(Consumer.class, ClientEnhanceInfo.class).set(instance, info); + public static void setConsumerEnhancedField(Consumer instance, ClientEnhanceInfo info) { + CONSUMER_ENHANCED_FIELD.set(instance, info); } - public static ClientEnhanceInfo virtualField(Consumer instance) { - return VirtualField.find(Consumer.class, ClientEnhanceInfo.class).get(instance); + public static ClientEnhanceInfo getConsumerEnhancedField(Consumer instance) { + return CONSUMER_ENHANCED_FIELD.get(instance); } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java index 588ec0d1e682..5c091e032ee9 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java @@ -12,6 +12,9 @@ import org.apache.pulsar.client.impl.MessageIdImpl; public class MessageEnhanceInfo { + private static final VirtualField, MessageEnhanceInfo> MESSAGE_ENHANCED_FIELD = + VirtualField.find(Message.class, MessageEnhanceInfo.class); + private String topic; private String messageId; private Context context; @@ -41,11 +44,11 @@ public void setFields(Context context, String topic, MessageId messageId) { } } - public static void virtualField(Message message, MessageEnhanceInfo context) { - VirtualField.find(Message.class, MessageEnhanceInfo.class).set(message, context); + public static void setMessageEnhancedField(Message message, MessageEnhanceInfo context) { + MESSAGE_ENHANCED_FIELD.set(message, context); } - public static MessageEnhanceInfo virtualField(Message message) { - return VirtualField.find(Message.class, MessageEnhanceInfo.class).get(message); + public static MessageEnhanceInfo getMessageEnhancedField(Message message) { + return MESSAGE_ENHANCED_FIELD.get(message); } } From 2e127e6c1fc8f40b59a759e011e84278af1894cf Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 15 May 2022 00:09:01 +0800 Subject: [PATCH 10/48] checkstyle fix --- .../instrumentation/pulsar/MessageInstrumentation.java | 3 ++- .../javaagent/instrumentation/pulsar/PulsarTelemetry.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java index cee8243c5a6b..6ecdac6fc337 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java @@ -44,7 +44,8 @@ public static void before( Object argument2 = allArguments[2]; if (message instanceof TopicMessageImpl && argument2 instanceof MessageImpl) { MessageImpl impl = (MessageImpl) argument2; - MessageEnhanceInfo.setMessageEnhancedField(message, MessageEnhanceInfo.getMessageEnhancedField(impl)); + MessageEnhanceInfo info = MessageEnhanceInfo.getMessageEnhancedField(impl); + MessageEnhanceInfo.setMessageEnhancedField(message, info); } } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java index aa6489f9c0fa..9732030c3d23 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java @@ -28,7 +28,7 @@ public final class PulsarTelemetry { public static final AttributeKey CONSUMER_NAME = AttributeKey.stringKey("messaging_pulsar_consumer_name"); - public static final AttributeKey MESSAGE_ID =SemanticAttributes.MESSAGING_MESSAGE_ID; + public static final AttributeKey MESSAGE_ID = SemanticAttributes.MESSAGING_MESSAGE_ID; public static final Tracer TRACER = GlobalOpenTelemetry.getTracer(INSTRUMENTATION); From 975671ca5e03468434d5731fc9443e1f690b1742 Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 16 May 2022 12:12:26 +0800 Subject: [PATCH 11/48] checkstyle fix --- .../pulsar/ConsumerImplInstrumentation.java | 27 +++++++++------- .../pulsar/MessageInstrumentation.java | 9 ++++-- .../MessageListenerInstrumentation.java | 6 +++- .../pulsar/ProducerImplInstrumentation.java | 31 ++++++++++--------- .../pulsar/info/ClientEnhanceInfo.java | 24 -------------- .../pulsar/info/MessageEnhanceInfo.java | 12 ------- 6 files changed, 43 insertions(+), 66 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index d07b4ef367ca..7aead5319dea 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -21,6 +21,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.field.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; @@ -29,6 +30,7 @@ import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; +import org.apache.pulsar.client.api.Consumer; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.api.PulsarClient; import org.apache.pulsar.client.impl.ConsumerImpl; @@ -67,9 +69,11 @@ public static void after( PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String url = pulsarClient.getLookup().getServiceUrl(); - ClientEnhanceInfo info = new ClientEnhanceInfo(topic, url); - ClientEnhanceInfo.setConsumerEnhancedField(consumer, info); + + VirtualField, ClientEnhanceInfo> virtualField = + VirtualField.find(Consumer.class, ClientEnhanceInfo.class); + virtualField.set(consumer, info); } } @@ -81,9 +85,12 @@ public static void before( @Advice.This ConsumerImpl consumer, @Advice.Argument(value = 0) Message message, @Advice.Local(value = "otelScope") Scope scope) { - ClientEnhanceInfo info = ClientEnhanceInfo.getConsumerEnhancedField(consumer); + VirtualField, ClientEnhanceInfo> virtualField = + VirtualField.find(Consumer.class, ClientEnhanceInfo.class); + ClientEnhanceInfo info = virtualField.get(consumer); if (null == info) { - scope = Scope.noop(); + scope = null; + return; } MessageImpl messageImpl = (MessageImpl) message; @@ -108,13 +115,11 @@ public static void after( @Advice.Argument(value = 0) Message message, @Advice.Thrown Throwable t, @Advice.Local(value = "otelScope") Scope scope) { - ClientEnhanceInfo info = ClientEnhanceInfo.getConsumerEnhancedField(consumer); - if (null == info || null == scope) { - if (null != scope) { - scope.close(); - } - } else { - MessageEnhanceInfo messageInfo = MessageEnhanceInfo.getMessageEnhancedField(message); + if (scope != null) { + VirtualField, MessageEnhanceInfo> virtualField = + VirtualField.find(Message.class, MessageEnhanceInfo.class); + MessageEnhanceInfo messageInfo = virtualField.get(message); + if (null != messageInfo) { messageInfo.setFields(Context.current(), consumer.getTopic(), message.getMessageId()); } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java index 6ecdac6fc337..da5ebb6f6790 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java @@ -8,6 +8,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; +import io.opentelemetry.instrumentation.api.field.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; @@ -37,15 +38,17 @@ public static class MessageConstructorAdviser { @Advice.OnMethodExit public static void before( @Advice.This Message message, @Advice.AllArguments Object[] allArguments) { + VirtualField, MessageEnhanceInfo> virtualField = + VirtualField.find(Message.class, MessageEnhanceInfo.class); if (message instanceof MessageImpl) { - MessageEnhanceInfo.setMessageEnhancedField(message, new MessageEnhanceInfo()); + virtualField.set(message, new MessageEnhanceInfo()); } else { Object argument2 = allArguments[2]; if (message instanceof TopicMessageImpl && argument2 instanceof MessageImpl) { MessageImpl impl = (MessageImpl) argument2; - MessageEnhanceInfo info = MessageEnhanceInfo.getMessageEnhancedField(impl); - MessageEnhanceInfo.setMessageEnhancedField(message, info); + MessageEnhanceInfo info = virtualField.get(impl); + virtualField.set(message, info); } } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java index 1a930a8990c9..0fe4fcdc0292 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java @@ -18,6 +18,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.field.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; @@ -73,7 +74,10 @@ public MessageListenerWrapper(MessageListener messageListener) { @Override public void received(Consumer consumer, Message msg) { - MessageEnhanceInfo info = MessageEnhanceInfo.getMessageEnhancedField(msg); + VirtualField, MessageEnhanceInfo> virtualField = + VirtualField.find(Message.class, MessageEnhanceInfo.class); + MessageEnhanceInfo info = virtualField.get(msg); + Context parent = info == null ? Context.current() : info.getContext(); String topic = null == info ? consumer.getTopic() : info.getTopic(); String mid = null == info ? "unknown" : info.getMessageId(); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index 5f759bce3b22..5a437ed95f11 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -22,6 +22,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.field.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; @@ -32,6 +33,7 @@ import net.bytebuddy.matcher.ElementMatcher; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.api.MessageId; +import org.apache.pulsar.client.api.Producer; import org.apache.pulsar.client.api.PulsarClient; import org.apache.pulsar.client.impl.MessageIdImpl; import org.apache.pulsar.client.impl.MessageImpl; @@ -70,7 +72,10 @@ public static void intercept( PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String url = pulsarClient.getLookup().getServiceUrl(); ClientEnhanceInfo info = new ClientEnhanceInfo(topic, url); - ClientEnhanceInfo.setProducerEnhancedField(producer, info); + + VirtualField, ClientEnhanceInfo> virtualField = + VirtualField.find(Producer.class, ClientEnhanceInfo.class); + virtualField.set(producer, info); } } @@ -83,9 +88,11 @@ public static void before( @Advice.Argument(value = 0) Message m, @Advice.Argument(value = 1, readOnly = false) SendCallback callback, @Advice.Local(value = "otelScope") Scope scope) { - ClientEnhanceInfo info = ClientEnhanceInfo.getProducerEnhancedField(producer); + VirtualField, ClientEnhanceInfo> virtualField = + VirtualField.find(Producer.class, ClientEnhanceInfo.class); + ClientEnhanceInfo info = virtualField.get(producer); if (null == info) { - scope = Scope.noop(); + scope = null; return; } @@ -112,21 +119,15 @@ public static void after( @Advice.Thrown Throwable t, @Advice.This ProducerImpl producer, @Advice.Local(value = "otelScope") Scope scope) { - ClientEnhanceInfo info = ClientEnhanceInfo.getProducerEnhancedField(producer); - if (null == info || null == scope) { - if (null != scope) { - scope.close(); + if (scope != null) { + Span span = Span.current(); + if (null != t) { + span.recordException(t); } - return; - } - Span span = Span.current(); - if (null != t) { - span.recordException(t); + span.end(); + scope.close(); } - - span.end(); - scope.close(); } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java index 21eeb60d1914..4ea57f242928 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java @@ -5,19 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.pulsar.info; -import io.opentelemetry.instrumentation.api.field.VirtualField; -import org.apache.pulsar.client.api.Consumer; -import org.apache.pulsar.client.api.Producer; - /** * for producer and consumer, cache service_url and determine whether the instance has been * enhanced. */ public class ClientEnhanceInfo { - private static final VirtualField, ClientEnhanceInfo> PRODUCER_ENHANCED_FIELD = - VirtualField.find(Producer.class, ClientEnhanceInfo.class); - private static final VirtualField, ClientEnhanceInfo> CONSUMER_ENHANCED_FIELD = - VirtualField.find(Consumer.class, ClientEnhanceInfo.class); public final String topic; public final String brokerUrl; @@ -26,20 +18,4 @@ public ClientEnhanceInfo(String topic, String brokerUrl) { this.topic = topic; this.brokerUrl = brokerUrl; } - - public static void setProducerEnhancedField(Producer instance, ClientEnhanceInfo info) { - PRODUCER_ENHANCED_FIELD.set(instance, info); - } - - public static ClientEnhanceInfo getProducerEnhancedField(Producer instance) { - return PRODUCER_ENHANCED_FIELD.get(instance); - } - - public static void setConsumerEnhancedField(Consumer instance, ClientEnhanceInfo info) { - CONSUMER_ENHANCED_FIELD.set(instance, info); - } - - public static ClientEnhanceInfo getConsumerEnhancedField(Consumer instance) { - return CONSUMER_ENHANCED_FIELD.get(instance); - } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java index 5c091e032ee9..54bc8924132a 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java @@ -6,14 +6,10 @@ package io.opentelemetry.javaagent.instrumentation.pulsar.info; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.field.VirtualField; -import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.api.MessageId; import org.apache.pulsar.client.impl.MessageIdImpl; public class MessageEnhanceInfo { - private static final VirtualField, MessageEnhanceInfo> MESSAGE_ENHANCED_FIELD = - VirtualField.find(Message.class, MessageEnhanceInfo.class); private String topic; private String messageId; @@ -43,12 +39,4 @@ public void setFields(Context context, String topic, MessageId messageId) { this.messageId = "unknown"; } } - - public static void setMessageEnhancedField(Message message, MessageEnhanceInfo context) { - MESSAGE_ENHANCED_FIELD.set(message, context); - } - - public static MessageEnhanceInfo getMessageEnhancedField(Message message) { - return MESSAGE_ENHANCED_FIELD.get(message); - } } From 0845f0ea47d2e23ed9ee36c00d43866bf28619ae Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 16 May 2022 12:32:04 +0800 Subject: [PATCH 12/48] merge master into current --- .../instrumentation/pulsar/ConsumerImplInstrumentation.java | 2 +- .../instrumentation/pulsar/MessageInstrumentation.java | 2 +- .../instrumentation/pulsar/MessageListenerInstrumentation.java | 2 +- .../instrumentation/pulsar/ProducerImplInstrumentation.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index 7aead5319dea..d3df81d730ae 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -21,7 +21,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java index da5ebb6f6790..9473191263e7 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java @@ -8,7 +8,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java index 0fe4fcdc0292..062e4f8196da 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java @@ -18,7 +18,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index 5a437ed95f11..17b25df78725 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -22,7 +22,7 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; From 34c425a84d3305c084857921d87c49807dfaf238 Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 16 May 2022 12:55:28 +0800 Subject: [PATCH 13/48] codestyle fix --- .../pulsar/ConsumerImplInstrumentation.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index d3df81d730ae..d68c8da7d7bd 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -97,16 +97,17 @@ public static void before( Context context = PROPAGATOR.extract(Context.current(), messageImpl, MessageTextMapGetter.INSTANCE); - scope = TRACER - .spanBuilder("ConsumerImpl/messageProcessed") - .setParent(context) - .setSpanKind(SpanKind.CONSUMER) - .setAttribute(TOPIC, info.topic) - .setAttribute(SERVICE_URL, info.brokerUrl) - .setAttribute(SUBSCRIPTION, consumer.getSubscription()) - .setAttribute(CONSUMER_NAME, consumer.getConsumerName()) - .startSpan() - .makeCurrent(); + scope = + TRACER + .spanBuilder("ConsumerImpl/messageProcessed") + .setParent(context) + .setSpanKind(SpanKind.CONSUMER) + .setAttribute(TOPIC, info.topic) + .setAttribute(SERVICE_URL, info.brokerUrl) + .setAttribute(SUBSCRIPTION, consumer.getSubscription()) + .setAttribute(CONSUMER_NAME, consumer.getConsumerName()) + .startSpan() + .makeCurrent(); } @Advice.OnMethodExit(onThrowable = Throwable.class) From 1e6aa3d225fbe27536278455d86be341e4cbe5fa Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 16 May 2022 13:11:23 +0800 Subject: [PATCH 14/48] codestyle fix --- .../instrumentation/pulsar/ConsumerImplInstrumentation.java | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index d68c8da7d7bd..3e2084fe32a7 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -134,6 +134,5 @@ public static void after( scope.close(); } } - } } From d23932be1592ca06f1e9f99934c8c5e64c4ab65a Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 13 Jun 2022 01:40:12 +0800 Subject: [PATCH 15/48] complete tests --- .../pulsar/PulsarClientTest.groovy | 104 +++++++++++++++--- 1 file changed, 86 insertions(+), 18 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy index ec6e195ac7ef..70451c817671 100644 --- a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy @@ -1,17 +1,20 @@ package io.opentelemetry.javaagent.instrumentation.pulsar +import io.opentelemetry.api.trace.SpanKind import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification import org.apache.pulsar.client.api.Consumer import org.apache.pulsar.client.api.Message import org.apache.pulsar.client.api.MessageListener import org.apache.pulsar.client.api.Producer import org.apache.pulsar.client.api.PulsarClient +import org.apache.pulsar.client.api.Schema import org.testcontainers.containers.PulsarContainer import org.testcontainers.utility.DockerImageName import java.nio.charset.Charset - -import static io.opentelemetry.api.trace.SpanKind.CLIENT +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import static io.opentelemetry.api.trace.SpanKind.CONSUMER import static io.opentelemetry.api.trace.SpanKind.PRODUCER class PulsarClientTest extends AgentInstrumentationSpecification { @@ -20,6 +23,8 @@ class PulsarClientTest extends AgentInstrumentationSpecification { DockerImageName.parse("apachepulsar/pulsar:2.8.0") PulsarContainer pulsar + PulsarClient client + String topic Producer producer Consumer consumer @@ -29,27 +34,16 @@ class PulsarClientTest extends AgentInstrumentationSpecification { pulsar.start() def url = pulsar.pulsarBrokerUrl - def topic = "persistent://public/default/test_opentelemetry" + UUID.randomUUID().toString() - - def client = PulsarClient.builder().serviceUrl(url).build() - + topic = "persistent://public/default/test_" + UUID.randomUUID().toString() + client = PulsarClient.builder().serviceUrl(url).build() this.producer = client.newProducer().topic(topic).create() - this.consumer = client.newConsumer() - .topic(topic) - .subscriptionName("test_sub") - .messageListener(new MessageListener() { - @Override - void received(Consumer consumer, Message msg) { - consumer.acknowledge(msg) - } - }) - .subscribe() } @Override def cleanupSpec() { producer?.close() consumer?.close() + client?.close() pulsar.close() } @@ -59,7 +53,81 @@ class PulsarClientTest extends AgentInstrumentationSpecification { producer.send(UUID.randomUUID().toString().getBytes(Charset.defaultCharset())) } - print('------apache-pulsar------') - print(traces.toString()) + assertTraces(1) { + trace(0, 3) { + span(0) { + name("parent") + kind(SpanKind.INTERNAL) + hasNoParent() + } + + span(1) { + name("Producer/sendAsync") + kind(PRODUCER) + childOf span(0) + } + + span(2) { + name("Producer/Callback") + kind(PRODUCER) + childOf(span(0)) + } + } + } + } + + def "test send and consume message"() { + setup: + def latch = new CountDownLatch(1) + consumer = client.newConsumer(Schema.BYTES) + .subscriptionName("test_sub") + .messageListener(new MessageListener() { + @Override + void received(Consumer consumer, Message msg) { + latch.countDown() + consumer.acknowledge(msg) + } + }) + .subscribe() + + runWithSpan("parent") { + producer.send(UUID.randomUUID().toString().getBytes(Charset.defaultCharset())) + } + + latch.await(1, TimeUnit.MINUTES) + + assertTraces(1) { + trace(0, 3) { + span(0) { + name("parent") + kind(SpanKind.INTERNAL) + hasNoParent() + } + + span(1) { + name("Producer/sendAsync") + kind(PRODUCER) + childOf span(0) + } + + span(2) { + name("Producer/Callback") + kind(PRODUCER) + childOf(span(0)) + } + + span(3) { + name("ConsumerImpl/messageProcessed") + kind(CONSUMER) + childOf span(1) + } + + span(4) { + name("MessageListener/received") + kind(CONSUMER) + childOf(span(1)) + } + } + } } } From 79ca3a2e35f902cf527868d396580049b7195322 Mon Sep 17 00:00:00 2001 From: daojun Date: Sat, 3 Dec 2022 04:04:29 +0800 Subject: [PATCH 16/48] Refactor with Instrument API --- .../pulsar/ClientEnhanceInfo.java | 29 +++++ .../pulsar/ConsumerImplInstrumentation.java | 87 +++++-------- .../pulsar/MessageInstrumentation.java | 56 --------- .../MessageListenerInstrumentation.java | 44 ++----- .../pulsar/ProducerImplInstrumentation.java | 117 +++++------------- .../pulsar/PulsarInstrumentationModule.java | 1 - .../pulsar/PulsarTelemetry.java | 39 ------ .../pulsar/VirtualFieldStore.java | 50 ++++++++ .../pulsar/info/ClientEnhanceInfo.java | 21 ---- .../pulsar/info/MessageEnhanceInfo.java | 42 ------- .../ConsumerListenerAttributeGetter.java | 87 +++++++++++++ .../ConsumerReceiveAttributeExtractor.java | 34 +++++ .../ConsumerReceiveAttributeGetter.java | 94 ++++++++++++++ .../MessageTextMapGetter.java | 11 +- .../telemetry/MessageTextMapSetter.java | 23 ++++ .../telemetry/ProducerAttributeExtractor.java | 61 +++++++++ .../telemetry/ProducerAttributeGetter.java | 92 ++++++++++++++ .../pulsar/telemetry/PulsarTelemetry.java | 109 ++++++++++++++++ .../pulsar/textmap/MessageTextMapSetter.java | 21 ---- .../pulsar/PulsarClientTest.groovy | 22 +--- settings.gradle.kts | 4 +- 21 files changed, 664 insertions(+), 380 deletions(-) create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java delete mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java delete mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java delete mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java delete mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java rename instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/{textmap => telemetry}/MessageTextMapGetter.java (50%) create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapSetter.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java delete mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapSetter.java diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java new file mode 100644 index 000000000000..f38db79e7eab --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java @@ -0,0 +1,29 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar; + +import com.google.common.base.Strings; + +/** + * for producer and consumer, cache service_url and determine whether the instance has been + * enhanced. + */ +class ClientEnhanceInfo { + public static final String DEFAULT_TOPIC = "unknown"; + public static final String DEFAULT_BROKER_URL = "unknown"; + + public final String topic; + public final String brokerURL; + + private ClientEnhanceInfo(String topic, String brokerURL) { + this.topic = Strings.isNullOrEmpty(topic) ? DEFAULT_TOPIC : topic; + this.brokerURL = Strings.isNullOrEmpty(brokerURL) ? DEFAULT_BROKER_URL : brokerURL; + } + + public static ClientEnhanceInfo create(String topic, String brokerURL) { + return new ClientEnhanceInfo(topic, brokerURL); + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index 3e2084fe32a7..ba6fe2a4f044 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -5,36 +5,25 @@ package io.opentelemetry.javaagent.instrumentation.pulsar; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.CONSUMER_NAME; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.PROPAGATOR; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SERVICE_URL; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SUBSCRIPTION; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TOPIC; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TRACER; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isProtected; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; - -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; -import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; -import io.opentelemetry.javaagent.instrumentation.pulsar.textmap.MessageTextMapGetter; +import io.opentelemetry.javaagent.instrumentation.pulsar.telemetry.PulsarTelemetry; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -import org.apache.pulsar.client.api.Consumer; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.api.PulsarClient; import org.apache.pulsar.client.impl.ConsumerImpl; -import org.apache.pulsar.client.impl.MessageImpl; import org.apache.pulsar.client.impl.PulsarClientImpl; public class ConsumerImplInstrumentation implements TypeInstrumentation { @@ -69,11 +58,8 @@ public static void after( PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String url = pulsarClient.getLookup().getServiceUrl(); - ClientEnhanceInfo info = new ClientEnhanceInfo(topic, url); - - VirtualField, ClientEnhanceInfo> virtualField = - VirtualField.find(Consumer.class, ClientEnhanceInfo.class); - virtualField.set(consumer, info); + ClientEnhanceInfo info = ClientEnhanceInfo.create(topic, url); + VirtualFieldStore.inject(consumer, info); } } @@ -85,29 +71,13 @@ public static void before( @Advice.This ConsumerImpl consumer, @Advice.Argument(value = 0) Message message, @Advice.Local(value = "otelScope") Scope scope) { - VirtualField, ClientEnhanceInfo> virtualField = - VirtualField.find(Consumer.class, ClientEnhanceInfo.class); - ClientEnhanceInfo info = virtualField.get(consumer); - if (null == info) { - scope = null; - return; - } + Instrumenter, Attributes> instrumenter = + PulsarTelemetry.consumerReceiveInstrumenter(); - MessageImpl messageImpl = (MessageImpl) message; - Context context = - PROPAGATOR.extract(Context.current(), messageImpl, MessageTextMapGetter.INSTANCE); - - scope = - TRACER - .spanBuilder("ConsumerImpl/messageProcessed") - .setParent(context) - .setSpanKind(SpanKind.CONSUMER) - .setAttribute(TOPIC, info.topic) - .setAttribute(SERVICE_URL, info.brokerUrl) - .setAttribute(SUBSCRIPTION, consumer.getSubscription()) - .setAttribute(CONSUMER_NAME, consumer.getConsumerName()) - .startSpan() - .makeCurrent(); + Context parent = Context.current(); + if (instrumenter.shouldStart(parent, message)) { + scope = instrumenter.start(parent, message).makeCurrent(); + } } @Advice.OnMethodExit(onThrowable = Throwable.class) @@ -116,23 +86,24 @@ public static void after( @Advice.Argument(value = 0) Message message, @Advice.Thrown Throwable t, @Advice.Local(value = "otelScope") Scope scope) { - if (scope != null) { - VirtualField, MessageEnhanceInfo> virtualField = - VirtualField.find(Message.class, MessageEnhanceInfo.class); - MessageEnhanceInfo messageInfo = virtualField.get(message); - - if (null != messageInfo) { - messageInfo.setFields(Context.current(), consumer.getTopic(), message.getMessageId()); - } - - Span span = Span.current(); - if (t != null) { - span.recordException(t); - } - - span.end(); - scope.close(); + if (scope == null) { + return; } + + ClientEnhanceInfo cinfo = VirtualFieldStore.extract(consumer); + String topic = null == cinfo ? ClientEnhanceInfo.DEFAULT_TOPIC : cinfo.topic; + String brokerURL = null == cinfo ? ClientEnhanceInfo.DEFAULT_BROKER_URL : cinfo.brokerURL; + Attributes attributes = Attributes.of( + SemanticAttributes.MESSAGING_URL, brokerURL, + SemanticAttributes.MESSAGING_DESTINATION, topic); + + Context current = Context.current(); + VirtualFieldStore.inject(message, current); + + Instrumenter, Attributes> instrumenter = + PulsarTelemetry.consumerReceiveInstrumenter(); + instrumenter.end(current, message, attributes, t); + scope.close(); } } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java deleted file mode 100644 index 9473191263e7..000000000000 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.pulsar; - -import static net.bytebuddy.matcher.ElementMatchers.isConstructor; -import static net.bytebuddy.matcher.ElementMatchers.named; - -import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; -import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; -import org.apache.pulsar.client.api.Message; -import org.apache.pulsar.client.impl.MessageImpl; -import org.apache.pulsar.client.impl.TopicMessageImpl; - -public class MessageInstrumentation implements TypeInstrumentation { - @Override - public ElementMatcher typeMatcher() { - return named("org.apache.pulsar.client.impl.MessageImpl") - .or(named("org.apache.pulsar.client.impl.TopicMessageImpl")); - } - - @Override - public void transform(TypeTransformer transformer) { - transformer.applyAdviceToMethod( - isConstructor(), MessageInstrumentation.class.getName() + "$MessageConstructorAdviser"); - } - - @SuppressWarnings("unused") - public static class MessageConstructorAdviser { - - @Advice.OnMethodExit - public static void before( - @Advice.This Message message, @Advice.AllArguments Object[] allArguments) { - VirtualField, MessageEnhanceInfo> virtualField = - VirtualField.find(Message.class, MessageEnhanceInfo.class); - - if (message instanceof MessageImpl) { - virtualField.set(message, new MessageEnhanceInfo()); - } else { - Object argument2 = allArguments[2]; - if (message instanceof TopicMessageImpl && argument2 instanceof MessageImpl) { - MessageImpl impl = (MessageImpl) argument2; - MessageEnhanceInfo info = virtualField.get(impl); - virtualField.set(message, info); - } - } - } - } -} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java index 062e4f8196da..b49ada895107 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java @@ -5,23 +5,15 @@ package io.opentelemetry.javaagent.instrumentation.pulsar; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.CONSUMER_NAME; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.MESSAGE_ID; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SUBSCRIPTION; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TOPIC; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TRACER; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; - -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.pulsar.info.MessageEnhanceInfo; +import io.opentelemetry.javaagent.instrumentation.pulsar.telemetry.PulsarTelemetry; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.implementation.bytecode.assign.Assigner; @@ -74,32 +66,22 @@ public MessageListenerWrapper(MessageListener messageListener) { @Override public void received(Consumer consumer, Message msg) { - VirtualField, MessageEnhanceInfo> virtualField = - VirtualField.find(Message.class, MessageEnhanceInfo.class); - MessageEnhanceInfo info = virtualField.get(msg); - - Context parent = info == null ? Context.current() : info.getContext(); - String topic = null == info ? consumer.getTopic() : info.getTopic(); - String mid = null == info ? "unknown" : info.getMessageId(); + Context parent = VirtualFieldStore.extract(msg); - Span span = - TRACER - .spanBuilder("MessageListener/received") - .setParent(parent) - .setSpanKind(SpanKind.CONSUMER) - .setAttribute(TOPIC, topic) - .setAttribute(MESSAGE_ID, mid) - .setAttribute(SUBSCRIPTION, consumer.getSubscription()) - .setAttribute(CONSUMER_NAME, consumer.getConsumerName()) - .startSpan(); + Instrumenter, Void> instrumenter = + PulsarTelemetry.consumerListenerInstrumenter(); + if (!instrumenter.shouldStart(parent, msg)) { + this.delegator.received(consumer, msg); + return; + } - try (Scope scope = span.makeCurrent()) { + Context current = instrumenter.start(parent, msg); + try (Scope scope = current.makeCurrent()) { this.delegator.received(consumer, msg); + instrumenter.end(current, msg, null, null); } catch (Throwable t) { - span.recordException(t); + instrumenter.end(current, msg, null, t); throw t; - } finally { - span.end(); } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index 17b25df78725..3cb4fb4732d1 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -5,37 +5,26 @@ package io.opentelemetry.javaagent.instrumentation.pulsar; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.MESSAGE_ID; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.PRODUCER_NAME; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.PROPAGATOR; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.SERVICE_URL; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TOPIC; -import static io.opentelemetry.javaagent.instrumentation.pulsar.PulsarTelemetry.TRACER; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; - -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanBuilder; -import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.pulsar.info.ClientEnhanceInfo; -import io.opentelemetry.javaagent.instrumentation.pulsar.textmap.MessageTextMapSetter; +import io.opentelemetry.javaagent.instrumentation.pulsar.telemetry.PulsarTelemetry; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.util.concurrent.CompletableFuture; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.api.MessageId; -import org.apache.pulsar.client.api.Producer; import org.apache.pulsar.client.api.PulsarClient; -import org.apache.pulsar.client.impl.MessageIdImpl; import org.apache.pulsar.client.impl.MessageImpl; import org.apache.pulsar.client.impl.ProducerImpl; import org.apache.pulsar.client.impl.PulsarClientImpl; @@ -71,11 +60,8 @@ public static void intercept( @Advice.Argument(value = 1) String topic) { PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String url = pulsarClient.getLookup().getServiceUrl(); - ClientEnhanceInfo info = new ClientEnhanceInfo(topic, url); - - VirtualField, ClientEnhanceInfo> virtualField = - VirtualField.find(Producer.class, ClientEnhanceInfo.class); - virtualField.set(producer, info); + ClientEnhanceInfo info = ClientEnhanceInfo.create(topic, url); + VirtualFieldStore.inject(producer, info); } } @@ -85,95 +71,54 @@ public static class ProducerSendAsyncMethodAdviser { @Advice.OnMethodEnter public static void before( @Advice.This ProducerImpl producer, - @Advice.Argument(value = 0) Message m, - @Advice.Argument(value = 1, readOnly = false) SendCallback callback, - @Advice.Local(value = "otelScope") Scope scope) { - VirtualField, ClientEnhanceInfo> virtualField = - VirtualField.find(Producer.class, ClientEnhanceInfo.class); - ClientEnhanceInfo info = virtualField.get(producer); - if (null == info) { - scope = null; - return; + @Advice.Argument(value = 0) Message message, + @Advice.Argument(value = 1, readOnly = false) SendCallback callback) { + Context parent = Context.current(); + ClientEnhanceInfo info = VirtualFieldStore.extract(producer); + Instrumenter, Attributes> instrumenter = PulsarTelemetry.producerInstrumenter(); + + Context current = null; + if (instrumenter.shouldStart(parent, message)) { + current = instrumenter.start(Context.current(), message); } - MessageImpl message = (MessageImpl) m; - scope = - TRACER - .spanBuilder("Producer/sendAsync") - .setParent(Context.current()) - .setSpanKind(SpanKind.PRODUCER) - .setAttribute(TOPIC, info.topic) - .setAttribute(SERVICE_URL, info.brokerUrl) - .setAttribute(PRODUCER_NAME, producer.getProducerName()) - .startSpan() - .makeCurrent(); - - Context current = Context.current(); - PROPAGATOR.inject(current, message, MessageTextMapSetter.INSTANCE); - - callback = new SendCallbackWrapper(info.topic, current, message, callback); - } - - @Advice.OnMethodExit(onThrowable = Throwable.class) - public static void after( - @Advice.Thrown Throwable t, - @Advice.This ProducerImpl producer, - @Advice.Local(value = "otelScope") Scope scope) { - if (scope != null) { - Span span = Span.current(); - if (null != t) { - span.recordException(t); - } - - span.end(); - scope.close(); - } + callback = new SendCallbackWrapper(current, message, callback, info); } } public static class SendCallbackWrapper implements SendCallback { private static final long serialVersionUID = 1L; - private final String topic; private final Context context; - private final MessageImpl message; + private final Message message; private final SendCallback delegator; + private final ClientEnhanceInfo info; - public SendCallbackWrapper( - String topic, Context context, MessageImpl message, SendCallback callback) { - this.topic = topic; + public SendCallbackWrapper(Context context, Message message, SendCallback callback, + ClientEnhanceInfo info) { this.context = context; this.message = message; this.delegator = callback; + this.info = info; } @Override public void sendComplete(Exception e) { - SpanBuilder builder = - TRACER - .spanBuilder("Producer/Callback") - .setParent(this.context) - .setSpanKind(SpanKind.PRODUCER) - .setAttribute(TOPIC, topic); - - // set message id - if (e == null - && null != message.getMessageId() - && message.getMessageId() instanceof MessageIdImpl) { - MessageIdImpl messageId = (MessageIdImpl) message.getMessageId(); - String midStr = messageId.getLedgerId() + ":" + messageId.getEntryId(); - builder.setAttribute(MESSAGE_ID, midStr); + if (null == context) { + this.delegator.sendComplete(e); + return; } - Span span = builder.startSpan(); + Instrumenter, Attributes> instrumenter = PulsarTelemetry.producerInstrumenter(); + Attributes attributes = Attributes.empty(); + if (null != info) { + attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, info.brokerURL); + } - try (Scope ignore = span.makeCurrent()) { + try (Scope ignore = context.makeCurrent()) { this.delegator.sendComplete(e); - } catch (Throwable t) { - span.recordException(t); - throw t; } finally { - span.end(); + instrumenter.end(context, message, attributes, e); } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java index 1ce783facf1f..6b16f61f5cc9 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java @@ -21,7 +21,6 @@ public PulsarInstrumentationModule() { public List typeInstrumentations() { List instrumentations = new ArrayList<>(4); instrumentations.add(new ConsumerImplInstrumentation()); - instrumentations.add(new MessageInstrumentation()); instrumentations.add(new ProducerImplInstrumentation()); instrumentations.add(new MessageListenerInstrumentation()); return instrumentations; diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java deleted file mode 100644 index 9732030c3d23..000000000000 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarTelemetry.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.pulsar; - -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.api.common.AttributeKey; -import io.opentelemetry.api.trace.Tracer; -import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; - -public final class PulsarTelemetry { - - private static final String INSTRUMENTATION = "io.opentelemetry:pulsar-client"; - - public static final AttributeKey TOPIC = SemanticAttributes.MESSAGING_DESTINATION; - - public static final AttributeKey SERVICE_URL = SemanticAttributes.MESSAGING_URL; - - public static final AttributeKey SUBSCRIPTION = - AttributeKey.stringKey("messaging_pulsar_subscription"); - - public static final AttributeKey PRODUCER_NAME = - AttributeKey.stringKey("messaging_pulsar_producer_name"); - - public static final AttributeKey CONSUMER_NAME = - AttributeKey.stringKey("messaging_pulsar_consumer_name"); - - public static final AttributeKey MESSAGE_ID = SemanticAttributes.MESSAGING_MESSAGE_ID; - - public static final Tracer TRACER = GlobalOpenTelemetry.getTracer(INSTRUMENTATION); - - public static final TextMapPropagator PROPAGATOR = - GlobalOpenTelemetry.getPropagators().getTextMapPropagator(); - - private PulsarTelemetry() {} -} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java new file mode 100644 index 000000000000..1082489bc04b --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java @@ -0,0 +1,50 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar; + +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.util.VirtualField; +import org.apache.pulsar.client.api.Consumer; +import org.apache.pulsar.client.api.Message; +import org.apache.pulsar.client.api.Producer; + +class VirtualFieldStore { + private static final VirtualField, Context> MSG_FIELD = + VirtualField.find(Message.class, Context.class); + private static final VirtualField, ClientEnhanceInfo> PRODUCER_FIELD = + VirtualField.find(Producer.class, ClientEnhanceInfo.class); + private static final VirtualField, ClientEnhanceInfo> CONSUMER_FIELD = + VirtualField.find(Consumer.class, ClientEnhanceInfo.class); + + private VirtualFieldStore() {} + + + static void inject(Message instance, Context context) { + MSG_FIELD.set(instance, context); + } + + static Context extract(Message instance) { + Context ctx = MSG_FIELD.get(instance); + return ctx == null ? Context.current() : ctx; + } + + static void inject(Producer instance, ClientEnhanceInfo info) { + PRODUCER_FIELD.set(instance, info); + } + + static ClientEnhanceInfo extract(Producer instance) { + return PRODUCER_FIELD.get(instance); + } + + static void inject(Consumer instance, ClientEnhanceInfo info) { + CONSUMER_FIELD.set(instance, info); + } + + static ClientEnhanceInfo extract(Consumer instance) { + return CONSUMER_FIELD.get(instance); + } + +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java deleted file mode 100644 index 4ea57f242928..000000000000 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/ClientEnhanceInfo.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.pulsar.info; - -/** - * for producer and consumer, cache service_url and determine whether the instance has been - * enhanced. - */ -public class ClientEnhanceInfo { - - public final String topic; - public final String brokerUrl; - - public ClientEnhanceInfo(String topic, String brokerUrl) { - this.topic = topic; - this.brokerUrl = brokerUrl; - } -} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java deleted file mode 100644 index 54bc8924132a..000000000000 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/info/MessageEnhanceInfo.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.pulsar.info; - -import io.opentelemetry.context.Context; -import org.apache.pulsar.client.api.MessageId; -import org.apache.pulsar.client.impl.MessageIdImpl; - -public class MessageEnhanceInfo { - - private String topic; - private String messageId; - private Context context; - - public MessageEnhanceInfo() {} - - public Context getContext() { - return context; - } - - public String getTopic() { - return topic; - } - - public String getMessageId() { - return messageId; - } - - public void setFields(Context context, String topic, MessageId messageId) { - this.context = context; - this.topic = topic; - if (messageId instanceof MessageIdImpl) { - MessageIdImpl impl = (MessageIdImpl) messageId; - this.messageId = impl.getLedgerId() + ":" + impl.getEntryId(); - } else { - this.messageId = "unknown"; - } - } -} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java new file mode 100644 index 000000000000..909f4b31173a --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java @@ -0,0 +1,87 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; + +import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import org.apache.pulsar.client.api.Message; +import javax.annotation.Nullable; + +class ConsumerListenerAttributeGetter + implements MessagingAttributesGetter, Void> { + public static final ConsumerListenerAttributeGetter INSTANCE = + new ConsumerListenerAttributeGetter(); + + @Nullable + @Override + public String system(Message message) { + return "pulsar"; + } + + @Nullable + @Override + public String destinationKind(Message message) { + return SemanticAttributes.MessagingDestinationKindValues.TOPIC; + } + + @Nullable + @Override + public String destination(Message message) { + return null; + } + + @Override + public boolean temporaryDestination(Message message) { + return false; + } + + @Nullable + @Override + public String protocol(Message message) { + return null; + } + + @Nullable + @Override + public String protocolVersion(Message message) { + return null; + } + + @Nullable + @Override + public String url(Message message) { + return null; + } + + @Nullable + @Override + public String conversationId(Message message) { + return null; + } + + @Nullable + @Override + public Long messagePayloadSize(Message message) { + return null; + } + + @Nullable + @Override + public Long messagePayloadCompressedSize(Message message) { + return null; + } + + @Nullable + @Override + public String messageId(Message message, @Nullable Void unused) { + String messageId0 = null; + if (null != message && null != message.getMessageId()) { + messageId0 = message.getMessageId().toString(); + } + + return messageId0; + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java new file mode 100644 index 000000000000..02fe6eb66d58 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import org.apache.pulsar.client.api.Message; +import javax.annotation.Nullable; + +class ConsumerReceiveAttributeExtractor + implements AttributesExtractor, Attributes> { + public static final ConsumerReceiveAttributeExtractor INSTANCE = + new ConsumerReceiveAttributeExtractor(); + + private ConsumerReceiveAttributeExtractor() {} + + @Override + public void onStart(AttributesBuilder attributes, Context parentContext, Message message) { + + } + + @Override + public void onEnd(AttributesBuilder attributesBuilder, Context context, Message message, + @Nullable Attributes attributes, @Nullable Throwable error) { + if (null != attributes) { + attributesBuilder.putAll(attributes); + } + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java new file mode 100644 index 000000000000..047a36a3b603 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java @@ -0,0 +1,94 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import org.apache.pulsar.client.api.Message; +import javax.annotation.Nullable; + +class ConsumerReceiveAttributeGetter + implements MessagingAttributesGetter, Attributes> { + public static final ConsumerReceiveAttributeGetter INSTANCE = + new ConsumerReceiveAttributeGetter(); + + private ConsumerReceiveAttributeGetter() {} + + @Nullable + @Override + public String system(Message message) { + return "pulsar"; + } + + @Nullable + @Override + public String destinationKind(Message message) { + return SemanticAttributes.MessagingDestinationKindValues.TOPIC; + } + + @Nullable + @Override + public String destination(Message message) { + return null; + } + + @Override + public boolean temporaryDestination(Message message) { + return false; + } + + @Nullable + @Override + public String protocol(Message message) { + return null; + } + + @Nullable + @Override + public String protocolVersion(Message message) { + return null; + } + + @Nullable + @Override + public String url(Message message) { + return null; + } + + @Nullable + @Override + public String conversationId(Message message) { + return null; + } + + @Nullable + @Override + public Long messagePayloadSize(Message message) { + if (message != null) { + return (long) message.size(); + } + + return null; + } + + @Nullable + @Override + public Long messagePayloadCompressedSize(Message message) { + return null; + } + + @Nullable + @Override + public String messageId(Message message, @Nullable Attributes attributes) { + String messageId0 = null; + if (null != message && null != message.getMessageId()) { + messageId0 = message.getMessageId().toString(); + } + + return messageId0; + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java similarity index 50% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapGetter.java rename to instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java index 3f8044b6d072..c2fbc71ccfa2 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapGetter.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java @@ -3,23 +3,24 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar.textmap; +package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; import io.opentelemetry.context.propagation.TextMapGetter; import javax.annotation.Nullable; +import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.impl.MessageImpl; -public final class MessageTextMapGetter implements TextMapGetter> { - public static final TextMapGetter> INSTANCE = new MessageTextMapGetter(); +class MessageTextMapGetter implements TextMapGetter> { + public static final TextMapGetter> INSTANCE = new MessageTextMapGetter(); @Override - public Iterable keys(MessageImpl message) { + public Iterable keys(Message message) { return message.getProperties().keySet(); } @Nullable @Override - public String get(@Nullable MessageImpl message, String key) { + public String get(@Nullable Message message, String key) { return null == message ? null : message.getProperties().get(key); } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapSetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapSetter.java new file mode 100644 index 000000000000..61386fba7832 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapSetter.java @@ -0,0 +1,23 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; + +import io.opentelemetry.context.propagation.TextMapSetter; +import javax.annotation.Nullable; +import org.apache.pulsar.client.api.Message; +import org.apache.pulsar.client.impl.MessageImpl; + +class MessageTextMapSetter implements TextMapSetter> { + public static final TextMapSetter> INSTANCE = new MessageTextMapSetter(); + + @Override + public void set(@Nullable Message carrier, String key, String value) { + if (carrier instanceof MessageImpl) { + MessageImpl message = (MessageImpl) carrier; + message.getMessageBuilder().addProperty().setKey(key).setValue(value); + } + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java new file mode 100644 index 000000000000..3c7e58694467 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java @@ -0,0 +1,61 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import org.apache.pulsar.client.api.Message; +import org.apache.pulsar.client.impl.MessageImpl; +import org.apache.pulsar.common.api.proto.MessageMetadata; +import javax.annotation.Nullable; + +class ProducerAttributeExtractor + implements AttributesExtractor, Attributes> { + public static final ProducerAttributeExtractor INSTANCE = + new ProducerAttributeExtractor(); + + private ProducerAttributeExtractor() {} + + @Override + public void onStart(AttributesBuilder attributes, Context parentContext, Message message) { + } + + @Override + public void onEnd(AttributesBuilder attributesBuilder, Context context, Message message, + @Nullable Attributes attributes, @Nullable Throwable error) { + if (null != attributes) { + attributesBuilder.putAll(attributes); + } + + if (message instanceof MessageImpl) { + MessageType type = MessageType.NORMAL; + MessageImpl impl = (MessageImpl) message; + MessageMetadata metadata = impl.getMessageBuilder(); + if (metadata.hasTxnidMostBits() || metadata.hasTxnidLeastBits()) { + type = MessageType.TXN; + } else if (metadata.hasDeliverAtTime()) { + type = MessageType.DELAY; + } else if (metadata.hasOrderingKey()) { + type = MessageType.ORDER; + } else if (metadata.hasChunkId()) { + type = MessageType.CHUNK; + } + + attributesBuilder.put(SemanticAttributes.MESSAGE_TYPE, type.name()); + } + } + + enum MessageType { + NORMAL, + DELAY, + TXN, + ORDER, + CHUNK + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java new file mode 100644 index 000000000000..3c98fd8b8d01 --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java @@ -0,0 +1,92 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import org.apache.pulsar.client.api.Message; +import javax.annotation.Nullable; + +class ProducerAttributeGetter + implements MessagingAttributesGetter, Attributes> { + public static final ProducerAttributeGetter INSTANCE = + new ProducerAttributeGetter(); + + @Nullable + @Override + public String system(Message message) { + return "pulsar"; + } + + @Nullable + @Override + public String destinationKind(Message message) { + return SemanticAttributes.MessagingDestinationKindValues.TOPIC; + } + + @Nullable + @Override + public String destination(Message message) { + return message.getTopicName(); + } + + @Override + public boolean temporaryDestination(Message message) { + return false; + } + + @Nullable + @Override + public String protocol(Message message) { + return null; + } + + @Nullable + @Override + public String protocolVersion(Message message) { + return null; + } + + @Nullable + @Override + public String url(Message message) { + return null; + } + + @Nullable + @Override + public String conversationId(Message message) { + return null; + } + + @Nullable + @Override + public Long messagePayloadSize(Message message) { + if (null != message) { + return (long) message.size(); + } + + return null; + } + + @Nullable + @Override + public Long messagePayloadCompressedSize(Message message) { + return null; + } + + @Nullable + @Override + public String messageId(Message message, @Nullable Attributes attributes) { + String messageId0 = null; + if (null != message && null != message.getMessageId()) { + messageId0 = message.getMessageId().toString(); + } + + return messageId0; + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java new file mode 100644 index 000000000000..b334cdb48ade --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java @@ -0,0 +1,109 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; + +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessageOperation; +import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesExtractor; +import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; +import org.apache.pulsar.client.api.Message; + +public final class PulsarTelemetry { + private static final String INSTRUMENTATION = "io.opentelemetry:pulsar-client"; + private static final OpenTelemetry TELEMETRY = GlobalOpenTelemetry.get(); + + private static final SpanNameExtractor> CONSUMER_RECEIVE = + new InternalSpanNameExtractor<>(SpanKind.CONSUMER, MessageOperation.RECEIVE); + private static final SpanNameExtractor> CONSUMER_PROCESS = + new InternalSpanNameExtractor<>(SpanKind.CONSUMER, MessageOperation.PROCESS); + private static final SpanNameExtractor> PRODUCER_SEND = + new InternalSpanNameExtractor<>(SpanKind.PRODUCER, MessageOperation.SEND); + + private static final Instrumenter, Void> CONSUMER_LISTENER_INSTRUMENTER = + createConsumerListenerInstrumenter(); + private static final Instrumenter, Attributes> CONSUMER_RECEIVE_INSTRUMENTER = + createConsumerReceiveInstrumenter(); + private static final Instrumenter, Attributes> PRODUER_INSTRUMENTER = + createProducerInstrumenter(); + + + public static Instrumenter, Void> consumerListenerInstrumenter() { + return CONSUMER_LISTENER_INSTRUMENTER; + } + + public static Instrumenter, Attributes> consumerReceiveInstrumenter() { + return CONSUMER_RECEIVE_INSTRUMENTER; + } + + public static Instrumenter, Attributes> producerInstrumenter() { + return PRODUER_INSTRUMENTER; + } + + + private static Instrumenter, Attributes> createConsumerReceiveInstrumenter() { + MessagingAttributesGetter, Attributes> getter = + ConsumerReceiveAttributeGetter.INSTANCE; + AttributesExtractor, Attributes> extractor = + ConsumerReceiveAttributeExtractor.INSTANCE; + + return Instrumenter., Attributes>builder(TELEMETRY, + INSTRUMENTATION, + CONSUMER_RECEIVE) + .addAttributesExtractor(extractor) + .addAttributesExtractor( + MessagingAttributesExtractor.create(getter, MessageOperation.RECEIVE) + ) + .buildConsumerInstrumenter(MessageTextMapGetter.INSTANCE); + } + + private static Instrumenter, Void> createConsumerListenerInstrumenter() { + MessagingAttributesGetter, Void> getter = + ConsumerListenerAttributeGetter.INSTANCE; + + return Instrumenter., Void>builder(TELEMETRY, + INSTRUMENTATION, + CONSUMER_PROCESS) + .addAttributesExtractor( + MessagingAttributesExtractor.create(getter, MessageOperation.PROCESS) + ) + .buildInstrumenter(); + } + + private static Instrumenter, Attributes> createProducerInstrumenter() { + MessagingAttributesGetter, Attributes> getter = ProducerAttributeGetter.INSTANCE; + AttributesExtractor, Attributes> extractor = ProducerAttributeExtractor.INSTANCE; + + return Instrumenter., Attributes>builder(TELEMETRY, + INSTRUMENTATION, + PRODUCER_SEND) + .addAttributesExtractor(extractor) + .addAttributesExtractor( + MessagingAttributesExtractor.create(getter, MessageOperation.SEND) + ) + .buildProducerInstrumenter(MessageTextMapSetter.INSTANCE); + } + + private PulsarTelemetry() {} + + static class InternalSpanNameExtractor implements SpanNameExtractor { + private final String name; + + private InternalSpanNameExtractor(SpanKind kind, MessageOperation operation) { + this.name = kind.name() + "/" + operation.name(); + } + + @Override + public String extract(T unused) { + return this.name; + } + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapSetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapSetter.java deleted file mode 100644 index b6d972191259..000000000000 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/textmap/MessageTextMapSetter.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.pulsar.textmap; - -import io.opentelemetry.context.propagation.TextMapSetter; -import javax.annotation.Nullable; -import org.apache.pulsar.client.impl.MessageImpl; - -public final class MessageTextMapSetter implements TextMapSetter> { - public static final TextMapSetter> INSTANCE = new MessageTextMapSetter(); - - @Override - public void set(@Nullable MessageImpl carrier, String key, String value) { - if (carrier != null) { - carrier.getMessageBuilder().addProperty().setKey(key).setValue(value); - } - } -} diff --git a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy index 70451c817671..f6631755a010 100644 --- a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy @@ -62,16 +62,10 @@ class PulsarClientTest extends AgentInstrumentationSpecification { } span(1) { - name("Producer/sendAsync") + name("PRODUCER/SEND") kind(PRODUCER) childOf span(0) } - - span(2) { - name("Producer/Callback") - kind(PRODUCER) - childOf(span(0)) - } } } } @@ -105,25 +99,19 @@ class PulsarClientTest extends AgentInstrumentationSpecification { } span(1) { - name("Producer/sendAsync") + name("PRODUCER/SEND") kind(PRODUCER) childOf span(0) } span(2) { - name("Producer/Callback") - kind(PRODUCER) - childOf(span(0)) - } - - span(3) { - name("ConsumerImpl/messageProcessed") + name("CONSUMER/RECEIVE") kind(CONSUMER) childOf span(1) } - span(4) { - name("MessageListener/received") + span(3) { + name("CONSUMER/PROCESS") kind(CONSUMER) childOf(span(1)) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 8224061ec338..bedff1288076 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -146,6 +146,7 @@ hideFromDependabot(":instrumentation:apache-httpclient:apache-httpclient-4.0:jav hideFromDependabot(":instrumentation:apache-httpclient:apache-httpclient-4.3:library") hideFromDependabot(":instrumentation:apache-httpclient:apache-httpclient-4.3:testing") hideFromDependabot(":instrumentation:apache-httpclient:apache-httpclient-5.0:javaagent") +hideFromDependabot(":instrumentation:apache-pulsar:javaagent") hideFromDependabot(":instrumentation:armeria-1.3:javaagent") hideFromDependabot(":instrumentation:armeria-1.3:library") hideFromDependabot(":instrumentation:armeria-1.3:testing") @@ -482,9 +483,6 @@ hideFromDependabot(":instrumentation:vibur-dbcp-11.0:library") hideFromDependabot(":instrumentation:vibur-dbcp-11.0:testing") hideFromDependabot(":instrumentation:wicket-8.0:javaagent") -//apache pulsar -include(":instrumentation:apache-pulsar:javaagent") - // benchmark include(":benchmark-overhead-jmh") include(":benchmark-jfr-analyzer") From 6755ae69f15a70476c070518f807bd1c7fb0ecaf Mon Sep 17 00:00:00 2001 From: daojun Date: Sat, 3 Dec 2022 04:07:51 +0800 Subject: [PATCH 17/48] Fix tests --- .../instrumentation/pulsar/PulsarClientTest.groovy | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy index f6631755a010..c77de1383d96 100644 --- a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy @@ -1,6 +1,5 @@ package io.opentelemetry.javaagent.instrumentation.pulsar -import io.opentelemetry.api.trace.SpanKind import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification import org.apache.pulsar.client.api.Consumer import org.apache.pulsar.client.api.Message @@ -15,6 +14,7 @@ import java.nio.charset.Charset import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit import static io.opentelemetry.api.trace.SpanKind.CONSUMER +import static io.opentelemetry.api.trace.SpanKind.INTERNAL import static io.opentelemetry.api.trace.SpanKind.PRODUCER class PulsarClientTest extends AgentInstrumentationSpecification { @@ -57,7 +57,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { trace(0, 3) { span(0) { name("parent") - kind(SpanKind.INTERNAL) + kind(INTERNAL) hasNoParent() } @@ -94,7 +94,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { trace(0, 3) { span(0) { name("parent") - kind(SpanKind.INTERNAL) + kind(INTERNAL) hasNoParent() } @@ -112,8 +112,8 @@ class PulsarClientTest extends AgentInstrumentationSpecification { span(3) { name("CONSUMER/PROCESS") - kind(CONSUMER) - childOf(span(1)) + kind(INTERNAL) + childOf(span(2)) } } } From 2f5ab6f2f906b220076733fe693fde03f7b4fa97 Mon Sep 17 00:00:00 2001 From: daojun Date: Sat, 3 Dec 2022 04:19:03 +0800 Subject: [PATCH 18/48] Fix checkstyle --- .../pulsar/ConsumerImplInstrumentation.java | 8 ++++-- .../MessageListenerInstrumentation.java | 4 +-- .../pulsar/ProducerImplInstrumentation.java | 7 +++-- .../pulsar/VirtualFieldStore.java | 2 -- .../ConsumerListenerAttributeGetter.java | 5 ++-- .../ConsumerReceiveAttributeExtractor.java | 17 +++++------ .../ConsumerReceiveAttributeGetter.java | 5 ++-- .../telemetry/MessageTextMapGetter.java | 1 - .../telemetry/ProducerAttributeExtractor.java | 19 +++++++------ .../telemetry/ProducerAttributeGetter.java | 8 ++---- .../pulsar/telemetry/PulsarTelemetry.java | 28 ++++++------------- 11 files changed, 45 insertions(+), 59 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index ba6fe2a4f044..6a4f243e0891 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -10,6 +10,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isProtected; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + import io.opentelemetry.api.common.Attributes; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; @@ -93,9 +94,10 @@ public static void after( ClientEnhanceInfo cinfo = VirtualFieldStore.extract(consumer); String topic = null == cinfo ? ClientEnhanceInfo.DEFAULT_TOPIC : cinfo.topic; String brokerURL = null == cinfo ? ClientEnhanceInfo.DEFAULT_BROKER_URL : cinfo.brokerURL; - Attributes attributes = Attributes.of( - SemanticAttributes.MESSAGING_URL, brokerURL, - SemanticAttributes.MESSAGING_DESTINATION, topic); + Attributes attributes = + Attributes.of( + SemanticAttributes.MESSAGING_URL, brokerURL, + SemanticAttributes.MESSAGING_DESTINATION, topic); Context current = Context.current(); VirtualFieldStore.inject(message, current); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java index b49ada895107..09ff8e5e7686 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java @@ -8,6 +8,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; + import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; @@ -68,8 +69,7 @@ public MessageListenerWrapper(MessageListener messageListener) { public void received(Consumer consumer, Message msg) { Context parent = VirtualFieldStore.extract(msg); - Instrumenter, Void> instrumenter = - PulsarTelemetry.consumerListenerInstrumenter(); + Instrumenter, Void> instrumenter = PulsarTelemetry.consumerListenerInstrumenter(); if (!instrumenter.shouldStart(parent, msg)) { this.delegator.received(consumer, msg); return; diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index 3cb4fb4732d1..dd089ed83b99 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -10,6 +10,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + import io.opentelemetry.api.common.Attributes; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; @@ -94,8 +95,8 @@ public static class SendCallbackWrapper implements SendCallback { private final SendCallback delegator; private final ClientEnhanceInfo info; - public SendCallbackWrapper(Context context, Message message, SendCallback callback, - ClientEnhanceInfo info) { + public SendCallbackWrapper( + Context context, Message message, SendCallback callback, ClientEnhanceInfo info) { this.context = context; this.message = message; this.delegator = callback; @@ -110,7 +111,7 @@ public void sendComplete(Exception e) { } Instrumenter, Attributes> instrumenter = PulsarTelemetry.producerInstrumenter(); - Attributes attributes = Attributes.empty(); + Attributes attributes = Attributes.empty(); if (null != info) { attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, info.brokerURL); } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java index 1082489bc04b..e5cbb390ef8e 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java @@ -21,7 +21,6 @@ class VirtualFieldStore { private VirtualFieldStore() {} - static void inject(Message instance, Context context) { MSG_FIELD.set(instance, context); } @@ -46,5 +45,4 @@ static void inject(Consumer instance, ClientEnhanceInfo info) { static ClientEnhanceInfo extract(Consumer instance) { return CONSUMER_FIELD.get(instance); } - } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java index 909f4b31173a..c015c86f6a50 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java @@ -7,11 +7,10 @@ import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -import org.apache.pulsar.client.api.Message; import javax.annotation.Nullable; +import org.apache.pulsar.client.api.Message; -class ConsumerListenerAttributeGetter - implements MessagingAttributesGetter, Void> { +class ConsumerListenerAttributeGetter implements MessagingAttributesGetter, Void> { public static final ConsumerListenerAttributeGetter INSTANCE = new ConsumerListenerAttributeGetter(); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java index 02fe6eb66d58..a024c302865a 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java @@ -9,24 +9,25 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import org.apache.pulsar.client.api.Message; import javax.annotation.Nullable; +import org.apache.pulsar.client.api.Message; -class ConsumerReceiveAttributeExtractor - implements AttributesExtractor, Attributes> { +class ConsumerReceiveAttributeExtractor implements AttributesExtractor, Attributes> { public static final ConsumerReceiveAttributeExtractor INSTANCE = new ConsumerReceiveAttributeExtractor(); private ConsumerReceiveAttributeExtractor() {} @Override - public void onStart(AttributesBuilder attributes, Context parentContext, Message message) { - - } + public void onStart(AttributesBuilder attributes, Context parentContext, Message message) {} @Override - public void onEnd(AttributesBuilder attributesBuilder, Context context, Message message, - @Nullable Attributes attributes, @Nullable Throwable error) { + public void onEnd( + AttributesBuilder attributesBuilder, + Context context, + Message message, + @Nullable Attributes attributes, + @Nullable Throwable error) { if (null != attributes) { attributesBuilder.putAll(attributes); } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java index 047a36a3b603..5a6b9a81deb7 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java @@ -8,11 +8,10 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -import org.apache.pulsar.client.api.Message; import javax.annotation.Nullable; +import org.apache.pulsar.client.api.Message; -class ConsumerReceiveAttributeGetter - implements MessagingAttributesGetter, Attributes> { +class ConsumerReceiveAttributeGetter implements MessagingAttributesGetter, Attributes> { public static final ConsumerReceiveAttributeGetter INSTANCE = new ConsumerReceiveAttributeGetter(); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java index c2fbc71ccfa2..00fc20dcd622 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java @@ -8,7 +8,6 @@ import io.opentelemetry.context.propagation.TextMapGetter; import javax.annotation.Nullable; import org.apache.pulsar.client.api.Message; -import org.apache.pulsar.client.impl.MessageImpl; class MessageTextMapGetter implements TextMapGetter> { public static final TextMapGetter> INSTANCE = new MessageTextMapGetter(); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java index 3c7e58694467..747da724420c 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java @@ -10,25 +10,26 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import javax.annotation.Nullable; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.impl.MessageImpl; import org.apache.pulsar.common.api.proto.MessageMetadata; -import javax.annotation.Nullable; -class ProducerAttributeExtractor - implements AttributesExtractor, Attributes> { - public static final ProducerAttributeExtractor INSTANCE = - new ProducerAttributeExtractor(); +class ProducerAttributeExtractor implements AttributesExtractor, Attributes> { + public static final ProducerAttributeExtractor INSTANCE = new ProducerAttributeExtractor(); private ProducerAttributeExtractor() {} @Override - public void onStart(AttributesBuilder attributes, Context parentContext, Message message) { - } + public void onStart(AttributesBuilder attributes, Context parentContext, Message message) {} @Override - public void onEnd(AttributesBuilder attributesBuilder, Context context, Message message, - @Nullable Attributes attributes, @Nullable Throwable error) { + public void onEnd( + AttributesBuilder attributesBuilder, + Context context, + Message message, + @Nullable Attributes attributes, + @Nullable Throwable error) { if (null != attributes) { attributesBuilder.putAll(attributes); } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java index 3c98fd8b8d01..6ba2cc62afae 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java @@ -8,13 +8,11 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -import org.apache.pulsar.client.api.Message; import javax.annotation.Nullable; +import org.apache.pulsar.client.api.Message; -class ProducerAttributeGetter - implements MessagingAttributesGetter, Attributes> { - public static final ProducerAttributeGetter INSTANCE = - new ProducerAttributeGetter(); +class ProducerAttributeGetter implements MessagingAttributesGetter, Attributes> { + public static final ProducerAttributeGetter INSTANCE = new ProducerAttributeGetter(); @Nullable @Override diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java index b334cdb48ade..b9387822fff9 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java @@ -35,7 +35,6 @@ public final class PulsarTelemetry { private static final Instrumenter, Attributes> PRODUER_INSTRUMENTER = createProducerInstrumenter(); - public static Instrumenter, Void> consumerListenerInstrumenter() { return CONSUMER_LISTENER_INSTRUMENTER; } @@ -48,33 +47,26 @@ public static Instrumenter, Attributes> producerInstrumenter() { return PRODUER_INSTRUMENTER; } - private static Instrumenter, Attributes> createConsumerReceiveInstrumenter() { MessagingAttributesGetter, Attributes> getter = ConsumerReceiveAttributeGetter.INSTANCE; AttributesExtractor, Attributes> extractor = ConsumerReceiveAttributeExtractor.INSTANCE; - return Instrumenter., Attributes>builder(TELEMETRY, - INSTRUMENTATION, - CONSUMER_RECEIVE) + return Instrumenter., Attributes>builder( + TELEMETRY, INSTRUMENTATION, CONSUMER_RECEIVE) .addAttributesExtractor(extractor) .addAttributesExtractor( - MessagingAttributesExtractor.create(getter, MessageOperation.RECEIVE) - ) + MessagingAttributesExtractor.create(getter, MessageOperation.RECEIVE)) .buildConsumerInstrumenter(MessageTextMapGetter.INSTANCE); } private static Instrumenter, Void> createConsumerListenerInstrumenter() { - MessagingAttributesGetter, Void> getter = - ConsumerListenerAttributeGetter.INSTANCE; + MessagingAttributesGetter, Void> getter = ConsumerListenerAttributeGetter.INSTANCE; - return Instrumenter., Void>builder(TELEMETRY, - INSTRUMENTATION, - CONSUMER_PROCESS) + return Instrumenter., Void>builder(TELEMETRY, INSTRUMENTATION, CONSUMER_PROCESS) .addAttributesExtractor( - MessagingAttributesExtractor.create(getter, MessageOperation.PROCESS) - ) + MessagingAttributesExtractor.create(getter, MessageOperation.PROCESS)) .buildInstrumenter(); } @@ -82,13 +74,9 @@ private static Instrumenter, Attributes> createProducerInstrumenter() MessagingAttributesGetter, Attributes> getter = ProducerAttributeGetter.INSTANCE; AttributesExtractor, Attributes> extractor = ProducerAttributeExtractor.INSTANCE; - return Instrumenter., Attributes>builder(TELEMETRY, - INSTRUMENTATION, - PRODUCER_SEND) + return Instrumenter., Attributes>builder(TELEMETRY, INSTRUMENTATION, PRODUCER_SEND) .addAttributesExtractor(extractor) - .addAttributesExtractor( - MessagingAttributesExtractor.create(getter, MessageOperation.SEND) - ) + .addAttributesExtractor(MessagingAttributesExtractor.create(getter, MessageOperation.SEND)) .buildProducerInstrumenter(MessageTextMapSetter.INSTANCE); } From a7f3da761fa7d35840517be17c716fb270b7d6be Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 4 Dec 2022 02:01:58 +0800 Subject: [PATCH 19/48] Fix checkstyle --- .../instrumentation/pulsar/ConsumerImplInstrumentation.java | 2 ++ .../instrumentation/pulsar/MessageListenerInstrumentation.java | 1 + .../instrumentation/pulsar/ProducerImplInstrumentation.java | 2 ++ 3 files changed, 5 insertions(+) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index 6a4f243e0891..4203ded39f06 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -50,6 +50,7 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class ConsumerImplConstructorAdviser { + private ConsumerImplConstructorAdviser() {} @Advice.OnMethodExit(suppress = Throwable.class) public static void after( @@ -66,6 +67,7 @@ public static void after( @SuppressWarnings("unused") public static class ConsumerImplMethodAdviser { + private ConsumerImplMethodAdviser() {} @Advice.OnMethodEnter public static void before( diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java index 09ff8e5e7686..7e70e074a6f2 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java @@ -42,6 +42,7 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class ConsumerConfigurationDataMethodAdviser { + private ConsumerConfigurationDataMethodAdviser() {} @Advice.OnMethodExit public static void after( diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index dd089ed83b99..bc5d0abc4b33 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -53,6 +53,7 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class ProducerImplConstructorAdviser { + private ProducerImplConstructorAdviser() {} @Advice.OnMethodExit public static void intercept( @@ -68,6 +69,7 @@ public static void intercept( @SuppressWarnings("unused") public static class ProducerSendAsyncMethodAdviser { + private ProducerSendAsyncMethodAdviser() {} @Advice.OnMethodEnter public static void before( From 1f6faed022ba52dc2fc7046f05d7ae3dff810cf7 Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 4 Dec 2022 02:25:56 +0800 Subject: [PATCH 20/48] Fix checkstyle --- .../pulsar/VirtualFieldStore.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java index e5cbb390ef8e..9e5c236ee3e9 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java @@ -25,23 +25,23 @@ static void inject(Message instance, Context context) { MSG_FIELD.set(instance, context); } + static void inject(Producer instance, ClientEnhanceInfo info) { + PRODUCER_FIELD.set(instance, info); + } + + static void inject(Consumer instance, ClientEnhanceInfo info) { + CONSUMER_FIELD.set(instance, info); + } + static Context extract(Message instance) { Context ctx = MSG_FIELD.get(instance); return ctx == null ? Context.current() : ctx; } - static void inject(Producer instance, ClientEnhanceInfo info) { - PRODUCER_FIELD.set(instance, info); - } - static ClientEnhanceInfo extract(Producer instance) { return PRODUCER_FIELD.get(instance); } - static void inject(Consumer instance, ClientEnhanceInfo info) { - CONSUMER_FIELD.set(instance, info); - } - static ClientEnhanceInfo extract(Consumer instance) { return CONSUMER_FIELD.get(instance); } From a2fe9a30634abd0a570a300f4fb5fc1aa415b437 Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 4 Dec 2022 03:39:39 +0800 Subject: [PATCH 21/48] Fix checkstyle --- .../pulsar/ClientEnhanceInfo.java | 6 ++++-- .../pulsar/PulsarClientTest.groovy | 19 ++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java index f38db79e7eab..fffc170311e4 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java @@ -5,8 +5,6 @@ package io.opentelemetry.javaagent.instrumentation.pulsar; -import com.google.common.base.Strings; - /** * for producer and consumer, cache service_url and determine whether the instance has been * enhanced. @@ -26,4 +24,8 @@ private ClientEnhanceInfo(String topic, String brokerURL) { public static ClientEnhanceInfo create(String topic, String brokerURL) { return new ClientEnhanceInfo(topic, brokerURL); } + + private static boolean isNullOrEmpty(String s) { + return s == null || s.isEmpty(); + } } diff --git a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy index c77de1383d96..9aeff410206e 100644 --- a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy @@ -1,6 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.javaagent.instrumentation.pulsar +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 io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification +import java.nio.charset.Charset +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit import org.apache.pulsar.client.api.Consumer import org.apache.pulsar.client.api.Message import org.apache.pulsar.client.api.MessageListener @@ -10,13 +22,6 @@ import org.apache.pulsar.client.api.Schema import org.testcontainers.containers.PulsarContainer import org.testcontainers.utility.DockerImageName -import java.nio.charset.Charset -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit -import static io.opentelemetry.api.trace.SpanKind.CONSUMER -import static io.opentelemetry.api.trace.SpanKind.INTERNAL -import static io.opentelemetry.api.trace.SpanKind.PRODUCER - class PulsarClientTest extends AgentInstrumentationSpecification { private static final DockerImageName DEFAULT_IMAGE_NAME = From b87b21a4ab98864154881ff0b39d3e1a6e0a5f8d Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 4 Dec 2022 04:42:03 +0800 Subject: [PATCH 22/48] Fix checkstyle --- .../instrumentation/pulsar/ClientEnhanceInfo.java | 12 ++++++------ .../pulsar/ConsumerImplInstrumentation.java | 4 ++-- .../pulsar/ProducerImplInstrumentation.java | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java index fffc170311e4..0f084a0638dd 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java @@ -14,15 +14,15 @@ class ClientEnhanceInfo { public static final String DEFAULT_BROKER_URL = "unknown"; public final String topic; - public final String brokerURL; + public final String brokerUrl; - private ClientEnhanceInfo(String topic, String brokerURL) { - this.topic = Strings.isNullOrEmpty(topic) ? DEFAULT_TOPIC : topic; - this.brokerURL = Strings.isNullOrEmpty(brokerURL) ? DEFAULT_BROKER_URL : brokerURL; + private ClientEnhanceInfo(String topic, String brokerUrl) { + this.topic = isNullOrEmpty(topic) ? DEFAULT_TOPIC : topic; + this.brokerUrl = isNullOrEmpty(brokerUrl) ? DEFAULT_BROKER_URL : brokerUrl; } - public static ClientEnhanceInfo create(String topic, String brokerURL) { - return new ClientEnhanceInfo(topic, brokerURL); + public static ClientEnhanceInfo create(String topic, String brokerUrl) { + return new ClientEnhanceInfo(topic, brokerUrl); } private static boolean isNullOrEmpty(String s) { diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index 4203ded39f06..3b89e5a05604 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -95,10 +95,10 @@ public static void after( ClientEnhanceInfo cinfo = VirtualFieldStore.extract(consumer); String topic = null == cinfo ? ClientEnhanceInfo.DEFAULT_TOPIC : cinfo.topic; - String brokerURL = null == cinfo ? ClientEnhanceInfo.DEFAULT_BROKER_URL : cinfo.brokerURL; + String brokerUrl = null == cinfo ? ClientEnhanceInfo.DEFAULT_BROKER_URL : cinfo.brokerUrl; Attributes attributes = Attributes.of( - SemanticAttributes.MESSAGING_URL, brokerURL, + SemanticAttributes.MESSAGING_URL, brokerUrl, SemanticAttributes.MESSAGING_DESTINATION, topic); Context current = Context.current(); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index bc5d0abc4b33..6d507689eea8 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -115,7 +115,7 @@ public void sendComplete(Exception e) { Instrumenter, Attributes> instrumenter = PulsarTelemetry.producerInstrumenter(); Attributes attributes = Attributes.empty(); if (null != info) { - attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, info.brokerURL); + attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, info.brokerUrl); } try (Scope ignore = context.makeCurrent()) { From 92f5c72c68e7f0c96d6e3508c113a349604d96cc Mon Sep 17 00:00:00 2001 From: daojun Date: Tue, 6 Dec 2022 01:07:38 +0800 Subject: [PATCH 23/48] Fix instrumentation --- .../pulsar/ClientEnhanceInfo.java | 31 ---- .../pulsar/ConsumerImplInstrumentation.java | 145 ++++++++++++------ .../pulsar/MessageInstrumentation.java | 43 ++++++ .../pulsar/ProducerImplInstrumentation.java | 27 ++-- .../pulsar/PulsarInstrumentationModule.java | 1 + .../pulsar/VirtualFieldStore.java | 48 ++++-- .../ConsumerReceiveAttributeGetter.java | 2 +- .../pulsar/telemetry/PulsarTelemetry.java | 30 ++++ 8 files changed, 216 insertions(+), 111 deletions(-) delete mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java create mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java deleted file mode 100644 index 0f084a0638dd..000000000000 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ClientEnhanceInfo.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.pulsar; - -/** - * for producer and consumer, cache service_url and determine whether the instance has been - * enhanced. - */ -class ClientEnhanceInfo { - public static final String DEFAULT_TOPIC = "unknown"; - public static final String DEFAULT_BROKER_URL = "unknown"; - - public final String topic; - public final String brokerUrl; - - private ClientEnhanceInfo(String topic, String brokerUrl) { - this.topic = isNullOrEmpty(topic) ? DEFAULT_TOPIC : topic; - this.brokerUrl = isNullOrEmpty(brokerUrl) ? DEFAULT_BROKER_URL : brokerUrl; - } - - public static ClientEnhanceInfo create(String topic, String brokerUrl) { - return new ClientEnhanceInfo(topic, brokerUrl); - } - - private static boolean isNullOrEmpty(String s) { - return s == null || s.isEmpty(); - } -} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java index 3b89e5a05604..ad868d815f5e 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java @@ -5,109 +5,162 @@ package io.opentelemetry.javaagent.instrumentation.pulsar; +import static io.opentelemetry.javaagent.instrumentation.pulsar.telemetry.PulsarTelemetry.startAndEndConsumerReceive; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isProtected; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.context.Context; -import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.pulsar.telemetry.PulsarTelemetry; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import java.util.concurrent.CompletableFuture; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; +import org.apache.pulsar.client.api.Consumer; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.api.PulsarClient; -import org.apache.pulsar.client.impl.ConsumerImpl; import org.apache.pulsar.client.impl.PulsarClientImpl; public class ConsumerImplInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { - return named("org.apache.pulsar.client.impl.ConsumerImpl"); + return named("org.apache.pulsar.client.impl.ConsumerImpl") + .or(named("org.apache.pulsar.client.impl.MultiTopicsConsumerImpl")); } @Override public void transform(TypeTransformer transformer) { String klassName = ConsumerImplInstrumentation.class.getName(); - transformer.applyAdviceToMethod(isConstructor(), klassName + "$ConsumerImplConstructorAdviser"); + transformer.applyAdviceToMethod(isConstructor(), klassName + "$ConsumerConstructorAdviser"); + // internalReceive will apply to Consumer#receive(long,TimeUnit) + // and called before MessageListener#receive. transformer.applyAdviceToMethod( isMethod() .and(isProtected()) - .and(named("messageProcessed")) - .and(takesArgument(0, named("org.apache.pulsar.client.api.Message"))), - klassName + "$ConsumerImplMethodAdviser"); + .and(named("internalReceive")) + .and(takesArguments(2)) + .and(takesArgument(1, named("java.util.concurrent.TimeUnit"))), + klassName + "$ConsumerInternalReceiveAdviser"); + // receive/batchReceive will apply to Consumer#receive()/Consumer#batchReceive() + transformer.applyAdviceToMethod( + isMethod() + .and(isPublic()) + .and(named("receive").or(named("batchReceive"))) + .and(takesArguments(0)), + klassName + "$ConsumerSyncReceiveAdviser"); + // receiveAsync/batchReceiveAsync will apply to + // Consumer#receiveAsync()/Consumer#batchReceiveAsync() + transformer.applyAdviceToMethod( + isMethod() + .and(isPublic()) + .and(named("receiveAsync").or(named("batchReceiveAsync"))) + .and(takesArguments(0)), + klassName + "$ConsumerAsyncReceiveAdviser"); } @SuppressWarnings("unused") - public static class ConsumerImplConstructorAdviser { - private ConsumerImplConstructorAdviser() {} + public static class ConsumerConstructorAdviser { + private ConsumerConstructorAdviser() {} @Advice.OnMethodExit(suppress = Throwable.class) public static void after( - @Advice.This ConsumerImpl consumer, - @Advice.Argument(value = 0) PulsarClient client, - @Advice.Argument(value = 1) String topic) { + @Advice.This Consumer consumer, @Advice.Argument(value = 0) PulsarClient client) { PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String url = pulsarClient.getLookup().getServiceUrl(); - ClientEnhanceInfo info = ClientEnhanceInfo.create(topic, url); - VirtualFieldStore.inject(consumer, info); + VirtualFieldStore.inject(consumer, url); } } @SuppressWarnings("unused") - public static class ConsumerImplMethodAdviser { - private ConsumerImplMethodAdviser() {} + public static class ConsumerInternalReceiveAdviser { + private ConsumerInternalReceiveAdviser() {} @Advice.OnMethodEnter public static void before( - @Advice.This ConsumerImpl consumer, - @Advice.Argument(value = 0) Message message, - @Advice.Local(value = "otelScope") Scope scope) { - Instrumenter, Attributes> instrumenter = - PulsarTelemetry.consumerReceiveInstrumenter(); + @Advice.Local(value = "startTime") long startTime) { + startTime = System.currentTimeMillis(); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class) + public static void after( + @Advice.This Consumer consumer, + @Advice.Return Message message, + @Advice.Thrown Throwable t, + @Advice.Local(value = "startTime") long startTime) { + if (t != null) { + return; + } Context parent = Context.current(); - if (instrumenter.shouldStart(parent, message)) { - scope = instrumenter.start(parent, message).makeCurrent(); + Context current = startAndEndConsumerReceive(parent, message, startTime, consumer); + if (current != null) { + // ConsumerBase#internalReceive(long,TimeUnit) will be called before + // ConsumerListener#receive(Consumer,Message), so, need to inject Context into Message. + VirtualFieldStore.inject(message, current); } } + } + + @SuppressWarnings("unused") + public static class ConsumerSyncReceiveAdviser { + private ConsumerSyncReceiveAdviser() {} + + @Advice.OnMethodEnter + public static void before( + @Advice.Local(value = "startTime") long startTime) { + startTime = System.currentTimeMillis(); + } @Advice.OnMethodExit(onThrowable = Throwable.class) public static void after( - @Advice.This ConsumerImpl consumer, - @Advice.Argument(value = 0) Message message, + @Advice.This Consumer consumer, + @Advice.Return Message message, @Advice.Thrown Throwable t, - @Advice.Local(value = "otelScope") Scope scope) { - if (scope == null) { + @Advice.Local(value = "startTime") long startTime) { + if (t != null) { return; } - ClientEnhanceInfo cinfo = VirtualFieldStore.extract(consumer); - String topic = null == cinfo ? ClientEnhanceInfo.DEFAULT_TOPIC : cinfo.topic; - String brokerUrl = null == cinfo ? ClientEnhanceInfo.DEFAULT_BROKER_URL : cinfo.brokerUrl; - Attributes attributes = - Attributes.of( - SemanticAttributes.MESSAGING_URL, brokerUrl, - SemanticAttributes.MESSAGING_DESTINATION, topic); - - Context current = Context.current(); - VirtualFieldStore.inject(message, current); - - Instrumenter, Attributes> instrumenter = - PulsarTelemetry.consumerReceiveInstrumenter(); - instrumenter.end(current, message, attributes, t); - scope.close(); + Context parent = Context.current(); + startAndEndConsumerReceive(parent, message, startTime, consumer); + // No need to inject context to message. + } + } + + @SuppressWarnings("unused") + public static class ConsumerAsyncReceiveAdviser { + private ConsumerAsyncReceiveAdviser() {} + + @Advice.OnMethodEnter + public static void before( + @Advice.Local(value = "startTime") long startTime) { + startTime = System.currentTimeMillis(); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class) + public static void after( + @Advice.This Consumer consumer, + @Advice.Return CompletableFuture> future, + @Advice.Local(value = "startTime") long startTime) { + future.whenComplete( + (message, t) -> { + if (t != null) { + return; + } + + Context parent = Context.current(); + startAndEndConsumerReceive(parent, message, startTime, consumer); + // No need to inject context to message. + }); } } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java new file mode 100644 index 000000000000..6fc0eb7e4c4b --- /dev/null +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java @@ -0,0 +1,43 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar; + +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.pulsar.client.api.Message; + +public class MessageInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("org.apache.pulsar.client.impl.MessageImpl"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isMethod().and(isPublic()).and(named("recycle")).and(takesArguments(0)), + MessageInstrumentation.class.getName() + "$MessageRecycleAdvice"); + } + + @SuppressWarnings("unused") + public static class MessageRecycleAdvice { + private MessageRecycleAdvice() {} + + @Advice.OnMethodExit + public static void after(@Advice.This Message message) { + // Clean context to prevent memory leak. + VirtualFieldStore.inject(message, null); + } + } +} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java index 6d507689eea8..a8b1c0eca1b1 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java @@ -57,13 +57,10 @@ private ProducerImplConstructorAdviser() {} @Advice.OnMethodExit public static void intercept( - @Advice.This ProducerImpl producer, - @Advice.Argument(value = 0) PulsarClient client, - @Advice.Argument(value = 1) String topic) { + @Advice.This ProducerImpl producer, @Advice.Argument(value = 0) PulsarClient client) { PulsarClientImpl pulsarClient = (PulsarClientImpl) client; - String url = pulsarClient.getLookup().getServiceUrl(); - ClientEnhanceInfo info = ClientEnhanceInfo.create(topic, url); - VirtualFieldStore.inject(producer, info); + String brokerUrl = pulsarClient.getLookup().getServiceUrl(); + VirtualFieldStore.inject(producer, brokerUrl); } } @@ -77,32 +74,30 @@ public static void before( @Advice.Argument(value = 0) Message message, @Advice.Argument(value = 1, readOnly = false) SendCallback callback) { Context parent = Context.current(); - ClientEnhanceInfo info = VirtualFieldStore.extract(producer); Instrumenter, Attributes> instrumenter = PulsarTelemetry.producerInstrumenter(); Context current = null; if (instrumenter.shouldStart(parent, message)) { - current = instrumenter.start(Context.current(), message); + current = instrumenter.start(parent, message); } - callback = new SendCallbackWrapper(current, message, callback, info); + callback = new SendCallbackWrapper(current, message, callback, producer); } } public static class SendCallbackWrapper implements SendCallback { - private static final long serialVersionUID = 1L; private final Context context; private final Message message; private final SendCallback delegator; - private final ClientEnhanceInfo info; + private final ProducerImpl producer; public SendCallbackWrapper( - Context context, Message message, SendCallback callback, ClientEnhanceInfo info) { + Context context, Message message, SendCallback callback, ProducerImpl producer) { this.context = context; this.message = message; this.delegator = callback; - this.info = info; + this.producer = producer; } @Override @@ -113,10 +108,8 @@ public void sendComplete(Exception e) { } Instrumenter, Attributes> instrumenter = PulsarTelemetry.producerInstrumenter(); - Attributes attributes = Attributes.empty(); - if (null != info) { - attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, info.brokerUrl); - } + String brokerUrl = VirtualFieldStore.extract(producer); + Attributes attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, brokerUrl); try (Scope ignore = context.makeCurrent()) { this.delegator.sendComplete(e); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java index 6b16f61f5cc9..1e03f5b0ea44 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java @@ -22,6 +22,7 @@ public List typeInstrumentations() { List instrumentations = new ArrayList<>(4); instrumentations.add(new ConsumerImplInstrumentation()); instrumentations.add(new ProducerImplInstrumentation()); + instrumentations.add(new MessageInstrumentation()); instrumentations.add(new MessageListenerInstrumentation()); return instrumentations; } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java index 9e5c236ee3e9..fbd9d21d861a 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java @@ -10,39 +10,55 @@ import org.apache.pulsar.client.api.Consumer; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.api.Producer; +import org.apache.pulsar.client.impl.TopicMessageImpl; -class VirtualFieldStore { +public class VirtualFieldStore { private static final VirtualField, Context> MSG_FIELD = VirtualField.find(Message.class, Context.class); - private static final VirtualField, ClientEnhanceInfo> PRODUCER_FIELD = - VirtualField.find(Producer.class, ClientEnhanceInfo.class); - private static final VirtualField, ClientEnhanceInfo> CONSUMER_FIELD = - VirtualField.find(Consumer.class, ClientEnhanceInfo.class); + private static final VirtualField, String> PRODUCER_FIELD = + VirtualField.find(Producer.class, String.class); + private static final VirtualField, String> CONSUMER_FIELD = + VirtualField.find(Consumer.class, String.class); private VirtualFieldStore() {} - static void inject(Message instance, Context context) { - MSG_FIELD.set(instance, context); + public static void inject(Message instance, Context context) { + if (instance instanceof TopicMessageImpl) { + TopicMessageImpl topicMessage = (TopicMessageImpl) instance; + instance = topicMessage.getMessage(); + } + if (instance != null) { + MSG_FIELD.set(instance, context); + } } - static void inject(Producer instance, ClientEnhanceInfo info) { - PRODUCER_FIELD.set(instance, info); + public static void inject(Producer instance, String serviceUrl) { + PRODUCER_FIELD.set(instance, serviceUrl); } - static void inject(Consumer instance, ClientEnhanceInfo info) { - CONSUMER_FIELD.set(instance, info); + public static void inject(Consumer instance, String serviceUrl) { + CONSUMER_FIELD.set(instance, serviceUrl); } - static Context extract(Message instance) { + public static Context extract(Message instance) { + if (instance instanceof TopicMessageImpl) { + TopicMessageImpl topicMessage = (TopicMessageImpl) instance; + instance = topicMessage.getMessage(); + } + if (instance == null) { + return Context.current(); + } Context ctx = MSG_FIELD.get(instance); return ctx == null ? Context.current() : ctx; } - static ClientEnhanceInfo extract(Producer instance) { - return PRODUCER_FIELD.get(instance); + public static String extract(Producer instance) { + String brokerUrl = PRODUCER_FIELD.get(instance); + return brokerUrl == null ? "unknown" : brokerUrl; } - static ClientEnhanceInfo extract(Consumer instance) { - return CONSUMER_FIELD.get(instance); + public static String extract(Consumer instance) { + String brokerUrl = CONSUMER_FIELD.get(instance); + return brokerUrl == null ? "unknown" : brokerUrl; } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java index 5a6b9a81deb7..495a88bbbdea 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java @@ -32,7 +32,7 @@ public String destinationKind(Message message) { @Nullable @Override public String destination(Message message) { - return null; + return message.getTopicName(); } @Override diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java index b9387822fff9..e122a60222b9 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java +++ b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java @@ -9,17 +9,26 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessageOperation; import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; +import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil; +import io.opentelemetry.javaagent.instrumentation.pulsar.VirtualFieldStore; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import java.time.Instant; +import org.apache.pulsar.client.api.Consumer; import org.apache.pulsar.client.api.Message; public final class PulsarTelemetry { private static final String INSTRUMENTATION = "io.opentelemetry:pulsar-client"; private static final OpenTelemetry TELEMETRY = GlobalOpenTelemetry.get(); + private static final TextMapPropagator PROPAGATOR = + TELEMETRY.getPropagators().getTextMapPropagator(); private static final SpanNameExtractor> CONSUMER_RECEIVE = new InternalSpanNameExtractor<>(SpanKind.CONSUMER, MessageOperation.RECEIVE); @@ -80,6 +89,27 @@ private static Instrumenter, Attributes> createProducerInstrumenter() .buildProducerInstrumenter(MessageTextMapSetter.INSTANCE); } + public static Context startAndEndConsumerReceive( + Context parent, Message message, long start, Consumer consumer) { + if (message == null || !CONSUMER_RECEIVE_INSTRUMENTER.shouldStart(parent, message)) { + return null; + } + + String brokerUrl = VirtualFieldStore.extract(consumer); + Attributes attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, brokerUrl); + // startAndEnd not supports extract trace context from carrier + // start not supports custom startTime + // extract trace context by using TEXT_MAP_PROPAGATOR here. + return InstrumenterUtil.startAndEnd( + CONSUMER_RECEIVE_INSTRUMENTER, + PROPAGATOR.extract(parent, message, MessageTextMapGetter.INSTANCE), + message, + attributes, + null, + Instant.ofEpochMilli(start), + Instant.now()); + } + private PulsarTelemetry() {} static class InternalSpanNameExtractor implements SpanNameExtractor { From 63438b6a0c37353ccf2b50d8cf3c3a1d7866ef61 Mon Sep 17 00:00:00 2001 From: daojun Date: Sat, 10 Dec 2022 20:19:35 +0800 Subject: [PATCH 24/48] review fix --- .../javaagent/build.gradle.kts | 0 .../v28}/ConsumerImplInstrumentation.java | 4 +- .../pulsar/v28}/MessageInstrumentation.java | 2 +- .../v28}/MessageListenerInstrumentation.java | 8 +- .../v28}/ProducerImplInstrumentation.java | 8 +- .../v28}/PulsarInstrumentationModule.java | 15 ++- .../pulsar/v28}/VirtualFieldStore.java | 2 +- .../ConsumerAttributesExtractor.java} | 11 +-- .../v28}/telemetry/MessageTextMapGetter.java | 6 +- .../v28}/telemetry/MessageTextMapSetter.java | 6 +- .../ProducerAttributesExtractor.java} | 8 +- .../PulsarMessagingAttributesGetter.java} | 6 +- .../v28/telemetry/PulsarSingletons.java} | 44 ++++----- .../pulsar/v28}/PulsarClientTest.groovy | 21 +++-- .../ConsumerListenerAttributeGetter.java | 86 ----------------- .../ConsumerReceiveAttributeGetter.java | 93 ------------------- settings.gradle.kts | 2 +- 17 files changed, 74 insertions(+), 248 deletions(-) rename instrumentation/apache-pulsar/{ => apache-pulsar-2.8}/javaagent/build.gradle.kts (100%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28}/ConsumerImplInstrumentation.java (98%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28}/MessageInstrumentation.java (95%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28}/MessageListenerInstrumentation.java (90%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28}/ProducerImplInstrumentation.java (95%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28}/PulsarInstrumentationModule.java (58%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28}/VirtualFieldStore.java (97%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java} (67%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28}/telemetry/MessageTextMapGetter.java (69%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28}/telemetry/MessageTextMapSetter.java (71%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java} (86%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java} (87%) rename instrumentation/apache-pulsar/{javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java => apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java} (74%) rename instrumentation/apache-pulsar/{javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar => apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28}/PulsarClientTest.groovy (93%) delete mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java delete mode 100644 instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java diff --git a/instrumentation/apache-pulsar/javaagent/build.gradle.kts b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/build.gradle.kts similarity index 100% rename from instrumentation/apache-pulsar/javaagent/build.gradle.kts rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/build.gradle.kts diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java similarity index 98% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java index ad868d815f5e..e903276fb26a 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28; -import static io.opentelemetry.javaagent.instrumentation.pulsar.telemetry.PulsarTelemetry.startAndEndConsumerReceive; +import static io.opentelemetry.javaagent.instrumentation.pulsar.v28.telemetry.PulsarSingletons.startAndEndConsumerReceive; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isProtected; diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageInstrumentation.java similarity index 95% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageInstrumentation.java index 6fc0eb7e4c4b..b6bba579e1c6 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageListenerInstrumentation.java similarity index 90% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageListenerInstrumentation.java index 7e70e074a6f2..0dad6cb9ceb2 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/MessageListenerInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageListenerInstrumentation.java @@ -3,18 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.pulsar.telemetry.PulsarTelemetry; +import io.opentelemetry.javaagent.instrumentation.pulsar.v28.telemetry.PulsarSingletons; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.implementation.bytecode.assign.Assigner; @@ -70,7 +71,8 @@ public MessageListenerWrapper(MessageListener messageListener) { public void received(Consumer consumer, Message msg) { Context parent = VirtualFieldStore.extract(msg); - Instrumenter, Void> instrumenter = PulsarTelemetry.consumerListenerInstrumenter(); + Instrumenter, Attributes> instrumenter = + PulsarSingletons.consumerListenerInstrumenter(); if (!instrumenter.shouldStart(parent, msg)) { this.delegator.received(consumer, msg); return; diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java similarity index 95% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java index a8b1c0eca1b1..b408d93072f7 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -17,7 +17,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.pulsar.telemetry.PulsarTelemetry; +import io.opentelemetry.javaagent.instrumentation.pulsar.v28.telemetry.PulsarSingletons; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.util.concurrent.CompletableFuture; import net.bytebuddy.asm.Advice; @@ -74,7 +74,7 @@ public static void before( @Advice.Argument(value = 0) Message message, @Advice.Argument(value = 1, readOnly = false) SendCallback callback) { Context parent = Context.current(); - Instrumenter, Attributes> instrumenter = PulsarTelemetry.producerInstrumenter(); + Instrumenter, Attributes> instrumenter = PulsarSingletons.producerInstrumenter(); Context current = null; if (instrumenter.shouldStart(parent, message)) { @@ -107,7 +107,7 @@ public void sendComplete(Exception e) { return; } - Instrumenter, Attributes> instrumenter = PulsarTelemetry.producerInstrumenter(); + Instrumenter, Attributes> instrumenter = PulsarSingletons.producerInstrumenter(); String brokerUrl = VirtualFieldStore.extract(producer); Attributes attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, brokerUrl); diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarInstrumentationModule.java similarity index 58% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarInstrumentationModule.java index 1e03f5b0ea44..f0539afec663 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarInstrumentationModule.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarInstrumentationModule.java @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @AutoService(InstrumentationModule.class) @@ -19,11 +19,10 @@ public PulsarInstrumentationModule() { @Override public List typeInstrumentations() { - List instrumentations = new ArrayList<>(4); - instrumentations.add(new ConsumerImplInstrumentation()); - instrumentations.add(new ProducerImplInstrumentation()); - instrumentations.add(new MessageInstrumentation()); - instrumentations.add(new MessageListenerInstrumentation()); - return instrumentations; + return Arrays.asList( + new ConsumerImplInstrumentation(), + new ProducerImplInstrumentation(), + new MessageInstrumentation(), + new MessageListenerInstrumentation()); } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java similarity index 97% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java index fbd9d21d861a..48a1101ca8fc 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/VirtualFieldStore.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.util.VirtualField; diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java similarity index 67% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java index a024c302865a..b9cd9c44f56c 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeExtractor.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28.telemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; @@ -12,11 +12,10 @@ import javax.annotation.Nullable; import org.apache.pulsar.client.api.Message; -class ConsumerReceiveAttributeExtractor implements AttributesExtractor, Attributes> { - public static final ConsumerReceiveAttributeExtractor INSTANCE = - new ConsumerReceiveAttributeExtractor(); +enum ConsumerAttributesExtractor implements AttributesExtractor, Attributes> { + INSTANCE; - private ConsumerReceiveAttributeExtractor() {} + private ConsumerAttributesExtractor() {} @Override public void onStart(AttributesBuilder attributes, Context parentContext, Message message) {} @@ -28,7 +27,7 @@ public void onEnd( Message message, @Nullable Attributes attributes, @Nullable Throwable error) { - if (null != attributes) { + if (null != attributes && !attributes.isEmpty()) { attributesBuilder.putAll(attributes); } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapGetter.java similarity index 69% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapGetter.java index 00fc20dcd622..e2f68d37a1a4 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapGetter.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapGetter.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28.telemetry; import io.opentelemetry.context.propagation.TextMapGetter; import javax.annotation.Nullable; import org.apache.pulsar.client.api.Message; -class MessageTextMapGetter implements TextMapGetter> { - public static final TextMapGetter> INSTANCE = new MessageTextMapGetter(); +enum MessageTextMapGetter implements TextMapGetter> { + INSTANCE; @Override public Iterable keys(Message message) { diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapSetter.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapSetter.java similarity index 71% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapSetter.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapSetter.java index 61386fba7832..b6d523cf4328 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/MessageTextMapSetter.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapSetter.java @@ -3,15 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28.telemetry; import io.opentelemetry.context.propagation.TextMapSetter; import javax.annotation.Nullable; import org.apache.pulsar.client.api.Message; import org.apache.pulsar.client.impl.MessageImpl; -class MessageTextMapSetter implements TextMapSetter> { - public static final TextMapSetter> INSTANCE = new MessageTextMapSetter(); +enum MessageTextMapSetter implements TextMapSetter> { + INSTANCE; @Override public void set(@Nullable Message carrier, String key, String value) { diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java similarity index 86% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java index 747da724420c..844e2a675f5f 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeExtractor.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28.telemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; @@ -15,10 +15,10 @@ import org.apache.pulsar.client.impl.MessageImpl; import org.apache.pulsar.common.api.proto.MessageMetadata; -class ProducerAttributeExtractor implements AttributesExtractor, Attributes> { - public static final ProducerAttributeExtractor INSTANCE = new ProducerAttributeExtractor(); +enum ProducerAttributesExtractor implements AttributesExtractor, Attributes> { + INSTANCE; - private ProducerAttributeExtractor() {} + private ProducerAttributesExtractor() {} @Override public void onStart(AttributesBuilder attributes, Context parentContext, Message message) {} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java similarity index 87% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java index 6ba2cc62afae..b4df78364522 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ProducerAttributeGetter.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28.telemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; @@ -11,8 +11,8 @@ import javax.annotation.Nullable; import org.apache.pulsar.client.api.Message; -class ProducerAttributeGetter implements MessagingAttributesGetter, Attributes> { - public static final ProducerAttributeGetter INSTANCE = new ProducerAttributeGetter(); +enum PulsarMessagingAttributesGetter implements MessagingAttributesGetter, Attributes> { + INSTANCE; @Nullable @Override diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java similarity index 74% rename from instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java index e122a60222b9..0552cb5711e3 100644 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/PulsarTelemetry.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; +package io.opentelemetry.javaagent.instrumentation.pulsar.v28.telemetry; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; @@ -18,33 +18,33 @@ import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil; -import io.opentelemetry.javaagent.instrumentation.pulsar.VirtualFieldStore; +import io.opentelemetry.javaagent.instrumentation.pulsar.v28.VirtualFieldStore; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.time.Instant; import org.apache.pulsar.client.api.Consumer; import org.apache.pulsar.client.api.Message; -public final class PulsarTelemetry { - private static final String INSTRUMENTATION = "io.opentelemetry:pulsar-client"; +public final class PulsarSingletons { + private static final String INSTRUMENTATION = "io.opentelemetry.pulsar-client-2.8"; private static final OpenTelemetry TELEMETRY = GlobalOpenTelemetry.get(); private static final TextMapPropagator PROPAGATOR = TELEMETRY.getPropagators().getTextMapPropagator(); private static final SpanNameExtractor> CONSUMER_RECEIVE = - new InternalSpanNameExtractor<>(SpanKind.CONSUMER, MessageOperation.RECEIVE); + new MessagingSpanNameExtractor<>(SpanKind.CONSUMER, MessageOperation.RECEIVE); private static final SpanNameExtractor> CONSUMER_PROCESS = - new InternalSpanNameExtractor<>(SpanKind.CONSUMER, MessageOperation.PROCESS); + new MessagingSpanNameExtractor<>(SpanKind.CONSUMER, MessageOperation.PROCESS); private static final SpanNameExtractor> PRODUCER_SEND = - new InternalSpanNameExtractor<>(SpanKind.PRODUCER, MessageOperation.SEND); + new MessagingSpanNameExtractor<>(SpanKind.PRODUCER, MessageOperation.SEND); - private static final Instrumenter, Void> CONSUMER_LISTENER_INSTRUMENTER = + private static final Instrumenter, Attributes> CONSUMER_LISTENER_INSTRUMENTER = createConsumerListenerInstrumenter(); private static final Instrumenter, Attributes> CONSUMER_RECEIVE_INSTRUMENTER = createConsumerReceiveInstrumenter(); private static final Instrumenter, Attributes> PRODUER_INSTRUMENTER = createProducerInstrumenter(); - public static Instrumenter, Void> consumerListenerInstrumenter() { + public static Instrumenter, Attributes> consumerListenerInstrumenter() { return CONSUMER_LISTENER_INSTRUMENTER; } @@ -58,33 +58,33 @@ public static Instrumenter, Attributes> producerInstrumenter() { private static Instrumenter, Attributes> createConsumerReceiveInstrumenter() { MessagingAttributesGetter, Attributes> getter = - ConsumerReceiveAttributeGetter.INSTANCE; - AttributesExtractor, Attributes> extractor = - ConsumerReceiveAttributeExtractor.INSTANCE; + PulsarMessagingAttributesGetter.INSTANCE; return Instrumenter., Attributes>builder( TELEMETRY, INSTRUMENTATION, CONSUMER_RECEIVE) - .addAttributesExtractor(extractor) + .addAttributesExtractor(ConsumerAttributesExtractor.INSTANCE) .addAttributesExtractor( MessagingAttributesExtractor.create(getter, MessageOperation.RECEIVE)) .buildConsumerInstrumenter(MessageTextMapGetter.INSTANCE); } - private static Instrumenter, Void> createConsumerListenerInstrumenter() { - MessagingAttributesGetter, Void> getter = ConsumerListenerAttributeGetter.INSTANCE; + private static Instrumenter, Attributes> createConsumerListenerInstrumenter() { + MessagingAttributesGetter, Attributes> getter = + PulsarMessagingAttributesGetter.INSTANCE; - return Instrumenter., Void>builder(TELEMETRY, INSTRUMENTATION, CONSUMER_PROCESS) + return Instrumenter., Attributes>builder( + TELEMETRY, INSTRUMENTATION, CONSUMER_PROCESS) .addAttributesExtractor( MessagingAttributesExtractor.create(getter, MessageOperation.PROCESS)) + .addAttributesExtractor(ConsumerAttributesExtractor.INSTANCE) .buildInstrumenter(); } private static Instrumenter, Attributes> createProducerInstrumenter() { - MessagingAttributesGetter, Attributes> getter = ProducerAttributeGetter.INSTANCE; - AttributesExtractor, Attributes> extractor = ProducerAttributeExtractor.INSTANCE; + MessagingAttributesGetter, Attributes> getter = PulsarMessagingAttributesGetter.INSTANCE; return Instrumenter., Attributes>builder(TELEMETRY, INSTRUMENTATION, PRODUCER_SEND) - .addAttributesExtractor(extractor) + .addAttributesExtractor(ProducerAttributesExtractor.INSTANCE) .addAttributesExtractor(MessagingAttributesExtractor.create(getter, MessageOperation.SEND)) .buildProducerInstrumenter(MessageTextMapSetter.INSTANCE); } @@ -110,12 +110,12 @@ public static Context startAndEndConsumerReceive( Instant.now()); } - private PulsarTelemetry() {} + private PulsarSingletons() {} - static class InternalSpanNameExtractor implements SpanNameExtractor { + static class MessagingSpanNameExtractor implements SpanNameExtractor { private final String name; - private InternalSpanNameExtractor(SpanKind kind, MessageOperation operation) { + private MessagingSpanNameExtractor(SpanKind kind, MessageOperation operation) { this.name = kind.name() + "/" + operation.name(); } diff --git a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy similarity index 93% rename from instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy rename to instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 9aeff410206e..aefad52442a1 100644 --- a/instrumentation/apache-pulsar/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/pulsar/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -3,16 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.pulsar - -import static io.opentelemetry.api.trace.SpanKind.CONSUMER -import static io.opentelemetry.api.trace.SpanKind.INTERNAL -import static io.opentelemetry.api.trace.SpanKind.PRODUCER +package io.opentelemetry.javaagent.instrumentation.pulsar.v28 import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import java.nio.charset.Charset -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes import org.apache.pulsar.client.api.Consumer import org.apache.pulsar.client.api.Message import org.apache.pulsar.client.api.MessageListener @@ -22,6 +16,14 @@ import org.apache.pulsar.client.api.Schema import org.testcontainers.containers.PulsarContainer import org.testcontainers.utility.DockerImageName +import java.nio.charset.Charset +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit + +import static io.opentelemetry.api.trace.SpanKind.CONSUMER +import static io.opentelemetry.api.trace.SpanKind.INTERNAL +import static io.opentelemetry.api.trace.SpanKind.PRODUCER + class PulsarClientTest extends AgentInstrumentationSpecification { private static final DockerImageName DEFAULT_IMAGE_NAME = @@ -70,6 +72,9 @@ class PulsarClientTest extends AgentInstrumentationSpecification { name("PRODUCER/SEND") kind(PRODUCER) childOf span(0) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + } } } } diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java deleted file mode 100644 index c015c86f6a50..000000000000 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerListenerAttributeGetter.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; - -import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -import javax.annotation.Nullable; -import org.apache.pulsar.client.api.Message; - -class ConsumerListenerAttributeGetter implements MessagingAttributesGetter, Void> { - public static final ConsumerListenerAttributeGetter INSTANCE = - new ConsumerListenerAttributeGetter(); - - @Nullable - @Override - public String system(Message message) { - return "pulsar"; - } - - @Nullable - @Override - public String destinationKind(Message message) { - return SemanticAttributes.MessagingDestinationKindValues.TOPIC; - } - - @Nullable - @Override - public String destination(Message message) { - return null; - } - - @Override - public boolean temporaryDestination(Message message) { - return false; - } - - @Nullable - @Override - public String protocol(Message message) { - return null; - } - - @Nullable - @Override - public String protocolVersion(Message message) { - return null; - } - - @Nullable - @Override - public String url(Message message) { - return null; - } - - @Nullable - @Override - public String conversationId(Message message) { - return null; - } - - @Nullable - @Override - public Long messagePayloadSize(Message message) { - return null; - } - - @Nullable - @Override - public Long messagePayloadCompressedSize(Message message) { - return null; - } - - @Nullable - @Override - public String messageId(Message message, @Nullable Void unused) { - String messageId0 = null; - if (null != message && null != message.getMessageId()) { - messageId0 = message.getMessageId().toString(); - } - - return messageId0; - } -} diff --git a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java b/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java deleted file mode 100644 index 495a88bbbdea..000000000000 --- a/instrumentation/apache-pulsar/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/telemetry/ConsumerReceiveAttributeGetter.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.pulsar.telemetry; - -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessagingAttributesGetter; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; -import javax.annotation.Nullable; -import org.apache.pulsar.client.api.Message; - -class ConsumerReceiveAttributeGetter implements MessagingAttributesGetter, Attributes> { - public static final ConsumerReceiveAttributeGetter INSTANCE = - new ConsumerReceiveAttributeGetter(); - - private ConsumerReceiveAttributeGetter() {} - - @Nullable - @Override - public String system(Message message) { - return "pulsar"; - } - - @Nullable - @Override - public String destinationKind(Message message) { - return SemanticAttributes.MessagingDestinationKindValues.TOPIC; - } - - @Nullable - @Override - public String destination(Message message) { - return message.getTopicName(); - } - - @Override - public boolean temporaryDestination(Message message) { - return false; - } - - @Nullable - @Override - public String protocol(Message message) { - return null; - } - - @Nullable - @Override - public String protocolVersion(Message message) { - return null; - } - - @Nullable - @Override - public String url(Message message) { - return null; - } - - @Nullable - @Override - public String conversationId(Message message) { - return null; - } - - @Nullable - @Override - public Long messagePayloadSize(Message message) { - if (message != null) { - return (long) message.size(); - } - - return null; - } - - @Nullable - @Override - public Long messagePayloadCompressedSize(Message message) { - return null; - } - - @Nullable - @Override - public String messageId(Message message, @Nullable Attributes attributes) { - String messageId0 = null; - if (null != message && null != message.getMessageId()) { - messageId0 = message.getMessageId().toString(); - } - - return messageId0; - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index bedff1288076..2d51ddef7e0c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -146,7 +146,7 @@ hideFromDependabot(":instrumentation:apache-httpclient:apache-httpclient-4.0:jav hideFromDependabot(":instrumentation:apache-httpclient:apache-httpclient-4.3:library") hideFromDependabot(":instrumentation:apache-httpclient:apache-httpclient-4.3:testing") hideFromDependabot(":instrumentation:apache-httpclient:apache-httpclient-5.0:javaagent") -hideFromDependabot(":instrumentation:apache-pulsar:javaagent") +hideFromDependabot(":instrumentation:apache-pulsar:apache-pulsar-2.8:javaagent") hideFromDependabot(":instrumentation:armeria-1.3:javaagent") hideFromDependabot(":instrumentation:armeria-1.3:library") hideFromDependabot(":instrumentation:armeria-1.3:testing") From 40c11156f9914c3c7767c1b3365d170c1717c109 Mon Sep 17 00:00:00 2001 From: daojun Date: Sat, 10 Dec 2022 20:30:02 +0800 Subject: [PATCH 25/48] fix checkstyle --- .../pulsar/v28/ConsumerImplInstrumentation.java | 9 +++------ .../pulsar/v28/telemetry/PulsarSingletons.java | 6 +++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java index e903276fb26a..db48b7fdaad9 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java @@ -85,8 +85,7 @@ public static class ConsumerInternalReceiveAdviser { private ConsumerInternalReceiveAdviser() {} @Advice.OnMethodEnter - public static void before( - @Advice.Local(value = "startTime") long startTime) { + public static void before(@Advice.Local(value = "startTime") long startTime) { startTime = System.currentTimeMillis(); } @@ -115,8 +114,7 @@ public static class ConsumerSyncReceiveAdviser { private ConsumerSyncReceiveAdviser() {} @Advice.OnMethodEnter - public static void before( - @Advice.Local(value = "startTime") long startTime) { + public static void before(@Advice.Local(value = "startTime") long startTime) { startTime = System.currentTimeMillis(); } @@ -141,8 +139,7 @@ public static class ConsumerAsyncReceiveAdviser { private ConsumerAsyncReceiveAdviser() {} @Advice.OnMethodEnter - public static void before( - @Advice.Local(value = "startTime") long startTime) { + public static void before(@Advice.Local(value = "startTime") long startTime) { startTime = System.currentTimeMillis(); } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java index 0552cb5711e3..24a4963d1b8c 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java @@ -11,7 +11,6 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.instrumenter.messaging.MessageOperation; @@ -73,7 +72,7 @@ private static Instrumenter, Attributes> createConsumerListenerInstru PulsarMessagingAttributesGetter.INSTANCE; return Instrumenter., Attributes>builder( - TELEMETRY, INSTRUMENTATION, CONSUMER_PROCESS) + TELEMETRY, INSTRUMENTATION, CONSUMER_PROCESS) .addAttributesExtractor( MessagingAttributesExtractor.create(getter, MessageOperation.PROCESS)) .addAttributesExtractor(ConsumerAttributesExtractor.INSTANCE) @@ -81,7 +80,8 @@ private static Instrumenter, Attributes> createConsumerListenerInstru } private static Instrumenter, Attributes> createProducerInstrumenter() { - MessagingAttributesGetter, Attributes> getter = PulsarMessagingAttributesGetter.INSTANCE; + MessagingAttributesGetter, Attributes> getter = + PulsarMessagingAttributesGetter.INSTANCE; return Instrumenter., Attributes>builder(TELEMETRY, INSTRUMENTATION, PRODUCER_SEND) .addAttributesExtractor(ProducerAttributesExtractor.INSTANCE) From 7184126d0c862a8859908c626ac9906f081bf22a Mon Sep 17 00:00:00 2001 From: daojun Date: Sat, 10 Dec 2022 22:57:48 +0800 Subject: [PATCH 26/48] fix tests --- .../pulsar/v28/PulsarClientTest.groovy | 289 +++++++++++++++++- 1 file changed, 274 insertions(+), 15 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index aefad52442a1..16803a6cb76c 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -6,7 +6,9 @@ package io.opentelemetry.javaagent.instrumentation.pulsar.v28 import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification +import io.opentelemetry.instrumentation.test.asserts.SpanAssert import io.opentelemetry.semconv.trace.attributes.SemanticAttributes +import org.apache.pulsar.client.admin.PulsarAdmin import org.apache.pulsar.client.api.Consumer import org.apache.pulsar.client.api.Message import org.apache.pulsar.client.api.MessageListener @@ -15,8 +17,8 @@ import org.apache.pulsar.client.api.PulsarClient import org.apache.pulsar.client.api.Schema import org.testcontainers.containers.PulsarContainer import org.testcontainers.utility.DockerImageName +import spock.lang.Shared -import java.nio.charset.Charset import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit @@ -29,11 +31,18 @@ class PulsarClientTest extends AgentInstrumentationSpecification { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("apachepulsar/pulsar:2.8.0") - PulsarContainer pulsar - PulsarClient client - String topic - Producer producer - Consumer consumer + @Shared + private PulsarContainer pulsar + @Shared + private PulsarClient client + @Shared + private PulsarAdmin admin + @Shared + private Producer producer + @Shared + private Consumer consumer + @Shared + private Producer producer1 @Override def setupSpec() { @@ -41,23 +50,152 @@ class PulsarClientTest extends AgentInstrumentationSpecification { pulsar.start() def url = pulsar.pulsarBrokerUrl - topic = "persistent://public/default/test_" + UUID.randomUUID().toString() client = PulsarClient.builder().serviceUrl(url).build() - this.producer = client.newProducer().topic(topic).create() + admin = PulsarAdmin.builder().serviceHttpUrl("http://localhost:8080").build() } @Override def cleanupSpec() { producer?.close() consumer?.close() + producer1?.close() client?.close() + admin?.close() pulsar.close() } - def "test producer send message"() { + def "test send non-partitioned topic"() { setup: + def topic = "persistent://public/default/testNonPartitionedTopic_" + UUID.randomUUID() + admin.topics().createNonPartitionedTopic(topic) + producer = + client.newProducer(Schema.STRING).topic(topic) + .enableBatching(false).create() + + String msg = UUID.randomUUID().toString() + + def msgId + runWithSpan("parent") { + msgId = producer.send(msg) + } + + assertTraces(1) { + trace(0, 3) { + span(0) { + name("parent") + kind(INTERNAL) + hasNoParent() + } + + span(1) { + name("PRODUCER/SEND") + kind(PRODUCER) + childOf span(0) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + } + } + } + } + } + + def "test consume non-partitioned topic"() { + setup: + def topic = "persistent://public/default/testNonPartitionedTopic_" + UUID.randomUUID() + admin.topics().createNonPartitionedTopic(topic) + def latch = new CountDownLatch(1) + consumer = client.newConsumer(Schema.STRING) + .subscriptionName("test_sub") + .topic(topic) + .messageListener(new MessageListener() { + @Override + void received(Consumer consumer, Message msg) { + latch.countDown() + consumer.acknowledge(msg) + } + }) + .subscribe() + + producer = client.newProducer(Schema.STRING) + .topic(topic) + .enableBatching(false) + .create() + + def msgId + def msg = UUID.randomUUID().toString() + runWithSpan("parent") { + msgId = producer.send(msg) + } + + latch.await(1, TimeUnit.MINUTES) + + assertTraces(1) { + trace(0, 3) { + span(0) { + name("parent") + kind(INTERNAL) + hasNoParent() + } + + span(1) { + name("PRODUCER/SEND") + kind(PRODUCER) + childOf span(0) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + "$SemanticAttributes.MESSAGE_TYPE" "common" + } + } + + span(2) { + name("CONSUMER/RECEIVE") + kind(CONSUMER) + childOf span(1) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + } + } + + span(3) { + name("CONSUMER/PROCESS") + kind(INTERNAL) + childOf(span(2)) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + } + } + } + } + } + + + def "test send partitioned topic"() { + setup: + def topic = "persistent://public/default/testPartitionedTopic_" + UUID.randomUUID() + admin.topics().createPartitionedTopic(topic, 2) + producer = + client.newProducer(Schema.STRING).topic(topic) + .enableBatching(false).create() + + String msg = UUID.randomUUID().toString() + + def msgId runWithSpan("parent") { - producer.send(UUID.randomUUID().toString().getBytes(Charset.defaultCharset())) + msgId = producer.send(msg) } assertTraces(1) { @@ -74,28 +212,42 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(0) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long } } } } } - def "test send and consume message"() { + def "test consume partitioned topic"() { setup: + def topic = "persistent://public/default/testPartitionedTopic_" + UUID.randomUUID() + admin.topics().createPartitionedTopic(topic, 2) def latch = new CountDownLatch(1) - consumer = client.newConsumer(Schema.BYTES) + consumer = client.newConsumer(Schema.STRING) .subscriptionName("test_sub") - .messageListener(new MessageListener() { + .topic(topic) + .messageListener(new MessageListener() { @Override - void received(Consumer consumer, Message msg) { + void received(Consumer consumer, Message msg) { latch.countDown() consumer.acknowledge(msg) } }) .subscribe() + producer = client.newProducer(Schema.STRING) + .topic(topic) + .enableBatching(false) + .create() + + def msgId + def msg = UUID.randomUUID().toString() runWithSpan("parent") { - producer.send(UUID.randomUUID().toString().getBytes(Charset.defaultCharset())) + msgId = producer.send(msg) } latch.await(1, TimeUnit.MINUTES) @@ -112,18 +264,125 @@ class PulsarClientTest extends AgentInstrumentationSpecification { name("PRODUCER/SEND") kind(PRODUCER) childOf span(0) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + "$SemanticAttributes.MESSAGE_TYPE" "common" + } } span(2) { name("CONSUMER/RECEIVE") kind(CONSUMER) childOf span(1) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + } } span(3) { name("CONSUMER/PROCESS") kind(INTERNAL) childOf(span(2)) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + } + } + } + } + } + + + def "test consume multi-topics"() { + setup: + + def topic = "persistent://public/default/testNonPartitionedTopic_" + UUID.randomUUID() + def topic1 = "persistent://public/default/testNonPartitionedTopic_" + UUID.randomUUID() + producer = client.newProducer(Schema.STRING) + .topic(topic) + .enableBatching(false) + .create() + producer1 = client.newProducer(Schema.STRING) + .topic(topic1) + .enableBatching(false) + .create() + + def latch = new CountDownLatch(2) + + runWithSpan("parent") { + producer.send(UUID.randomUUID().toString()) + producer1.send(UUID.randomUUID().toString()) + } + + consumer = client.newConsumer(Schema.STRING) + .topic(topic1, topic) + .subscriptionName("test_sub") + .messageListener(new MessageListener() { + @Override + void received(Consumer consumer, Message msg) { + latch.countDown() + consumer.acknowledge(msg) + } + }) + .subscribe() + + latch.await(1, TimeUnit.MINUTES) + + assertTraces(1) { + trace(0, 7) { + span(0) { + name("parent") + kind(INTERNAL) + hasNoParent() + } + + def sendSpans = spans.findAll { + it.name.equalsIgnoreCase("PRODUCER/SEND") + } + + sendSpans.forEach { + SpanAssert.assertSpan(it) { + childOf(span(0)) + } + } + + def receiveSpans = spans.findAll { + it.name.equalsIgnoreCase("CONSUMER/RECEIVE") + } + + def processSpans = spans.findAll { + it.name.equalsIgnoreCase("CONSUMER/PROCESS") + } + + receiveSpans.forEach { + def parentSpanId = it.getParentSpanId() + def parent = sendSpans.find { + (it.spanId == parentSpanId) + } + + SpanAssert.assertSpan(it) { + childOf(parent) + } + } + + processSpans.forEach { + def parentSpanId = it.getParentSpanId() + def parent = processSpans.find { + (it.spanId == parentSpanId) + } + + SpanAssert.assertSpan(it) { + childOf(parent) + } } } } From 333f63607a1b8557a9ea9ad82175a5cac017f362 Mon Sep 17 00:00:00 2001 From: daojun Date: Sat, 10 Dec 2022 23:07:27 +0800 Subject: [PATCH 27/48] fix tests --- .../apache-pulsar/apache-pulsar-2.8/javaagent/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/build.gradle.kts b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/build.gradle.kts index 9a63f3aa92f2..12cce38a447f 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/build.gradle.kts +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/build.gradle.kts @@ -16,4 +16,5 @@ dependencies { testImplementation("javax.annotation:javax.annotation-api:1.3.2") testImplementation("org.testcontainers:pulsar:1.17.1") + testImplementation("org.apache.pulsar:pulsar-client-admin:2.8.0") } From db57a7bd1d4a025f598172e5ce6d8ce5c990c110 Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 11 Dec 2022 00:11:34 +0800 Subject: [PATCH 28/48] fix tests --- .../pulsar/v28/PulsarClientTest.groovy | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 16803a6cb76c..fd99993e5217 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -44,14 +44,17 @@ class PulsarClientTest extends AgentInstrumentationSpecification { @Shared private Producer producer1 + @Shared + private String brokerUrl + @Override def setupSpec() { PulsarContainer pulsar = new PulsarContainer(DEFAULT_IMAGE_NAME); pulsar.start() - def url = pulsar.pulsarBrokerUrl - client = PulsarClient.builder().serviceUrl(url).build() - admin = PulsarAdmin.builder().serviceHttpUrl("http://localhost:8080").build() + brokerUrl = pulsar.pulsarBrokerUrl + client = PulsarClient.builder().serviceUrl(brokerUrl).build() + admin = PulsarAdmin.builder().serviceHttpUrl(pulsar.httpServiceUrl).build() } @Override @@ -93,7 +96,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(0) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long @@ -147,7 +150,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(0) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long @@ -161,7 +164,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long @@ -212,7 +215,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(0) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long @@ -266,7 +269,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(0) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long @@ -280,7 +283,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_URL" "pulsar://localhost:6650" + "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long From 3de32aff34db2d26153bb6598fff931bf6aa6167 Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 11 Dec 2022 01:17:20 +0800 Subject: [PATCH 29/48] fix tests --- .../ConsumerAttributesExtractor.java | 5 ++ .../ProducerAttributesExtractor.java | 4 + .../PulsarMessagingAttributesGetter.java | 2 +- .../pulsar/v28/PulsarClientTest.groovy | 81 ++++++++++--------- 4 files changed, 55 insertions(+), 37 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java index b9cd9c44f56c..0caa6099bb8e 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java @@ -10,6 +10,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import javax.annotation.Nullable; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import org.apache.pulsar.client.api.Message; enum ConsumerAttributesExtractor implements AttributesExtractor, Attributes> { @@ -30,5 +31,9 @@ public void onEnd( if (null != attributes && !attributes.isEmpty()) { attributesBuilder.putAll(attributes); } + + if (message.getTopicName() != null) { + attributesBuilder.put(SemanticAttributes.MESSAGING_DESTINATION, message.getTopicName()); + } } } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java index 844e2a675f5f..3ce394fbf751 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java @@ -50,6 +50,10 @@ public void onEnd( attributesBuilder.put(SemanticAttributes.MESSAGE_TYPE, type.name()); } + + if (message.getTopicName() != null) { + attributesBuilder.put(SemanticAttributes.MESSAGING_DESTINATION, message.getTopicName()); + } } enum MessageType { diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java index b4df78364522..775f2e53dd81 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java @@ -29,7 +29,7 @@ public String destinationKind(Message message) { @Nullable @Override public String destination(Message message) { - return message.getTopicName(); + return null; } @Override diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index fd99993e5217..853ca52e8f38 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -97,6 +97,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" "$SemanticAttributes.MESSAGING_URL" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long @@ -150,6 +151,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(0) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() @@ -164,6 +166,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() @@ -177,6 +180,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf(span(2)) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() } @@ -215,6 +219,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(0) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() @@ -269,6 +274,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(0) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() @@ -283,6 +289,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf span(1) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_URL" brokerUrl "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() @@ -296,6 +303,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf(span(2)) attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() } @@ -339,52 +347,53 @@ class PulsarClientTest extends AgentInstrumentationSpecification { .subscribe() latch.await(1, TimeUnit.MINUTES) - - assertTraces(1) { - trace(0, 7) { - span(0) { - name("parent") - kind(INTERNAL) - hasNoParent() - } - - def sendSpans = spans.findAll { - it.name.equalsIgnoreCase("PRODUCER/SEND") - } - - sendSpans.forEach { - SpanAssert.assertSpan(it) { - childOf(span(0)) + if (latch.getCount() == 0) { + assertTraces(1) { + trace(0, 7) { + span(0) { + name("parent") + kind(INTERNAL) + hasNoParent() } - } - def receiveSpans = spans.findAll { - it.name.equalsIgnoreCase("CONSUMER/RECEIVE") - } + def sendSpans = spans.findAll { + it.name.equalsIgnoreCase("PRODUCER/SEND") + } - def processSpans = spans.findAll { - it.name.equalsIgnoreCase("CONSUMER/PROCESS") - } + sendSpans.forEach { + SpanAssert.assertSpan(it) { + childOf(span(0)) + } + } - receiveSpans.forEach { - def parentSpanId = it.getParentSpanId() - def parent = sendSpans.find { - (it.spanId == parentSpanId) + def receiveSpans = spans.findAll { + it.name.equalsIgnoreCase("CONSUMER/RECEIVE") } - SpanAssert.assertSpan(it) { - childOf(parent) + def processSpans = spans.findAll { + it.name.equalsIgnoreCase("CONSUMER/PROCESS") } - } - processSpans.forEach { - def parentSpanId = it.getParentSpanId() - def parent = processSpans.find { - (it.spanId == parentSpanId) + receiveSpans.forEach { + def parentSpanId = it.getParentSpanId() + def parent = sendSpans.find { + (it.spanId == parentSpanId) + } + + SpanAssert.assertSpan(it) { + childOf(parent) + } } - SpanAssert.assertSpan(it) { - childOf(parent) + processSpans.forEach { + def parentSpanId = it.getParentSpanId() + def parent = processSpans.find { + (it.spanId == parentSpanId) + } + + SpanAssert.assertSpan(it) { + childOf(parent) + } } } } From 01b616a516e971e19b2546f66ae480fe34696fb5 Mon Sep 17 00:00:00 2001 From: daojun Date: Sun, 11 Dec 2022 15:34:06 +0800 Subject: [PATCH 30/48] fix tests --- .../pulsar/v28/telemetry/ConsumerAttributesExtractor.java | 2 +- .../instrumentation/pulsar/v28/PulsarClientTest.groovy | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java index 0caa6099bb8e..dbf0e68677d5 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java @@ -9,8 +9,8 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; -import javax.annotation.Nullable; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import javax.annotation.Nullable; import org.apache.pulsar.client.api.Message; enum ConsumerAttributesExtractor implements AttributesExtractor, Attributes> { diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 853ca52e8f38..32b55f88505b 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -156,7 +156,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - "$SemanticAttributes.MESSAGE_TYPE" "common" + "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" } } @@ -279,7 +279,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - "$SemanticAttributes.MESSAGE_TYPE" "common" + "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" } } From 5207cc97c35bc02c94c2f051022f95461070ac1a Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 12 Dec 2022 04:44:33 +0800 Subject: [PATCH 31/48] fix tests --- .../v28/ProducerImplInstrumentation.java | 12 +++++++---- .../pulsar/v28/StringTuple2.java | 20 +++++++++++++++++++ .../pulsar/v28/VirtualFieldStore.java | 13 ++++++------ .../ProducerAttributesExtractor.java | 4 ---- .../pulsar/v28/PulsarClientTest.groovy | 8 ++++---- 5 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/StringTuple2.java diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java index b408d93072f7..ed00c73a779d 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java @@ -57,10 +57,13 @@ private ProducerImplConstructorAdviser() {} @Advice.OnMethodExit public static void intercept( - @Advice.This ProducerImpl producer, @Advice.Argument(value = 0) PulsarClient client) { + @Advice.This ProducerImpl producer, @Advice.Argument(value = 0) PulsarClient client, + @Advice.Argument(value = 1) String topic) { PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String brokerUrl = pulsarClient.getLookup().getServiceUrl(); - VirtualFieldStore.inject(producer, brokerUrl); + topic = topic == null ? "unknown" : topic; + brokerUrl = brokerUrl == null ? "unknown" : topic; + VirtualFieldStore.inject(producer, brokerUrl, topic); } } @@ -108,8 +111,9 @@ public void sendComplete(Exception e) { } Instrumenter, Attributes> instrumenter = PulsarSingletons.producerInstrumenter(); - String brokerUrl = VirtualFieldStore.extract(producer); - Attributes attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, brokerUrl); + StringTuple2 tuple2 = VirtualFieldStore.extract(producer); + Attributes attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, tuple2.f1, + SemanticAttributes.MESSAGING_DESTINATION, tuple2.f2); try (Scope ignore = context.makeCurrent()) { this.delegator.sendComplete(e); diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/StringTuple2.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/StringTuple2.java new file mode 100644 index 000000000000..e8f98e4929f1 --- /dev/null +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/StringTuple2.java @@ -0,0 +1,20 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.v28; + +public class StringTuple2 { + public final String f1; + public final String f2; + + private StringTuple2(String f1, String f2) { + this.f1 = f1; + this.f2 = f2; + } + + public static StringTuple2 create(String f1, String f2) { + return new StringTuple2(f1, f2); + } +} diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java index 48a1101ca8fc..55336c34558d 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java @@ -15,8 +15,8 @@ public class VirtualFieldStore { private static final VirtualField, Context> MSG_FIELD = VirtualField.find(Message.class, Context.class); - private static final VirtualField, String> PRODUCER_FIELD = - VirtualField.find(Producer.class, String.class); + private static final VirtualField, StringTuple2> PRODUCER_FIELD = + VirtualField.find(Producer.class, StringTuple2.class); private static final VirtualField, String> CONSUMER_FIELD = VirtualField.find(Consumer.class, String.class); @@ -32,8 +32,8 @@ public static void inject(Message instance, Context context) { } } - public static void inject(Producer instance, String serviceUrl) { - PRODUCER_FIELD.set(instance, serviceUrl); + public static void inject(Producer instance, String serviceUrl, String topic) { + PRODUCER_FIELD.set(instance, StringTuple2.create(serviceUrl, topic)); } public static void inject(Consumer instance, String serviceUrl) { @@ -52,9 +52,8 @@ public static Context extract(Message instance) { return ctx == null ? Context.current() : ctx; } - public static String extract(Producer instance) { - String brokerUrl = PRODUCER_FIELD.get(instance); - return brokerUrl == null ? "unknown" : brokerUrl; + public static StringTuple2 extract(Producer instance) { + return PRODUCER_FIELD.get(instance); } public static String extract(Consumer instance) { diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java index 3ce394fbf751..844e2a675f5f 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java @@ -50,10 +50,6 @@ public void onEnd( attributesBuilder.put(SemanticAttributes.MESSAGE_TYPE, type.name()); } - - if (message.getTopicName() != null) { - attributesBuilder.put(SemanticAttributes.MESSAGING_DESTINATION, message.getTopicName()); - } } enum MessageType { diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 32b55f88505b..f17b8b95397b 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -83,7 +83,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { } assertTraces(1) { - trace(0, 3) { + trace(0, 2) { span(0) { name("parent") kind(INTERNAL) @@ -138,7 +138,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { latch.await(1, TimeUnit.MINUTES) assertTraces(1) { - trace(0, 3) { + trace(0, 4) { span(0) { name("parent") kind(INTERNAL) @@ -206,7 +206,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { } assertTraces(1) { - trace(0, 3) { + trace(0, 2) { span(0) { name("parent") kind(INTERNAL) @@ -261,7 +261,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { latch.await(1, TimeUnit.MINUTES) assertTraces(1) { - trace(0, 3) { + trace(0, 4) { span(0) { name("parent") kind(INTERNAL) From 1f307c6c872a8421818baef814a73ff4efc7b485 Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 12 Dec 2022 16:04:52 +0800 Subject: [PATCH 32/48] fix checkstyle --- .../pulsar/v28/ProducerImplInstrumentation.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java index ed00c73a779d..fc4ba6cea186 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java @@ -57,7 +57,8 @@ private ProducerImplConstructorAdviser() {} @Advice.OnMethodExit public static void intercept( - @Advice.This ProducerImpl producer, @Advice.Argument(value = 0) PulsarClient client, + @Advice.This ProducerImpl producer, + @Advice.Argument(value = 0) PulsarClient client, @Advice.Argument(value = 1) String topic) { PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String brokerUrl = pulsarClient.getLookup().getServiceUrl(); @@ -112,8 +113,12 @@ public void sendComplete(Exception e) { Instrumenter, Attributes> instrumenter = PulsarSingletons.producerInstrumenter(); StringTuple2 tuple2 = VirtualFieldStore.extract(producer); - Attributes attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, tuple2.f1, - SemanticAttributes.MESSAGING_DESTINATION, tuple2.f2); + Attributes attributes = + Attributes.of( + SemanticAttributes.MESSAGING_URL, + tuple2.f1, + SemanticAttributes.MESSAGING_DESTINATION, + tuple2.f2); try (Scope ignore = context.makeCurrent()) { this.delegator.sendComplete(e); From fbeb11e9b3d16264f37192e39bd3f6b52fbb283c Mon Sep 17 00:00:00 2001 From: daojun Date: Wed, 14 Dec 2022 01:12:16 +0800 Subject: [PATCH 33/48] fix instrumentation & test --- .../pulsar/v28/ProducerImplInstrumentation.java | 11 +++++++---- .../pulsar/v28/PulsarClientTest.groovy | 2 ++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java index fc4ba6cea186..6a9a026012e2 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.pulsar.v28; +import static net.bytebuddy.matcher.ElementMatchers.hasSuperType; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; @@ -41,7 +42,10 @@ public ElementMatcher typeMatcher() { @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( - isConstructor().and(isPublic()), + isConstructor() + .and(isPublic()) + .and( + takesArgument(0, hasSuperType(named("org.apache.pulsar.client.api.PulsarClient")))), ProducerImplInstrumentation.class.getName() + "$ProducerImplConstructorAdviser"); transformer.applyAdviceToMethod( @@ -57,11 +61,10 @@ private ProducerImplConstructorAdviser() {} @Advice.OnMethodExit public static void intercept( - @Advice.This ProducerImpl producer, - @Advice.Argument(value = 0) PulsarClient client, - @Advice.Argument(value = 1) String topic) { + @Advice.This ProducerImpl producer, @Advice.Argument(value = 0) PulsarClient client) { PulsarClientImpl pulsarClient = (PulsarClientImpl) client; String brokerUrl = pulsarClient.getLookup().getServiceUrl(); + String topic = producer.getTopic(); topic = topic == null ? "unknown" : topic; brokerUrl = brokerUrl == null ? "unknown" : topic; VirtualFieldStore.inject(producer, brokerUrl, topic); diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index f17b8b95397b..2c056bee633c 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -15,6 +15,7 @@ import org.apache.pulsar.client.api.MessageListener import org.apache.pulsar.client.api.Producer import org.apache.pulsar.client.api.PulsarClient import org.apache.pulsar.client.api.Schema +import org.apache.pulsar.client.api.SubscriptionInitialPosition import org.testcontainers.containers.PulsarContainer import org.testcontainers.utility.DockerImageName import spock.lang.Shared @@ -337,6 +338,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { consumer = client.newConsumer(Schema.STRING) .topic(topic1, topic) .subscriptionName("test_sub") + .subscriptionInitialPosition(SubscriptionInitialPosition.Earliest) .messageListener(new MessageListener() { @Override void received(Consumer consumer, Message msg) { From ab5f0c5ce523ed623dbb747ffb4bc267be3bb009 Mon Sep 17 00:00:00 2001 From: daojun Date: Wed, 14 Dec 2022 03:38:20 +0800 Subject: [PATCH 34/48] fix instrumentation --- .../instrumentation/pulsar/v28/ProducerImplInstrumentation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java index 6a9a026012e2..27634a7d65d9 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java @@ -66,7 +66,7 @@ public static void intercept( String brokerUrl = pulsarClient.getLookup().getServiceUrl(); String topic = producer.getTopic(); topic = topic == null ? "unknown" : topic; - brokerUrl = brokerUrl == null ? "unknown" : topic; + brokerUrl = brokerUrl == null ? "unknown" : brokerUrl; VirtualFieldStore.inject(producer, brokerUrl, topic); } } From e0f214ddb7ff4982365045617d0d63c51ebd2dfa Mon Sep 17 00:00:00 2001 From: daojun Date: Thu, 15 Dec 2022 14:10:03 +0800 Subject: [PATCH 35/48] fix test `test send non-partitioned topic` --- .../pulsar/v28/PulsarClientTest.groovy | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 2c056bee633c..435dce0eef79 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.pulsar.v28 import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification import io.opentelemetry.instrumentation.test.asserts.SpanAssert +import io.opentelemetry.sdk.trace.data.SpanData import io.opentelemetry.semconv.trace.attributes.SemanticAttributes import org.apache.pulsar.client.admin.PulsarAdmin import org.apache.pulsar.client.api.Consumer @@ -50,7 +51,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { @Override def setupSpec() { - PulsarContainer pulsar = new PulsarContainer(DEFAULT_IMAGE_NAME); + pulsar = new PulsarContainer(DEFAULT_IMAGE_NAME); pulsar.start() brokerUrl = pulsar.pulsarBrokerUrl @@ -85,19 +86,27 @@ class PulsarClientTest extends AgentInstrumentationSpecification { assertTraces(1) { trace(0, 2) { - span(0) { + SpanData parent = spans.find { + it0 -> + it0.name.equalsIgnoreCase("parent") + } + SpanData producer = spans.find { + it0 -> + it0.name.equalsIgnoreCase("PRODUCER/SEND") + } + SpanAssert.assertSpan(parent) { name("parent") kind(INTERNAL) hasNoParent() } - - span(1) { + SpanAssert.assertSpan(producer) { name("PRODUCER/SEND") kind(PRODUCER) - childOf span(0) + childOf parent attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" "$SemanticAttributes.MESSAGING_URL" brokerUrl + "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() From 8328ca1377493da2aa32629304075e87481ab23a Mon Sep 17 00:00:00 2001 From: daojun Date: Thu, 15 Dec 2022 16:14:07 +0800 Subject: [PATCH 36/48] fix test `test send non-partitioned topic` --- .../pulsar/v28/PulsarClientTest.groovy | 65 ++++++++++--------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 435dce0eef79..5002f5a2266d 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -7,7 +7,6 @@ package io.opentelemetry.javaagent.instrumentation.pulsar.v28 import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification import io.opentelemetry.instrumentation.test.asserts.SpanAssert -import io.opentelemetry.sdk.trace.data.SpanData import io.opentelemetry.semconv.trace.attributes.SemanticAttributes import org.apache.pulsar.client.admin.PulsarAdmin import org.apache.pulsar.client.api.Consumer @@ -17,6 +16,7 @@ import org.apache.pulsar.client.api.Producer import org.apache.pulsar.client.api.PulsarClient import org.apache.pulsar.client.api.Schema import org.apache.pulsar.client.api.SubscriptionInitialPosition +import org.junit.Assert import org.testcontainers.containers.PulsarContainer import org.testcontainers.utility.DockerImageName import spock.lang.Shared @@ -84,34 +84,41 @@ class PulsarClientTest extends AgentInstrumentationSpecification { msgId = producer.send(msg) } - assertTraces(1) { - trace(0, 2) { - SpanData parent = spans.find { - it0 -> - it0.name.equalsIgnoreCase("parent") - } - SpanData producer = spans.find { - it0 -> - it0.name.equalsIgnoreCase("PRODUCER/SEND") - } - SpanAssert.assertSpan(parent) { - name("parent") - kind(INTERNAL) - hasNoParent() - } - SpanAssert.assertSpan(producer) { - name("PRODUCER/SEND") - kind(PRODUCER) - childOf parent - attributes { - "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" - "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_DESTINATION" topic - "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - } + def traces = waitForTraces(1) + Assert.assertEquals(traces.size(), 1) + def spans = traces[0] + Assert.assertEquals(spans.size(), 2) + def parent = spans.find { + it0 -> + it0.name.equalsIgnoreCase("parent") + } + def producer = spans.find { + it0 -> + it0.name.equalsIgnoreCase("PRODUCER/SEND") + } + Assert.assertNotNull(parent) + Assert.assertNotNull(producer) + + SpanAssert.assertSpan(parent) { + name("parent") + kind(INTERNAL) + hasNoParent() + } + + SpanAssert.assertSpan(producer) { + name("PRODUCER/SEND") + kind(PRODUCER) + childOf parent + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_URL" brokerUrl + "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" + "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + attribute(SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES.key) { + v -> + Assert.assertTrue(v instanceof Long) && v > 0 } } } From 5a6917bd2e648dfeacf19003f5700374e4b58eb1 Mon Sep 17 00:00:00 2001 From: daojun Date: Thu, 15 Dec 2022 17:13:31 +0800 Subject: [PATCH 37/48] fix test `test send non-partitioned topic` --- .../instrumentation/pulsar/v28/PulsarClientTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 5002f5a2266d..fd1a4f39969c 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -118,7 +118,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() attribute(SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES.key) { v -> - Assert.assertTrue(v instanceof Long) && v > 0 + return v instanceof Long && v > 0 } } } From c8b755159310a1784ec34b41a0438722fde06f5d Mon Sep 17 00:00:00 2001 From: daojun Date: Thu, 15 Dec 2022 18:52:29 +0800 Subject: [PATCH 38/48] fix all tests --- .../pulsar/v28/PulsarClientTest.groovy | 377 ++++++++++-------- 1 file changed, 220 insertions(+), 157 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index fd1a4f39969c..ed7bda55d76a 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -116,10 +116,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - attribute(SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES.key) { - v -> - return v instanceof Long && v > 0 - } + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long } } } @@ -132,6 +129,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { consumer = client.newConsumer(Schema.STRING) .subscriptionName("test_sub") .topic(topic) + .subscriptionInitialPosition(SubscriptionInitialPosition.Earliest) .messageListener(new MessageListener() { @Override void received(Consumer consumer, Message msg) { @@ -154,54 +152,73 @@ class PulsarClientTest extends AgentInstrumentationSpecification { latch.await(1, TimeUnit.MINUTES) - assertTraces(1) { - trace(0, 4) { - span(0) { - name("parent") - kind(INTERNAL) - hasNoParent() - } + def traces = waitForTraces(1) + def spans = traces[0] + Assert.assertEquals(spans.size(), 4) + def parent = spans.find { + it0 -> + it0.name.equalsIgnoreCase("parent") + } + def send = spans.find { + it0 -> + it0.name.equalsIgnoreCase("PRODUCER/SEND") + } + def receive = spans.find { + it0 -> + it0.name.equalsIgnoreCase("CONSUMER/RECEIVE") + } - span(1) { - name("PRODUCER/SEND") - kind(PRODUCER) - childOf span(0) - attributes { - "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION" topic - "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" - } - } + def process = spans.find { + it0 -> + it0.name.equalsIgnoreCase("CONSUMER/PROCESS") + } - span(2) { - name("CONSUMER/RECEIVE") - kind(CONSUMER) - childOf span(1) - attributes { - "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION" topic - "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - } - } + SpanAssert.assertSpan(parent) { + name("parent") + kind(INTERNAL) + hasNoParent() + } - span(3) { - name("CONSUMER/PROCESS") - kind(INTERNAL) - childOf(span(2)) - attributes { - "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_DESTINATION" topic - "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - } - } + SpanAssert.assertSpan(send) { + name("PRODUCER/SEND") + kind(PRODUCER) + childOf parent + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" + "$SemanticAttributes.MESSAGING_URL" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" + } + } + + SpanAssert.assertSpan(receive) { + name("CONSUMER/RECEIVE") + kind(CONSUMER) + childOf(send) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" + "$SemanticAttributes.MESSAGING_URL" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + "$SemanticAttributes.MESSAGING_OPERATION" "RECEIVE" + } + } + + SpanAssert.assertSpan(process) { + name("CONSUMER/PROCESS") + kind(INTERNAL) + childOf(receive) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" + "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_OPERATION" "RECEIVE" } } } @@ -222,27 +239,40 @@ class PulsarClientTest extends AgentInstrumentationSpecification { msgId = producer.send(msg) } - assertTraces(1) { - trace(0, 2) { - span(0) { - name("parent") - kind(INTERNAL) - hasNoParent() - } + def traces = waitForTraces(1) + def spans = traces[0] + Assert.assertEquals(spans.size(), 4) - span(1) { - name("PRODUCER/SEND") - kind(PRODUCER) - childOf span(0) - attributes { - "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) - "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - } + def parent = spans.find { + it0 -> + it0.name.equalsIgnoreCase("parent") + } + def send = spans.find { + it0 -> + it0.name.equalsIgnoreCase("PRODUCER/SEND") + } + + SpanAssert.assertSpan(parent) { + name("parent") + kind(INTERNAL) + hasNoParent() + } + + SpanAssert.assertSpan(send) { + name("PRODUCER/SEND") + kind(PRODUCER) + childOf parent + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" + "$SemanticAttributes.MESSAGING_URL" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION" { + t -> + return t.toString().contains(topic) } + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" } } } @@ -277,54 +307,85 @@ class PulsarClientTest extends AgentInstrumentationSpecification { latch.await(1, TimeUnit.MINUTES) - assertTraces(1) { - trace(0, 4) { - span(0) { - name("parent") - kind(INTERNAL) - hasNoParent() - } + def traces = waitForTraces(1) + Assert.assertEquals(traces.size(), 1) + def spans = traces[0] + Assert.assertEquals(spans.size(), 4) + + def parent = spans.find { + it0 -> + it0.name.equalsIgnoreCase("parent") + } + def send = spans.find { + it0 -> + it0.name.equalsIgnoreCase("PRODUCER/SEND") + } + def receive = spans.find { + it0 -> + it0.name.equalsIgnoreCase("CONSUMER/RECEIVE") + } - span(1) { - name("PRODUCER/SEND") - kind(PRODUCER) - childOf span(0) - attributes { - "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) - "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" - } + def process = spans.find { + it0 -> + it0.name.equalsIgnoreCase("CONSUMER/PROCESS") + } + + SpanAssert.assertSpan(parent) { + name("parent") + kind(INTERNAL) + hasNoParent() + } + + SpanAssert.assertSpan(send) { + name("PRODUCER/SEND") + kind(PRODUCER) + childOf parent + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" + "$SemanticAttributes.MESSAGING_URL" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION" { + v -> + return v.toString().contains(topic) } + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" + } + } - span(2) { - name("CONSUMER/RECEIVE") - kind(CONSUMER) - childOf span(1) - attributes { - "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) - "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - } + SpanAssert.assertSpan(receive) { + name("CONSUMER/RECEIVE") + kind(CONSUMER) + childOf(send) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" + "$SemanticAttributes.MESSAGING_URL" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION" { + v -> + return v.toString().contains(topic) } + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + "$SemanticAttributes.MESSAGING_OPERATION" "RECEIVE" + } + } - span(3) { - name("CONSUMER/PROCESS") - kind(INTERNAL) - childOf(span(2)) - attributes { - "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_DESTINATION".contains(topic) - "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - } + SpanAssert.assertSpan(process) { + name("CONSUMER/PROCESS") + kind(INTERNAL) + childOf(receive) + attributes { + "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" + "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" + "$SemanticAttributes.MESSAGING_DESTINATION" { + v -> + return v.toString().contains(topic) } + "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long + "$SemanticAttributes.MESSAGING_OPERATION" "PROCESS" } } } @@ -365,54 +426,56 @@ class PulsarClientTest extends AgentInstrumentationSpecification { .subscribe() latch.await(1, TimeUnit.MINUTES) + if (latch.getCount() == 0) { - assertTraces(1) { - trace(0, 7) { - span(0) { - name("parent") - kind(INTERNAL) - hasNoParent() - } - - def sendSpans = spans.findAll { - it.name.equalsIgnoreCase("PRODUCER/SEND") - } - - sendSpans.forEach { - SpanAssert.assertSpan(it) { - childOf(span(0)) - } - } - - def receiveSpans = spans.findAll { - it.name.equalsIgnoreCase("CONSUMER/RECEIVE") - } - - def processSpans = spans.findAll { - it.name.equalsIgnoreCase("CONSUMER/PROCESS") - } - - receiveSpans.forEach { - def parentSpanId = it.getParentSpanId() - def parent = sendSpans.find { - (it.spanId == parentSpanId) - } - - SpanAssert.assertSpan(it) { - childOf(parent) - } - } - - processSpans.forEach { - def parentSpanId = it.getParentSpanId() - def parent = processSpans.find { - (it.spanId == parentSpanId) - } - - SpanAssert.assertSpan(it) { - childOf(parent) - } - } + def traces = waitForTraces(1) + Assert.assertEquals(traces.size(), 1) + def spans = traces[0] + Assert.assertEquals(spans.size(), 7) + + def parent = spans.find { + it0 -> + it0.name.equalsIgnoreCase("parent") + } + + + def sendSpans = spans.findAll { + it.name.equalsIgnoreCase("PRODUCER/SEND") + } + + sendSpans.forEach { + SpanAssert.assertSpan(it) { + childOf(parent) + } + } + + def receiveSpans = spans.findAll { + it.name.equalsIgnoreCase("CONSUMER/RECEIVE") + } + + def processSpans = spans.findAll { + it.name.equalsIgnoreCase("CONSUMER/PROCESS") + } + + receiveSpans.forEach { + def parentSpanId = it.getParentSpanId() + def parent0 = sendSpans.find { + (it.spanId == parentSpanId) + } + + SpanAssert.assertSpan(it) { + childOf(parent0) + } + } + + processSpans.forEach { + def parentSpanId = it.getParentSpanId() + def parent0 = processSpans.find { + (it.spanId == parentSpanId) + } + + SpanAssert.assertSpan(it) { + childOf(parent0) } } } From 7fe73290165303398adf90845bed1359ef12a81f Mon Sep 17 00:00:00 2001 From: daojun Date: Thu, 15 Dec 2022 21:33:38 +0800 Subject: [PATCH 39/48] fix all tests --- .../pulsar/v28/PulsarClientTest.groovy | 93 +++++++++---------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index ed7bda55d76a..b9a243605da6 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -16,12 +16,12 @@ import org.apache.pulsar.client.api.Producer import org.apache.pulsar.client.api.PulsarClient import org.apache.pulsar.client.api.Schema import org.apache.pulsar.client.api.SubscriptionInitialPosition +import org.awaitility.Awaitility import org.junit.Assert import org.testcontainers.containers.PulsarContainer import org.testcontainers.utility.DockerImageName import spock.lang.Shared -import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit import static io.opentelemetry.api.trace.SpanKind.CONSUMER @@ -125,7 +125,6 @@ class PulsarClientTest extends AgentInstrumentationSpecification { setup: def topic = "persistent://public/default/testNonPartitionedTopic_" + UUID.randomUUID() admin.topics().createNonPartitionedTopic(topic) - def latch = new CountDownLatch(1) consumer = client.newConsumer(Schema.STRING) .subscriptionName("test_sub") .topic(topic) @@ -133,7 +132,6 @@ class PulsarClientTest extends AgentInstrumentationSpecification { .messageListener(new MessageListener() { @Override void received(Consumer consumer, Message msg) { - latch.countDown() consumer.acknowledge(msg) } }) @@ -150,10 +148,9 @@ class PulsarClientTest extends AgentInstrumentationSpecification { msgId = producer.send(msg) } - latch.await(1, TimeUnit.MINUTES) - def traces = waitForTraces(1) def spans = traces[0] + Awaitility.waitAtMost(1, TimeUnit.MINUTES).until(() -> spans.size() == 4) Assert.assertEquals(spans.size(), 4) def parent = spans.find { it0 -> @@ -205,7 +202,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - "$SemanticAttributes.MESSAGING_OPERATION" "RECEIVE" + "$SemanticAttributes.MESSAGING_OPERATION" "receive" } } @@ -218,7 +215,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() - "$SemanticAttributes.MESSAGING_OPERATION" "RECEIVE" + "$SemanticAttributes.MESSAGING_OPERATION" "process" } } } @@ -241,7 +238,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { def traces = waitForTraces(1) def spans = traces[0] - Assert.assertEquals(spans.size(), 4) + Assert.assertEquals(spans.size(), 2) def parent = spans.find { it0 -> @@ -281,14 +278,13 @@ class PulsarClientTest extends AgentInstrumentationSpecification { setup: def topic = "persistent://public/default/testPartitionedTopic_" + UUID.randomUUID() admin.topics().createPartitionedTopic(topic, 2) - def latch = new CountDownLatch(1) consumer = client.newConsumer(Schema.STRING) .subscriptionName("test_sub") + .subscriptionInitialPosition(SubscriptionInitialPosition.Earliest) .topic(topic) .messageListener(new MessageListener() { @Override void received(Consumer consumer, Message msg) { - latch.countDown() consumer.acknowledge(msg) } }) @@ -305,11 +301,10 @@ class PulsarClientTest extends AgentInstrumentationSpecification { msgId = producer.send(msg) } - latch.await(1, TimeUnit.MINUTES) - def traces = waitForTraces(1) Assert.assertEquals(traces.size(), 1) def spans = traces[0] + Awaitility.waitAtMost(1, TimeUnit.MINUTES).until(() -> spans.size() == 4) Assert.assertEquals(spans.size(), 4) def parent = spans.find { @@ -405,8 +400,6 @@ class PulsarClientTest extends AgentInstrumentationSpecification { .enableBatching(false) .create() - def latch = new CountDownLatch(2) - runWithSpan("parent") { producer.send(UUID.randomUUID().toString()) producer1.send(UUID.randomUUID().toString()) @@ -419,65 +412,69 @@ class PulsarClientTest extends AgentInstrumentationSpecification { .messageListener(new MessageListener() { @Override void received(Consumer consumer, Message msg) { - latch.countDown() consumer.acknowledge(msg) } }) .subscribe() - latch.await(1, TimeUnit.MINUTES) - - if (latch.getCount() == 0) { - def traces = waitForTraces(1) - Assert.assertEquals(traces.size(), 1) - def spans = traces[0] - Assert.assertEquals(spans.size(), 7) + def traces = waitForTraces(1) + Assert.assertEquals(traces.size(), 1) + def spans = traces[0] + Awaitility.waitAtMost(1, TimeUnit.MINUTES).until(() -> spans.size() == 7) + Assert.assertEquals(spans.size(), 7) - def parent = spans.find { - it0 -> - it0.name.equalsIgnoreCase("parent") - } + def parent = spans.find { + it0 -> + it0.name.equalsIgnoreCase("parent") + } - def sendSpans = spans.findAll { - it.name.equalsIgnoreCase("PRODUCER/SEND") - } + def sendSpans = spans.findAll { + it0 -> + it0.name.equalsIgnoreCase("PRODUCER/SEND") + } - sendSpans.forEach { - SpanAssert.assertSpan(it) { + sendSpans.forEach { + it0 -> + SpanAssert.assertSpan(it0) { childOf(parent) } - } + } - def receiveSpans = spans.findAll { - it.name.equalsIgnoreCase("CONSUMER/RECEIVE") - } + def receiveSpans = spans.findAll { + it0 -> + it0.name.equalsIgnoreCase("CONSUMER/RECEIVE") + } - def processSpans = spans.findAll { - it.name.equalsIgnoreCase("CONSUMER/PROCESS") - } + def processSpans = spans.findAll { + it0 -> + it0.name.equalsIgnoreCase("CONSUMER/PROCESS") + } - receiveSpans.forEach { - def parentSpanId = it.getParentSpanId() + receiveSpans.forEach { + it0 -> + def parentSpanId = it0.getParentSpanId() def parent0 = sendSpans.find { - (it.spanId == parentSpanId) + v -> + (v.spanId == parentSpanId) } - SpanAssert.assertSpan(it) { + SpanAssert.assertSpan(it0) { childOf(parent0) } - } + } - processSpans.forEach { - def parentSpanId = it.getParentSpanId() + processSpans.forEach { + it0 -> + def parentSpanId = it0.getParentSpanId() def parent0 = processSpans.find { - (it.spanId == parentSpanId) + v -> + (v.spanId == parentSpanId) } - SpanAssert.assertSpan(it) { + SpanAssert.assertSpan(it0) { childOf(parent0) } - } } } } From 8dd1207c6fb3fece7bd0dc085643add8c4b0468d Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 19 Dec 2022 23:52:00 +0800 Subject: [PATCH 40/48] fix tests --- .../pulsar/v28/PulsarClientTest.groovy | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index b9a243605da6..1c230624b941 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -16,12 +16,12 @@ import org.apache.pulsar.client.api.Producer import org.apache.pulsar.client.api.PulsarClient import org.apache.pulsar.client.api.Schema import org.apache.pulsar.client.api.SubscriptionInitialPosition -import org.awaitility.Awaitility import org.junit.Assert import org.testcontainers.containers.PulsarContainer import org.testcontainers.utility.DockerImageName import spock.lang.Shared +import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit import static io.opentelemetry.api.trace.SpanKind.CONSUMER @@ -124,6 +124,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { def "test consume non-partitioned topic"() { setup: def topic = "persistent://public/default/testNonPartitionedTopic_" + UUID.randomUUID() + def latch = new CountDownLatch(1) admin.topics().createNonPartitionedTopic(topic) consumer = client.newConsumer(Schema.STRING) .subscriptionName("test_sub") @@ -133,6 +134,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { @Override void received(Consumer consumer, Message msg) { consumer.acknowledge(msg) + latch.countDown() } }) .subscribe() @@ -148,9 +150,12 @@ class PulsarClientTest extends AgentInstrumentationSpecification { msgId = producer.send(msg) } + latch.await(1, TimeUnit.MINUTES) + // Wait until all the spans finished. + Thread.sleep(TimeUnit.SECONDS.toMillis(20)) + def traces = waitForTraces(1) def spans = traces[0] - Awaitility.waitAtMost(1, TimeUnit.MINUTES).until(() -> spans.size() == 4) Assert.assertEquals(spans.size(), 4) def parent = spans.find { it0 -> @@ -278,6 +283,8 @@ class PulsarClientTest extends AgentInstrumentationSpecification { setup: def topic = "persistent://public/default/testPartitionedTopic_" + UUID.randomUUID() admin.topics().createPartitionedTopic(topic, 2) + + def latch = new CountDownLatch(1) consumer = client.newConsumer(Schema.STRING) .subscriptionName("test_sub") .subscriptionInitialPosition(SubscriptionInitialPosition.Earliest) @@ -286,6 +293,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { @Override void received(Consumer consumer, Message msg) { consumer.acknowledge(msg) + latch.countDown() } }) .subscribe() @@ -301,10 +309,13 @@ class PulsarClientTest extends AgentInstrumentationSpecification { msgId = producer.send(msg) } + latch.await(1, TimeUnit.MINUTES) + // Wait until all the spans finished. + Thread.sleep(TimeUnit.SECONDS.toMillis(20)) + def traces = waitForTraces(1) Assert.assertEquals(traces.size(), 1) def spans = traces[0] - Awaitility.waitAtMost(1, TimeUnit.MINUTES).until(() -> spans.size() == 4) Assert.assertEquals(spans.size(), 4) def parent = spans.find { @@ -391,6 +402,8 @@ class PulsarClientTest extends AgentInstrumentationSpecification { def topic = "persistent://public/default/testNonPartitionedTopic_" + UUID.randomUUID() def topic1 = "persistent://public/default/testNonPartitionedTopic_" + UUID.randomUUID() + + def latch = new CountDownLatch(2) producer = client.newProducer(Schema.STRING) .topic(topic) .enableBatching(false) @@ -413,14 +426,18 @@ class PulsarClientTest extends AgentInstrumentationSpecification { @Override void received(Consumer consumer, Message msg) { consumer.acknowledge(msg) + latch.countDown() } }) .subscribe() + latch.await(1, TimeUnit.MINUTES) + // Wait until all the spans finished. + Thread.sleep(TimeUnit.SECONDS.toMillis(20)) + def traces = waitForTraces(1) Assert.assertEquals(traces.size(), 1) def spans = traces[0] - Awaitility.waitAtMost(1, TimeUnit.MINUTES).until(() -> spans.size() == 7) Assert.assertEquals(spans.size(), 7) def parent = spans.find { From b704cd8e58ff0c09d6830bce04427f380384597d Mon Sep 17 00:00:00 2001 From: daojun Date: Tue, 20 Dec 2022 15:16:12 +0800 Subject: [PATCH 41/48] fix tests --- .../pulsar/v28/PulsarClientTest.groovy | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 1c230624b941..b544d6de75d6 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -221,6 +221,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { "$SemanticAttributes.MESSAGING_DESTINATION" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_OPERATION" "process" + "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long } } } @@ -374,7 +375,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { } "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - "$SemanticAttributes.MESSAGING_OPERATION" "RECEIVE" + "$SemanticAttributes.MESSAGING_OPERATION" "receive" } } @@ -391,7 +392,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { } "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long - "$SemanticAttributes.MESSAGING_OPERATION" "PROCESS" + "$SemanticAttributes.MESSAGING_OPERATION" "process" } } } @@ -445,6 +446,11 @@ class PulsarClientTest extends AgentInstrumentationSpecification { it0.name.equalsIgnoreCase("parent") } + SpanAssert.assertSpan(parent) { + hasNoParent() + kind(INTERNAL) + } + def sendSpans = spans.findAll { it0 -> @@ -454,6 +460,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { sendSpans.forEach { it0 -> SpanAssert.assertSpan(it0) { + kind(PRODUCER) childOf(parent) } } @@ -477,6 +484,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { } SpanAssert.assertSpan(it0) { + kind(CONSUMER) childOf(parent0) } } @@ -490,6 +498,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { } SpanAssert.assertSpan(it0) { + kind(CONSUMER) childOf(parent0) } } From 90268c2fdcf4e62e79f926ebdc316ff62bcb415e Mon Sep 17 00:00:00 2001 From: daojun Date: Tue, 20 Dec 2022 21:13:27 +0800 Subject: [PATCH 42/48] fix tests --- .../instrumentation/pulsar/v28/PulsarClientTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index b544d6de75d6..97c1e46f3f86 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -498,7 +498,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { } SpanAssert.assertSpan(it0) { - kind(CONSUMER) + kind(INTERNAL) childOf(parent0) } } From 2e02517406938e7fa6853949cad98fda46007ffe Mon Sep 17 00:00:00 2001 From: daojun Date: Wed, 21 Dec 2022 01:46:02 +0800 Subject: [PATCH 43/48] fix tests --- .../instrumentation/pulsar/v28/PulsarClientTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 97c1e46f3f86..5c6304d186a7 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -492,7 +492,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { processSpans.forEach { it0 -> def parentSpanId = it0.getParentSpanId() - def parent0 = processSpans.find { + def parent0 = receiveSpans.find { v -> (v.spanId == parentSpanId) } From 5c05c29d94ba5e41e267ccfb10c6771bb6c50b00 Mon Sep 17 00:00:00 2001 From: daojun Date: Wed, 21 Dec 2022 02:42:23 +0800 Subject: [PATCH 44/48] fix tests codenarc --- .../instrumentation/pulsar/v28/PulsarClientTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 5c6304d186a7..09c817dc32dd 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -51,7 +51,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { @Override def setupSpec() { - pulsar = new PulsarContainer(DEFAULT_IMAGE_NAME); + pulsar = new PulsarContainer(DEFAULT_IMAGE_NAME) pulsar.start() brokerUrl = pulsar.pulsarBrokerUrl From cdc53bd154887dbedc8d80378541cc0f90e956be Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 27 Feb 2023 20:48:42 +0800 Subject: [PATCH 45/48] review fix --- .../v28/ConsumerImplInstrumentation.java | 9 +++++---- .../pulsar/v28/ProducerData.java | 20 +++++++++++++++++++ .../v28/ProducerImplInstrumentation.java | 6 +++--- .../pulsar/v28/StringTuple2.java | 20 ------------------- .../pulsar/v28/VirtualFieldStore.java | 8 ++++---- .../ConsumerAttributesExtractor.java | 2 +- .../v28/telemetry/MessageTextMapGetter.java | 2 +- .../ProducerAttributesExtractor.java | 2 +- .../PulsarMessagingAttributesGetter.java | 4 ++-- .../v28/telemetry/PulsarSingletons.java | 8 ++++---- 10 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerData.java delete mode 100644 instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/StringTuple2.java diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java index db48b7fdaad9..ada230c8f22f 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java @@ -11,6 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isProtected; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -30,8 +31,8 @@ public class ConsumerImplInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { - return named("org.apache.pulsar.client.impl.ConsumerImpl") - .or(named("org.apache.pulsar.client.impl.MultiTopicsConsumerImpl")); + return namedOneOf("org.apache.pulsar.client.impl.ConsumerImpl", + "org.apache.pulsar.client.impl.MultiTopicsConsumerImpl"); } @Override @@ -53,7 +54,7 @@ public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( isMethod() .and(isPublic()) - .and(named("receive").or(named("batchReceive"))) + .and(namedOneOf("receive", "batchReceive")) .and(takesArguments(0)), klassName + "$ConsumerSyncReceiveAdviser"); // receiveAsync/batchReceiveAsync will apply to @@ -61,7 +62,7 @@ public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( isMethod() .and(isPublic()) - .and(named("receiveAsync").or(named("batchReceiveAsync"))) + .and(namedOneOf("receiveAsync", "batchReceiveAsync")) .and(takesArguments(0)), klassName + "$ConsumerAsyncReceiveAdviser"); } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerData.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerData.java new file mode 100644 index 000000000000..ad9d2290c1e3 --- /dev/null +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerData.java @@ -0,0 +1,20 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.v28; + +public class ProducerData { + public final String url; + public final String topic; + + private ProducerData(String url, String topic) { + this.url = url; + this.topic = topic; + } + + public static ProducerData create(String url, String topic) { + return new ProducerData(url, topic); + } +} diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java index 27634a7d65d9..e9d3ccfd13ef 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java @@ -115,13 +115,13 @@ public void sendComplete(Exception e) { } Instrumenter, Attributes> instrumenter = PulsarSingletons.producerInstrumenter(); - StringTuple2 tuple2 = VirtualFieldStore.extract(producer); + ProducerData producerData = VirtualFieldStore.extract(producer); Attributes attributes = Attributes.of( SemanticAttributes.MESSAGING_URL, - tuple2.f1, + producerData.url, SemanticAttributes.MESSAGING_DESTINATION, - tuple2.f2); + producerData.topic); try (Scope ignore = context.makeCurrent()) { this.delegator.sendComplete(e); diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/StringTuple2.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/StringTuple2.java deleted file mode 100644 index e8f98e4929f1..000000000000 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/StringTuple2.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.pulsar.v28; - -public class StringTuple2 { - public final String f1; - public final String f2; - - private StringTuple2(String f1, String f2) { - this.f1 = f1; - this.f2 = f2; - } - - public static StringTuple2 create(String f1, String f2) { - return new StringTuple2(f1, f2); - } -} diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java index 55336c34558d..8a9de33592c6 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/VirtualFieldStore.java @@ -15,8 +15,8 @@ public class VirtualFieldStore { private static final VirtualField, Context> MSG_FIELD = VirtualField.find(Message.class, Context.class); - private static final VirtualField, StringTuple2> PRODUCER_FIELD = - VirtualField.find(Producer.class, StringTuple2.class); + private static final VirtualField, ProducerData> PRODUCER_FIELD = + VirtualField.find(Producer.class, ProducerData.class); private static final VirtualField, String> CONSUMER_FIELD = VirtualField.find(Consumer.class, String.class); @@ -33,7 +33,7 @@ public static void inject(Message instance, Context context) { } public static void inject(Producer instance, String serviceUrl, String topic) { - PRODUCER_FIELD.set(instance, StringTuple2.create(serviceUrl, topic)); + PRODUCER_FIELD.set(instance, ProducerData.create(serviceUrl, topic)); } public static void inject(Consumer instance, String serviceUrl) { @@ -52,7 +52,7 @@ public static Context extract(Message instance) { return ctx == null ? Context.current() : ctx; } - public static StringTuple2 extract(Producer instance) { + public static ProducerData extract(Producer instance) { return PRODUCER_FIELD.get(instance); } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java index dbf0e68677d5..8aa502f3a8c1 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java @@ -28,7 +28,7 @@ public void onEnd( Message message, @Nullable Attributes attributes, @Nullable Throwable error) { - if (null != attributes && !attributes.isEmpty()) { + if (attributes != null && !attributes.isEmpty()) { attributesBuilder.putAll(attributes); } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapGetter.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapGetter.java index e2f68d37a1a4..0dc3e8d0ec05 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapGetter.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/MessageTextMapGetter.java @@ -20,6 +20,6 @@ public Iterable keys(Message message) { @Nullable @Override public String get(@Nullable Message message, String key) { - return null == message ? null : message.getProperties().get(key); + return message == null ? null : message.getProperties().get(key); } } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java index 844e2a675f5f..d312fae6c514 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ProducerAttributesExtractor.java @@ -30,7 +30,7 @@ public void onEnd( Message message, @Nullable Attributes attributes, @Nullable Throwable error) { - if (null != attributes) { + if (attributes != null) { attributesBuilder.putAll(attributes); } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java index 775f2e53dd81..4ec928ffea07 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java @@ -64,7 +64,7 @@ public String conversationId(Message message) { @Nullable @Override public Long messagePayloadSize(Message message) { - if (null != message) { + if (message != null) { return (long) message.size(); } @@ -81,7 +81,7 @@ public Long messagePayloadCompressedSize(Message message) { @Override public String messageId(Message message, @Nullable Attributes attributes) { String messageId0 = null; - if (null != message && null != message.getMessageId()) { + if (message != null && message.getMessageId() != null) { messageId0 = message.getMessageId().toString(); } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java index 24a4963d1b8c..ebe92f6f7e02 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java @@ -24,7 +24,7 @@ import org.apache.pulsar.client.api.Message; public final class PulsarSingletons { - private static final String INSTRUMENTATION = "io.opentelemetry.pulsar-client-2.8"; + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.pulsar-client-2.8"; private static final OpenTelemetry TELEMETRY = GlobalOpenTelemetry.get(); private static final TextMapPropagator PROPAGATOR = TELEMETRY.getPropagators().getTextMapPropagator(); @@ -60,7 +60,7 @@ private static Instrumenter, Attributes> createConsumerReceiveInstrum PulsarMessagingAttributesGetter.INSTANCE; return Instrumenter., Attributes>builder( - TELEMETRY, INSTRUMENTATION, CONSUMER_RECEIVE) + TELEMETRY, INSTRUMENTATION_NAME, CONSUMER_RECEIVE) .addAttributesExtractor(ConsumerAttributesExtractor.INSTANCE) .addAttributesExtractor( MessagingAttributesExtractor.create(getter, MessageOperation.RECEIVE)) @@ -72,7 +72,7 @@ private static Instrumenter, Attributes> createConsumerListenerInstru PulsarMessagingAttributesGetter.INSTANCE; return Instrumenter., Attributes>builder( - TELEMETRY, INSTRUMENTATION, CONSUMER_PROCESS) + TELEMETRY, INSTRUMENTATION_NAME, CONSUMER_PROCESS) .addAttributesExtractor( MessagingAttributesExtractor.create(getter, MessageOperation.PROCESS)) .addAttributesExtractor(ConsumerAttributesExtractor.INSTANCE) @@ -83,7 +83,7 @@ private static Instrumenter, Attributes> createProducerInstrumenter() MessagingAttributesGetter, Attributes> getter = PulsarMessagingAttributesGetter.INSTANCE; - return Instrumenter., Attributes>builder(TELEMETRY, INSTRUMENTATION, PRODUCER_SEND) + return Instrumenter., Attributes>builder(TELEMETRY, INSTRUMENTATION_NAME, PRODUCER_SEND) .addAttributesExtractor(ProducerAttributesExtractor.INSTANCE) .addAttributesExtractor(MessagingAttributesExtractor.create(getter, MessageOperation.SEND)) .buildProducerInstrumenter(MessageTextMapSetter.INSTANCE); From 399d63ffe267a39f5dbb2fd5c9ac8ca4f747f2b9 Mon Sep 17 00:00:00 2001 From: daojun Date: Mon, 27 Feb 2023 20:52:11 +0800 Subject: [PATCH 46/48] fix code format --- .../pulsar/v28/ConsumerImplInstrumentation.java | 3 ++- .../instrumentation/pulsar/v28/telemetry/PulsarSingletons.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java index ada230c8f22f..0b385a64ad55 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ConsumerImplInstrumentation.java @@ -31,7 +31,8 @@ public class ConsumerImplInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { - return namedOneOf("org.apache.pulsar.client.impl.ConsumerImpl", + return namedOneOf( + "org.apache.pulsar.client.impl.ConsumerImpl", "org.apache.pulsar.client.impl.MultiTopicsConsumerImpl"); } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java index ebe92f6f7e02..c012f18ead88 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java @@ -83,7 +83,8 @@ private static Instrumenter, Attributes> createProducerInstrumenter() MessagingAttributesGetter, Attributes> getter = PulsarMessagingAttributesGetter.INSTANCE; - return Instrumenter., Attributes>builder(TELEMETRY, INSTRUMENTATION_NAME, PRODUCER_SEND) + return Instrumenter., Attributes>builder( + TELEMETRY, INSTRUMENTATION_NAME, PRODUCER_SEND) .addAttributesExtractor(ProducerAttributesExtractor.INSTANCE) .addAttributesExtractor(MessagingAttributesExtractor.create(getter, MessageOperation.SEND)) .buildProducerInstrumenter(MessageTextMapSetter.INSTANCE); From 2d4436173e02c3cd6b68f654dafd5aba908e4dc8 Mon Sep 17 00:00:00 2001 From: daojun Date: Tue, 28 Feb 2023 01:25:25 +0800 Subject: [PATCH 47/48] fix deprecated semantic attributes --- .../v28/ProducerImplInstrumentation.java | 4 +-- .../ConsumerAttributesExtractor.java | 2 +- .../PulsarMessagingAttributesGetter.java | 22 +++++++-------- .../v28/telemetry/PulsarSingletons.java | 2 +- .../pulsar/v28/PulsarClientTest.groovy | 28 +++++++++---------- 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java index e9d3ccfd13ef..b0caec5f3999 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java @@ -118,9 +118,9 @@ public void sendComplete(Exception e) { ProducerData producerData = VirtualFieldStore.extract(producer); Attributes attributes = Attributes.of( - SemanticAttributes.MESSAGING_URL, + SemanticAttributes.NET_SOCK_PEER_ADDR, producerData.url, - SemanticAttributes.MESSAGING_DESTINATION, + SemanticAttributes.MESSAGING_DESTINATION_NAME, producerData.topic); try (Scope ignore = context.makeCurrent()) { diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java index 8aa502f3a8c1..fa20dd72cf53 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/ConsumerAttributesExtractor.java @@ -33,7 +33,7 @@ public void onEnd( } if (message.getTopicName() != null) { - attributesBuilder.put(SemanticAttributes.MESSAGING_DESTINATION, message.getTopicName()); + attributesBuilder.put(SemanticAttributes.MESSAGING_DESTINATION_NAME, message.getTopicName()); } } } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java index 4ec928ffea07..659abc5682ee 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java @@ -16,54 +16,54 @@ enum PulsarMessagingAttributesGetter implements MessagingAttributesGetter message) { + public String getSystem(Message message) { return "pulsar"; } @Nullable @Override - public String destinationKind(Message message) { + public String getDestinationKind(Message message) { return SemanticAttributes.MessagingDestinationKindValues.TOPIC; } @Nullable @Override - public String destination(Message message) { + public String getDestination(Message message) { return null; } @Override - public boolean temporaryDestination(Message message) { + public boolean isTemporaryDestination(Message message) { return false; } @Nullable @Override - public String protocol(Message message) { + public String getProtocol(Message message) { return null; } @Nullable @Override - public String protocolVersion(Message message) { + public String getProtocolVersion(Message message) { return null; } @Nullable @Override - public String url(Message message) { + public String getUrl(Message message) { return null; } @Nullable @Override - public String conversationId(Message message) { + public String getConversationId(Message message) { return null; } @Nullable @Override - public Long messagePayloadSize(Message message) { + public Long getMessagePayloadSize(Message message) { if (message != null) { return (long) message.size(); } @@ -73,13 +73,13 @@ public Long messagePayloadSize(Message message) { @Nullable @Override - public Long messagePayloadCompressedSize(Message message) { + public Long getMessagePayloadCompressedSize(Message message) { return null; } @Nullable @Override - public String messageId(Message message, @Nullable Attributes attributes) { + public String getMessageId(Message message, @Nullable Attributes attributes) { String messageId0 = null; if (message != null && message.getMessageId() != null) { messageId0 = message.getMessageId().toString(); diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java index c012f18ead88..1fa8233e9837 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarSingletons.java @@ -97,7 +97,7 @@ public static Context startAndEndConsumerReceive( } String brokerUrl = VirtualFieldStore.extract(consumer); - Attributes attributes = Attributes.of(SemanticAttributes.MESSAGING_URL, brokerUrl); + Attributes attributes = Attributes.of(SemanticAttributes.NET_SOCK_PEER_ADDR, brokerUrl); // startAndEnd not supports extract trace context from carrier // start not supports custom startTime // extract trace context by using TEXT_MAP_PROPAGATOR here. diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy index 09c817dc32dd..e38e38013fa9 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/pulsar/v28/PulsarClientTest.groovy @@ -111,10 +111,10 @@ class PulsarClientTest extends AgentInstrumentationSpecification { childOf parent attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" - "$SemanticAttributes.MESSAGING_URL" brokerUrl + "$SemanticAttributes.NET_SOCK_PEER_ADDR" brokerUrl "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long } @@ -188,8 +188,8 @@ class PulsarClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.NET_SOCK_PEER_ADDR" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long "$SemanticAttributes.MESSAGE_TYPE" "NORMAL" @@ -203,8 +203,8 @@ class PulsarClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.NET_SOCK_PEER_ADDR" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long "$SemanticAttributes.MESSAGING_OPERATION" "receive" @@ -218,7 +218,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_DESTINATION" topic + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" topic "$SemanticAttributes.MESSAGING_MESSAGE_ID" msgId.toString() "$SemanticAttributes.MESSAGING_OPERATION" "process" "$SemanticAttributes.MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES" Long @@ -268,8 +268,8 @@ class PulsarClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION" { + "$SemanticAttributes.NET_SOCK_PEER_ADDR" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" { t -> return t.toString().contains(topic) } @@ -350,8 +350,8 @@ class PulsarClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION" { + "$SemanticAttributes.NET_SOCK_PEER_ADDR" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" { v -> return v.toString().contains(topic) } @@ -368,8 +368,8 @@ class PulsarClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_URL" brokerUrl - "$SemanticAttributes.MESSAGING_DESTINATION" { + "$SemanticAttributes.NET_SOCK_PEER_ADDR" brokerUrl + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" { v -> return v.toString().contains(topic) } @@ -386,7 +386,7 @@ class PulsarClientTest extends AgentInstrumentationSpecification { attributes { "$SemanticAttributes.MESSAGING_SYSTEM" "pulsar" "$SemanticAttributes.MESSAGING_DESTINATION_KIND" "topic" - "$SemanticAttributes.MESSAGING_DESTINATION" { + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" { v -> return v.toString().contains(topic) } From 9d0af62324aec4071f6c8266521f8b4e3285f8f5 Mon Sep 17 00:00:00 2001 From: daojun Date: Tue, 28 Feb 2023 14:22:32 +0800 Subject: [PATCH 48/48] review fix --- .../pulsar/v28/MessageListenerInstrumentation.java | 2 +- .../pulsar/v28/ProducerImplInstrumentation.java | 2 +- .../v28/telemetry/PulsarMessagingAttributesGetter.java | 7 ++----- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageListenerInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageListenerInstrumentation.java index 0dad6cb9ceb2..b09d33b739d8 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageListenerInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/MessageListenerInstrumentation.java @@ -50,7 +50,7 @@ public static void after( @Advice.This ConsumerConfigurationData data, @Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) MessageListener listener) { - if (null == listener) { + if (listener == null) { return; } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java index b0caec5f3999..aba69d5e1db4 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/ProducerImplInstrumentation.java @@ -109,7 +109,7 @@ public SendCallbackWrapper( @Override public void sendComplete(Exception e) { - if (null == context) { + if (context == null) { this.delegator.sendComplete(e); return; } diff --git a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java index 659abc5682ee..01f61db83d04 100644 --- a/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java +++ b/instrumentation/apache-pulsar/apache-pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v28/telemetry/PulsarMessagingAttributesGetter.java @@ -14,13 +14,11 @@ enum PulsarMessagingAttributesGetter implements MessagingAttributesGetter, Attributes> { INSTANCE; - @Nullable @Override public String getSystem(Message message) { return "pulsar"; } - @Nullable @Override public String getDestinationKind(Message message) { return SemanticAttributes.MessagingDestinationKindValues.TOPIC; @@ -80,11 +78,10 @@ public Long getMessagePayloadCompressedSize(Message message) { @Nullable @Override public String getMessageId(Message message, @Nullable Attributes attributes) { - String messageId0 = null; if (message != null && message.getMessageId() != null) { - messageId0 = message.getMessageId().toString(); + return message.getMessageId().toString(); } - return messageId0; + return null; } }