Skip to content

Commit 946babb

Browse files
authored
Fix akka shutdown hanging (#13073)
1 parent ea4aa39 commit 946babb

File tree

4 files changed

+66
-9
lines changed

4 files changed

+66
-9
lines changed

instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaScheduleInstrumentation.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
import static net.bytebuddy.matcher.ElementMatchers.named;
99
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1010

11-
import io.opentelemetry.context.Context;
12-
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
1311
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1412
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1513
import net.bytebuddy.asm.Advice;
@@ -46,8 +44,7 @@ public static class ScheduleAdvice {
4644
@Advice.OnMethodEnter(suppress = Throwable.class)
4745
public static void enterSchedule(
4846
@Advice.Argument(value = 2, readOnly = false) Runnable runnable) {
49-
Context context = Java8BytecodeBridge.currentContext();
50-
runnable = context.wrap(runnable);
47+
runnable = AkkaSchedulerTaskWrapper.wrap(runnable);
5148
}
5249
}
5350

@@ -57,8 +54,7 @@ public static class ScheduleOnceAdvice {
5754
@Advice.OnMethodEnter(suppress = Throwable.class)
5855
public static void enterScheduleOnce(
5956
@Advice.Argument(value = 1, readOnly = false) Runnable runnable) {
60-
Context context = Java8BytecodeBridge.currentContext();
61-
runnable = context.wrap(runnable);
57+
runnable = AkkaSchedulerTaskWrapper.wrap(runnable);
6258
}
6359
}
6460
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.akkaactor;
7+
8+
import io.opentelemetry.context.Context;
9+
10+
public final class AkkaSchedulerTaskWrapper {
11+
private static final Class<?> RUN_ON_CLOSE_TASK_CLASS = getRunOnCloseTaskClass();
12+
13+
private static Class<?> getRunOnCloseTaskClass() {
14+
try {
15+
return Class.forName("akka.actor.Scheduler$TaskRunOnClose");
16+
} catch (ClassNotFoundException e) {
17+
return null;
18+
}
19+
}
20+
21+
private static boolean isRunOnCloseTask(Runnable runnable) {
22+
return RUN_ON_CLOSE_TASK_CLASS != null && RUN_ON_CLOSE_TASK_CLASS.isInstance(runnable);
23+
}
24+
25+
public static Runnable wrap(Runnable runnable) {
26+
// https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/13066
27+
// Skip wrapping shutdown tasks. Shutdown process hangs when shutdown tasks are wrapped here.
28+
if (isRunOnCloseTask(runnable)) {
29+
return runnable;
30+
}
31+
32+
Context context = Context.current();
33+
return context.wrap(runnable);
34+
}
35+
36+
private AkkaSchedulerTaskWrapper() {}
37+
}

instrumentation/pekko/pekko-actor-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/pekkoactor/v1_0/PekkoScheduleInstrumentation.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import static net.bytebuddy.matcher.ElementMatchers.named;
99
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1010

11-
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
1211
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1312
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1413
import net.bytebuddy.asm.Advice;
@@ -46,7 +45,7 @@ public static class ScheduleAdvice {
4645
@Advice.AssignReturned.ToArguments(@ToArgument(2))
4746
@Advice.OnMethodEnter(suppress = Throwable.class)
4847
public static Runnable enterSchedule(@Advice.Argument(value = 2) Runnable runnable) {
49-
return Java8BytecodeBridge.currentContext().wrap(runnable);
48+
return PekkoSchedulerTaskWrapper.wrap(runnable);
5049
}
5150
}
5251

@@ -56,7 +55,7 @@ public static class ScheduleOnceAdvice {
5655
@Advice.AssignReturned.ToArguments(@ToArgument(1))
5756
@Advice.OnMethodEnter(suppress = Throwable.class)
5857
public static Runnable enterScheduleOnce(@Advice.Argument(value = 1) Runnable runnable) {
59-
return Java8BytecodeBridge.currentContext().wrap(runnable);
58+
return PekkoSchedulerTaskWrapper.wrap(runnable);
6059
}
6160
}
6261
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.pekkoactor.v1_0;
7+
8+
import io.opentelemetry.context.Context;
9+
import org.apache.pekko.actor.Scheduler;
10+
11+
public final class PekkoSchedulerTaskWrapper {
12+
13+
public static Runnable wrap(Runnable runnable) {
14+
// https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/13066
15+
// Skip wrapping shutdown tasks. Shutdown process hangs when shutdown tasks are wrapped here.
16+
if (runnable instanceof Scheduler.TaskRunOnClose) {
17+
return runnable;
18+
}
19+
20+
Context context = Context.current();
21+
return context.wrap(runnable);
22+
}
23+
24+
private PekkoSchedulerTaskWrapper() {}
25+
}

0 commit comments

Comments
 (0)