Skip to content

Commit 5e68348

Browse files
mccullsdevflow.devflow-routing-intake
andauthored
Ensure tracer resources cleaned up in exit advice (#11905)
Ensure tracer resources cleaned up in exit advice are still cleaned up even if the patched method throws an exception Review feedback Co-authored-by: Andrea Marziali <marziali.andrea@gmail.com> Co-authored-by: devflow.devflow-routing-intake <devflow.devflow-routing-intake@kubernetes.us1.ddbuild.io>
1 parent 0d23385 commit 5e68348

16 files changed

Lines changed: 57 additions & 31 deletions

File tree

dd-java-agent/instrumentation/elasticsearch/elasticsearch-transport/elasticsearch-transport-common/src/main/java/datadog/trace/instrumentation/elasticsearch/ShadowExistingScopeAdvice.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public static AgentScope enter() {
1717
return activateSpan(noopSpan());
1818
}
1919

20-
@Advice.OnMethodExit(suppress = Throwable.class)
20+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
2121
public static void exit(@Advice.Enter final AgentScope scope) {
2222
scope.close();
2323
}

dd-java-agent/instrumentation/gax-1.4/src/main/java/datadog/trace/instrumentation/gax/CallbackChainRetryingFutureInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public static Runnable capturePrevious(
6565
return previousListener;
6666
}
6767

68-
@Advice.OnMethodExit(suppress = Throwable.class)
68+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
6969
public static void cancelSuperseded(
7070
@Advice.Enter final Runnable previousListener,
7171
@Advice.FieldValue("attemptFutureCompletionListener") final Runnable newListener) {

dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyByteBodyInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ static void after(
207207
}
208208

209209
static class NIOInputStreamRecycleAdvice {
210-
@Advice.OnMethodExit(suppress = Throwable.class)
210+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
211211
static void after(@Advice.This final NIOInputStream thiz) {
212212
InstrumentationContext.get(NIOInputStream.class, StoredByteBody.class).put(thiz, null);
213213
}

dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyCharBodyInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ static void after(
221221
}
222222

223223
static class NIOReaderRecycleAdvice {
224-
@Advice.OnMethodExit(suppress = Throwable.class)
224+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
225225
static void after(@Advice.This final NIOReader thiz) {
226226
InstrumentationContext.get(NIOReader.class, StoredCharBody.class).put(thiz, null);
227227
}

dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/completablefuture/AsyncTaskInstrumentation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,14 @@ public static AgentScope before(@Advice.This ForkJoinTask<?> zis) {
5252
return startTaskScope(InstrumentationContext.get(ForkJoinTask.class, State.class), zis);
5353
}
5454

55-
@Advice.OnMethodExit
55+
@Advice.OnMethodExit(onThrowable = Throwable.class)
5656
public static void after(@Advice.Enter AgentScope scope) {
5757
endTaskScope(scope);
5858
}
5959
}
6060

6161
public static class Cancel {
62-
@Advice.OnMethodExit
62+
@Advice.OnMethodExit(onThrowable = Throwable.class)
6363
public static <T> void cancel(@Advice.This ForkJoinTask<T> task) {
6464
State state = InstrumentationContext.get(ForkJoinTask.class, State.class).get(task);
6565
if (null != state) {

dd-java-agent/instrumentation/kafka/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInfoInstrumentation.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.apache.kafka.clients.consumer.ConsumerRecords;
3838
import org.apache.kafka.clients.consumer.KafkaConsumer;
3939
import org.apache.kafka.clients.consumer.internals.ConsumerCoordinator;
40+
import org.apache.kafka.common.errors.WakeupException;
4041

4142
/**
4243
* This instrumentation saves additional information from the KafkaConsumer, such as consumer group
@@ -258,11 +259,12 @@ public static AgentScope onEnter(@Advice.This KafkaConsumer consumer) {
258259
return null;
259260
}
260261

261-
@Advice.OnMethodExit(suppress = Throwable.class)
262+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
262263
public static void captureGroup(
263264
@Advice.Enter final AgentScope scope,
264265
@Advice.This KafkaConsumer consumer,
265-
@Advice.Return ConsumerRecords records) {
266+
@Advice.Return ConsumerRecords records,
267+
@Advice.Thrown Throwable throwable) {
266268
int recordsCount = 0;
267269
if (records != null) {
268270
KafkaConsumerInfo kafkaConsumerInfo =
@@ -281,6 +283,9 @@ public static void captureGroup(
281283
}
282284
AgentSpan span = scope.span();
283285
span.setTag(KAFKA_RECORDS_COUNT, recordsCount);
286+
if (!(throwable instanceof WakeupException)) {
287+
span.addThrowable(throwable);
288+
}
284289
span.finish();
285290
scope.close();
286291
}

dd-java-agent/instrumentation/kafka/kafka-clients-3.8/src/main/java17/datadog/trace/instrumentation/kafka_clients38/RecordsAdvice.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.apache.kafka.clients.Metadata;
1818
import org.apache.kafka.clients.consumer.ConsumerRecords;
1919
import org.apache.kafka.clients.consumer.internals.ConsumerDelegate;
20+
import org.apache.kafka.common.errors.WakeupException;
2021

2122
/**
2223
* this method transfers the consumer group from the KafkaConsumer class key to the ConsumerRecords
@@ -45,11 +46,12 @@ public static AgentScope onEnter(@Advice.This ConsumerDelegate consumer) {
4546
return null;
4647
}
4748

48-
@Advice.OnMethodExit(suppress = Throwable.class)
49+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
4950
public static void captureGroup(
5051
@Advice.Enter final AgentScope scope,
5152
@Advice.This ConsumerDelegate consumer,
52-
@Advice.Return ConsumerRecords records) {
53+
@Advice.Return ConsumerRecords records,
54+
@Advice.Thrown Throwable throwable) {
5355
int recordsCount = 0;
5456
if (records != null) {
5557
// new - we are getting the KafkaConsumerInfo from the ConsumerDelegate instead of
@@ -70,6 +72,9 @@ public static void captureGroup(
7072
}
7173
AgentSpan span = scope.span();
7274
span.setTag(KAFKA_RECORDS_COUNT, recordsCount);
75+
if (!(throwable instanceof WakeupException)) {
76+
span.addThrowable(throwable);
77+
}
7378
span.finish();
7479
scope.close();
7580
}

dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/CommandHandlerInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public static AgentScope before(@Advice.Argument(2) RedisCommand command) {
6363
return null;
6464
}
6565

66-
@Advice.OnMethodExit
66+
@Advice.OnMethodExit(onThrowable = Throwable.class)
6767
public static void after(@Advice.Enter AgentScope scope) {
6868
endTaskScope(scope);
6969
}

dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandCompleteAdvice.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
public class RedisSubscriptionCommandCompleteAdvice {
1414

15-
@Advice.OnMethodExit(suppress = Throwable.class)
15+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
1616
public static void afterComplete(
1717
@Advice.Origin("#m") String method,
1818
@Advice.This RedisCommand command,

dd-java-agent/instrumentation/lettuce/lettuce-5.0/src/main/java/datadog/trace/instrumentation/lettuce5/rx/RedisSubscriptionCommandErrorAdvice.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import net.bytebuddy.asm.Advice;
1010

1111
public class RedisSubscriptionCommandErrorAdvice {
12-
@Advice.OnMethodExit(suppress = Throwable.class)
12+
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
1313
public static void afterError(
1414
@Advice.This RedisCommand command, @Advice.Argument(value = 0) Throwable throwable) {
1515

0 commit comments

Comments
 (0)