From bd39c59e22ed2252b2faf6e1bb4a990591e169a2 Mon Sep 17 00:00:00 2001 From: dao-jun Date: Fri, 21 Jun 2024 18:58:49 +0800 Subject: [PATCH 1/6] Enhance SendCallback to address PIP-363 --- .../v2_8/ProducerImplInstrumentation.java | 53 +------------- .../v2_8/PulsarInstrumentationModule.java | 3 +- .../v2_8/SendCallbackInstrumentation.java | 73 +++++++++++++++++++ .../pulsar/v2_8/VirtualFieldStore.java | 17 +++++ 4 files changed, 96 insertions(+), 50 deletions(-) create mode 100644 instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java index 4b782edd6e28..ef3eeaf78710 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java @@ -73,7 +73,7 @@ public static class ProducerSendAsyncMethodAdvice { public static void before( @Advice.This ProducerImpl producer, @Advice.Argument(value = 0) Message message, - @Advice.Argument(value = 1, readOnly = false) SendCallback callback) { + @Advice.Argument(value = 1) SendCallback callback) { Context parent = Context.current(); PulsarRequest request = PulsarRequest.create(message, VirtualFieldStore.extract(producer)); @@ -82,54 +82,9 @@ public static void before( } Context context = producerInstrumenter().start(parent, request); - callback = new SendCallbackWrapper(context, request, callback); - } - } - - public static class SendCallbackWrapper implements SendCallback { - - private final Context context; - private final PulsarRequest request; - private final SendCallback delegate; - - public SendCallbackWrapper(Context context, PulsarRequest request, SendCallback callback) { - this.context = context; - this.request = request; - this.delegate = callback; - } - - @Override - public void sendComplete(Exception e) { - if (context == null) { - this.delegate.sendComplete(e); - return; - } - - try (Scope ignore = context.makeCurrent()) { - this.delegate.sendComplete(e); - } finally { - producerInstrumenter().end(context, request, null, e); - } - } - - @Override - public void addCallback(MessageImpl msg, SendCallback scb) { - this.delegate.addCallback(msg, scb); - } - - @Override - public SendCallback getNextSendCallback() { - return this.delegate.getNextSendCallback(); - } - - @Override - public MessageImpl getNextMessage() { - return this.delegate.getNextMessage(); - } - - @Override - public CompletableFuture getFuture() { - return this.delegate.getFuture(); + // Inject the context/request into the message. This will be extracted and used when the + // message is sent and the callback is invoked. see `SendCallbackInstrumentation`. + VirtualFieldStore.inject(callback, context, request); } } } diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/PulsarInstrumentationModule.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/PulsarInstrumentationModule.java index a6ed299c64f6..172538815cfb 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/PulsarInstrumentationModule.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/PulsarInstrumentationModule.java @@ -24,6 +24,7 @@ public List typeInstrumentations() { new ConsumerImplInstrumentation(), new ProducerImplInstrumentation(), new MessageInstrumentation(), - new MessageListenerInstrumentation()); + new MessageListenerInstrumentation(), + new SendCallbackInstrumentation()); } } diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java new file mode 100644 index 000000000000..d069e0f5d2c8 --- /dev/null +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java @@ -0,0 +1,73 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.v2_8; + +import static io.opentelemetry.javaagent.instrumentation.pulsar.v2_8.telemetry.PulsarSingletons.producerInstrumenter; +import static net.bytebuddy.matcher.ElementMatchers.hasSuperType; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +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.v2_8.telemetry.PulsarRequest; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.pulsar.client.impl.SendCallback; + +public class SendCallbackInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return hasSuperType(named("org.apache.pulsar.client.impl.SendCallback")); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isMethod().and(named("sendComplete")) + .and(takesArgument(0, named("java.lang.Exception"))), + SendCallbackInstrumentation.class.getName() + "$SendCallbackSendCompleteAdvice"); + } + + @SuppressWarnings("unused") + public static class SendCallbackSendCompleteAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.This SendCallback callback, + @Advice.Local("otelContext") Context otelContext, + @Advice.Local("otelScope") Scope otelScope, + @Advice.Local("otelRequest") PulsarRequest request) { + // Extract the Context and PulsarRequest from the SendCallback instance. + Object[] objects = VirtualFieldStore.extract(callback); + if (objects != null && objects.length == 2 && objects[0] instanceof Context + && objects[1] instanceof PulsarRequest) { + // If the extraction was successful, store the Context and PulsarRequest in local variables. + otelContext = (Context) objects[0]; + request = (PulsarRequest) objects[1]; + otelScope = otelContext.makeCurrent(); + } + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void onExit( + @Advice.Argument(0) Exception e, + @Advice.Local("otelContext") Context otelContext, + @Advice.Local("otelScope") Scope otelScope, + @Advice.Local("otelRequest") PulsarRequest request) { + if (otelScope != null && otelContext != null && request != null) { + // Close the Scope and end the span. + otelScope.close(); + producerInstrumenter().end(otelContext, request, null, e); + } + } + } + +} diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java index 193079174c9e..2c7b9b6401ea 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java @@ -7,9 +7,11 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.javaagent.instrumentation.pulsar.v2_8.telemetry.PulsarRequest; 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.SendCallback; import org.apache.pulsar.client.impl.TopicMessageImpl; public class VirtualFieldStore { @@ -19,6 +21,8 @@ public class VirtualFieldStore { VirtualField.find(Producer.class, ProducerData.class); private static final VirtualField, String> CONSUMER_FIELD = VirtualField.find(Consumer.class, String.class); + private static final VirtualField CALLBACK_FIELD = + VirtualField.find(SendCallback.class, Object[].class); private VirtualFieldStore() {} @@ -40,6 +44,12 @@ public static void inject(Consumer instance, String serviceUrl) { CONSUMER_FIELD.set(instance, serviceUrl); } + public static void inject(SendCallback instance, Context context, PulsarRequest request) { + if (instance != null) { + CALLBACK_FIELD.set(instance, new Object[] {context, request}); + } + } + public static Context extract(Message instance) { if (instance instanceof TopicMessageImpl) { TopicMessageImpl topicMessage = (TopicMessageImpl) instance; @@ -59,4 +69,11 @@ public static ProducerData extract(Producer instance) { public static String extract(Consumer instance) { return CONSUMER_FIELD.get(instance); } + + public static Object[] extract(SendCallback instance) { + if (instance != null) { + return CALLBACK_FIELD.get(instance); + } + return null; + } } From 7870b7d7448be6db2ce88dcd91a7b0c2da109a8d Mon Sep 17 00:00:00 2001 From: dao-jun Date: Fri, 21 Jun 2024 19:22:05 +0800 Subject: [PATCH 2/6] fix codestyle --- .../pulsar/v2_8/ProducerImplInstrumentation.java | 4 ---- .../pulsar/v2_8/SendCallbackInstrumentation.java | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java index ef3eeaf78710..f4957d395c04 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java @@ -14,18 +14,14 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; 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.v2_8.telemetry.PulsarRequest; -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.PulsarClient; -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; diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java index d069e0f5d2c8..d71eefe6c135 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java @@ -31,8 +31,7 @@ public ElementMatcher typeMatcher() { @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( - isMethod().and(named("sendComplete")) - .and(takesArgument(0, named("java.lang.Exception"))), + isMethod().and(named("sendComplete")).and(takesArgument(0, named("java.lang.Exception"))), SendCallbackInstrumentation.class.getName() + "$SendCallbackSendCompleteAdvice"); } @@ -47,7 +46,9 @@ public static void onEnter( @Advice.Local("otelRequest") PulsarRequest request) { // Extract the Context and PulsarRequest from the SendCallback instance. Object[] objects = VirtualFieldStore.extract(callback); - if (objects != null && objects.length == 2 && objects[0] instanceof Context + if (objects != null + && objects.length == 2 + && objects[0] instanceof Context && objects[1] instanceof PulsarRequest) { // If the extraction was successful, store the Context and PulsarRequest in local variables. otelContext = (Context) objects[0]; @@ -69,5 +70,4 @@ public static void onExit( } } } - } From c4ffe63cc49d85618f395711f5adc15f1d3f10cc Mon Sep 17 00:00:00 2001 From: dao-jun Date: Fri, 16 Aug 2024 00:54:21 +0800 Subject: [PATCH 3/6] Address review comments --- .../v2_8/ProducerImplInstrumentation.java | 2 +- .../pulsar/v2_8/SendCallBackData.java | 23 +++++++++++++++++++ .../v2_8/SendCallbackInstrumentation.java | 11 ++++----- .../pulsar/v2_8/VirtualFieldStore.java | 8 +++---- 4 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java index f4957d395c04..79211824e317 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/ProducerImplInstrumentation.java @@ -78,7 +78,7 @@ public static void before( } Context context = producerInstrumenter().start(parent, request); - // Inject the context/request into the message. This will be extracted and used when the + // Inject the context/request into the SendCallback. This will be extracted and used when the // message is sent and the callback is invoked. see `SendCallbackInstrumentation`. VirtualFieldStore.inject(callback, context, request); } diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java new file mode 100644 index 000000000000..9e1b96008694 --- /dev/null +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java @@ -0,0 +1,23 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.pulsar.v2_8; + +import io.opentelemetry.context.Context; +import io.opentelemetry.javaagent.instrumentation.pulsar.v2_8.telemetry.PulsarRequest; + +public class SendCallBackData { + public final Context context; + public final PulsarRequest request; + + private SendCallBackData(Context context, PulsarRequest request) { + this.context = context; + this.request = request; + } + + public static SendCallBackData create(Context context, PulsarRequest request) { + return new SendCallBackData(context, request); + } +} diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java index d71eefe6c135..ce0a9965dab6 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java @@ -45,14 +45,11 @@ public static void onEnter( @Advice.Local("otelScope") Scope otelScope, @Advice.Local("otelRequest") PulsarRequest request) { // Extract the Context and PulsarRequest from the SendCallback instance. - Object[] objects = VirtualFieldStore.extract(callback); - if (objects != null - && objects.length == 2 - && objects[0] instanceof Context - && objects[1] instanceof PulsarRequest) { + SendCallBackData callBackData = VirtualFieldStore.extract(callback); + if (callBackData != null && callBackData.request != null && callBackData.context != null) { // If the extraction was successful, store the Context and PulsarRequest in local variables. - otelContext = (Context) objects[0]; - request = (PulsarRequest) objects[1]; + otelContext = callBackData.context; + request = callBackData.request; otelScope = otelContext.makeCurrent(); } } diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java index 2c7b9b6401ea..631acd17c240 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java @@ -21,8 +21,8 @@ public class VirtualFieldStore { VirtualField.find(Producer.class, ProducerData.class); private static final VirtualField, String> CONSUMER_FIELD = VirtualField.find(Consumer.class, String.class); - private static final VirtualField CALLBACK_FIELD = - VirtualField.find(SendCallback.class, Object[].class); + private static final VirtualField CALLBACK_FIELD = + VirtualField.find(SendCallback.class, SendCallBackData.class); private VirtualFieldStore() {} @@ -46,7 +46,7 @@ public static void inject(Consumer instance, String serviceUrl) { public static void inject(SendCallback instance, Context context, PulsarRequest request) { if (instance != null) { - CALLBACK_FIELD.set(instance, new Object[] {context, request}); + CALLBACK_FIELD.set(instance, SendCallBackData.create(context, request)); } } @@ -70,7 +70,7 @@ public static String extract(Consumer instance) { return CONSUMER_FIELD.get(instance); } - public static Object[] extract(SendCallback instance) { + public static SendCallBackData extract(SendCallback instance) { if (instance != null) { return CALLBACK_FIELD.get(instance); } From c41fafd2c97c043d62c8e221e1c5fb9e6d281776 Mon Sep 17 00:00:00 2001 From: dao-jun Date: Fri, 16 Aug 2024 01:00:43 +0800 Subject: [PATCH 4/6] Address review comments --- .../pulsar/v2_8/SendCallbackInstrumentation.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java index ce0a9965dab6..c58f8199da34 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java @@ -9,7 +9,6 @@ import static net.bytebuddy.matcher.ElementMatchers.hasSuperType; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; @@ -31,7 +30,7 @@ public ElementMatcher typeMatcher() { @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( - isMethod().and(named("sendComplete")).and(takesArgument(0, named("java.lang.Exception"))), + isMethod().and(named("sendComplete")), SendCallbackInstrumentation.class.getName() + "$SendCallbackSendCompleteAdvice"); } @@ -56,14 +55,14 @@ public static void onEnter( @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void onExit( - @Advice.Argument(0) Exception e, + @Advice.Argument(0) Throwable t, @Advice.Local("otelContext") Context otelContext, @Advice.Local("otelScope") Scope otelScope, @Advice.Local("otelRequest") PulsarRequest request) { if (otelScope != null && otelContext != null && request != null) { // Close the Scope and end the span. otelScope.close(); - producerInstrumenter().end(otelContext, request, null, e); + producerInstrumenter().end(otelContext, request, null, t); } } } From 0c065b898968fd25aa543acd4207aa753e641fd9 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 19 Aug 2024 17:40:47 +0300 Subject: [PATCH 5/6] Update instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java --- .../javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java index 9e1b96008694..7467905a401b 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java @@ -8,7 +8,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.javaagent.instrumentation.pulsar.v2_8.telemetry.PulsarRequest; -public class SendCallBackData { +public final class SendCallBackData { public final Context context; public final PulsarRequest request; From a095484757cd5ab12535341c6453dfb2d9c355a1 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 19 Aug 2024 18:06:39 +0300 Subject: [PATCH 6/6] polish --- ...SendCallBackData.java => SendCallbackData.java} | 8 ++++---- .../pulsar/v2_8/SendCallbackInstrumentation.java | 14 ++++++++++---- .../pulsar/v2_8/VirtualFieldStore.java | 13 +++++-------- 3 files changed, 19 insertions(+), 16 deletions(-) rename instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/{SendCallBackData.java => SendCallbackData.java} (67%) diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackData.java similarity index 67% rename from instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java rename to instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackData.java index 7467905a401b..462843d70e31 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallBackData.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackData.java @@ -8,16 +8,16 @@ import io.opentelemetry.context.Context; import io.opentelemetry.javaagent.instrumentation.pulsar.v2_8.telemetry.PulsarRequest; -public final class SendCallBackData { +public final class SendCallbackData { public final Context context; public final PulsarRequest request; - private SendCallBackData(Context context, PulsarRequest request) { + private SendCallbackData(Context context, PulsarRequest request) { this.context = context; this.request = request; } - public static SendCallBackData create(Context context, PulsarRequest request) { - return new SendCallBackData(context, request); + public static SendCallbackData create(Context context, PulsarRequest request) { + return new SendCallbackData(context, request); } } diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java index c58f8199da34..85295042e335 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/SendCallbackInstrumentation.java @@ -5,8 +5,9 @@ package io.opentelemetry.javaagent.instrumentation.pulsar.v2_8; +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasSuperType; import static io.opentelemetry.javaagent.instrumentation.pulsar.v2_8.telemetry.PulsarSingletons.producerInstrumenter; -import static net.bytebuddy.matcher.ElementMatchers.hasSuperType; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -22,6 +23,11 @@ public class SendCallbackInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderOptimization() { + return hasClassesNamed("org.apache.pulsar.client.impl.SendCallback"); + } + @Override public ElementMatcher typeMatcher() { return hasSuperType(named("org.apache.pulsar.client.impl.SendCallback")); @@ -44,8 +50,8 @@ public static void onEnter( @Advice.Local("otelScope") Scope otelScope, @Advice.Local("otelRequest") PulsarRequest request) { // Extract the Context and PulsarRequest from the SendCallback instance. - SendCallBackData callBackData = VirtualFieldStore.extract(callback); - if (callBackData != null && callBackData.request != null && callBackData.context != null) { + SendCallbackData callBackData = VirtualFieldStore.extract(callback); + if (callBackData != null) { // If the extraction was successful, store the Context and PulsarRequest in local variables. otelContext = callBackData.context; request = callBackData.request; @@ -59,7 +65,7 @@ public static void onExit( @Advice.Local("otelContext") Context otelContext, @Advice.Local("otelScope") Scope otelScope, @Advice.Local("otelRequest") PulsarRequest request) { - if (otelScope != null && otelContext != null && request != null) { + if (otelScope != null) { // Close the Scope and end the span. otelScope.close(); producerInstrumenter().end(otelContext, request, null, t); diff --git a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java index 631acd17c240..9ec84944feaf 100644 --- a/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java +++ b/instrumentation/pulsar/pulsar-2.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pulsar/v2_8/VirtualFieldStore.java @@ -21,8 +21,8 @@ public class VirtualFieldStore { VirtualField.find(Producer.class, ProducerData.class); private static final VirtualField, String> CONSUMER_FIELD = VirtualField.find(Consumer.class, String.class); - private static final VirtualField CALLBACK_FIELD = - VirtualField.find(SendCallback.class, SendCallBackData.class); + private static final VirtualField CALLBACK_FIELD = + VirtualField.find(SendCallback.class, SendCallbackData.class); private VirtualFieldStore() {} @@ -46,7 +46,7 @@ public static void inject(Consumer instance, String serviceUrl) { public static void inject(SendCallback instance, Context context, PulsarRequest request) { if (instance != null) { - CALLBACK_FIELD.set(instance, SendCallBackData.create(context, request)); + CALLBACK_FIELD.set(instance, SendCallbackData.create(context, request)); } } @@ -70,10 +70,7 @@ public static String extract(Consumer instance) { return CONSUMER_FIELD.get(instance); } - public static SendCallBackData extract(SendCallback instance) { - if (instance != null) { - return CALLBACK_FIELD.get(instance); - } - return null; + public static SendCallbackData extract(SendCallback instance) { + return CALLBACK_FIELD.get(instance); } }