From d62b74f3766588e39af6a0ee5e3be320a214417b Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Fri, 24 Oct 2025 10:40:07 +0200 Subject: [PATCH 1/2] Making PowerJobInstrumentationModule indy ready --- .../powerjob/v4_0/PowerJobInstrumentationModule.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobInstrumentationModule.java b/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobInstrumentationModule.java index 4838b489f02a..42dffd25921b 100644 --- a/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobInstrumentationModule.java +++ b/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobInstrumentationModule.java @@ -8,11 +8,13 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import java.util.Collections; import java.util.List; @AutoService(InstrumentationModule.class) -public class PowerJobInstrumentationModule extends InstrumentationModule { +public class PowerJobInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public PowerJobInstrumentationModule() { super("powerjob", "powerjob-4.0"); } @@ -21,4 +23,9 @@ public PowerJobInstrumentationModule() { public List typeInstrumentations() { return Collections.singletonList(new BasicProcessorInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } From a935c896bcd3ce8588f73dcc8f6b7dbf845c102b Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Fri, 24 Oct 2025 10:45:33 +0200 Subject: [PATCH 2/2] Migrating BasicProcessorInstrumentation --- .../v4_0/BasicProcessorInstrumentation.java | 73 +++++++++++-------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/BasicProcessorInstrumentation.java b/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/BasicProcessorInstrumentation.java index 4fd168a2da3a..e0624580f54b 100644 --- a/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/BasicProcessorInstrumentation.java +++ b/instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/BasicProcessorInstrumentation.java @@ -5,7 +5,6 @@ package io.opentelemetry.javaagent.instrumentation.powerjob.v4_0; -import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.javaagent.instrumentation.powerjob.v4_0.PowerJobSingletons.instrumenter; import static net.bytebuddy.matcher.ElementMatchers.isPublic; @@ -17,6 +16,7 @@ import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import javax.annotation.Nullable; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -45,43 +45,58 @@ public void transform(TypeTransformer transformer) { public static class ProcessAdvice { - @SuppressWarnings("unused") - @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onSchedule( - @Advice.This BasicProcessor handler, - @Advice.Argument(0) TaskContext taskContext, - @Advice.Local("otelRequest") PowerJobProcessRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { - Context parentContext = currentContext(); - request = - PowerJobProcessRequest.createRequest( - taskContext.getJobId(), - handler, - "process", - taskContext.getJobParams(), - taskContext.getInstanceParams()); + public static class AdviceScope { + private final PowerJobProcessRequest request; + private final Context context; + private final Scope scope; + + private AdviceScope(PowerJobProcessRequest request, Context context, Scope scope) { + this.request = request; + this.context = context; + this.scope = scope; + } + + @Nullable + public static AdviceScope start(BasicProcessor handler, TaskContext taskContext) { + Context parentContext = Context.current(); + PowerJobProcessRequest request = + PowerJobProcessRequest.createRequest( + taskContext.getJobId(), + handler, + "process", + taskContext.getJobParams(), + taskContext.getInstanceParams()); + + if (!instrumenter().shouldStart(parentContext, request)) { + return null; + } - if (!instrumenter().shouldStart(parentContext, request)) { - return; + Context context = instrumenter().start(parentContext, request); + return new AdviceScope(request, context, context.makeCurrent()); } - context = instrumenter().start(parentContext, request); - scope = context.makeCurrent(); + + public void end(ProcessResult result, Throwable throwable) { + scope.close(); + instrumenter().end(context, request, result, throwable); + } + } + + @SuppressWarnings("unused") + @Advice.OnMethodEnter(suppress = Throwable.class) + public static AdviceScope onSchedule( + @Advice.This BasicProcessor handler, @Advice.Argument(0) TaskContext taskContext) { + return AdviceScope.start(handler, taskContext); } @SuppressWarnings("unused") @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( @Advice.Return ProcessResult result, - @Advice.Thrown Throwable throwable, - @Advice.Local("otelRequest") PowerJobProcessRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { - if (scope == null) { - return; + @Advice.Thrown @Nullable Throwable throwable, + @Advice.Enter @Nullable AdviceScope adviceScope) { + if (adviceScope != null) { + adviceScope.end(result, throwable); } - scope.close(); - instrumenter().end(context, request, result, throwable); } } }