Skip to content

Commit ad6b333

Browse files
author
Anuraag Agrawal
authored
Add a method to run a block of code with a segment mounted as the cur… (#240)
* Add a method to run a block of code with a segment mounted as the current entity. * Deprecate setTraceEntity
1 parent f66c655 commit ad6b333

File tree

7 files changed

+40
-19
lines changed

7 files changed

+40
-19
lines changed

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/AWSXRay.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
package com.amazonaws.xray;
1717

18+
import com.amazonaws.xray.contexts.SegmentContextExecutors;
1819
import com.amazonaws.xray.entities.Entity;
1920
import com.amazonaws.xray.entities.Segment;
2021
import com.amazonaws.xray.entities.Subsegment;
@@ -186,6 +187,11 @@ public static void clearThreadLocal() {
186187
globalRecorder.clearThreadLocal();
187188
}
188189

190+
/**
191+
* @deprecated Use {@link Entity#run(Runnable)} or methods in {@link SegmentContextExecutors} instead of directly setting
192+
* the trace entity so it can be restored correctly.
193+
*/
194+
@Deprecated
189195
public static void setTraceEntity(Entity entity) {
190196
globalRecorder.setTraceEntity(entity);
191197
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/AWSXRayRecorder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.amazonaws.xray.contexts.LambdaSegmentContextResolver;
1919
import com.amazonaws.xray.contexts.SegmentContext;
20+
import com.amazonaws.xray.contexts.SegmentContextExecutors;
2021
import com.amazonaws.xray.contexts.SegmentContextResolverChain;
2122
import com.amazonaws.xray.contexts.ThreadLocalSegmentContextResolver;
2223
import com.amazonaws.xray.emitters.Emitter;
@@ -753,7 +754,11 @@ private SegmentContext getSegmentContext() {
753754
*
754755
* @param entity
755756
* the trace entity to set
757+
*
758+
* @deprecated Use {@link Entity#run(Runnable)} or methods in {@link SegmentContextExecutors} instead of directly setting
759+
* the trace entity so it can be restored correctly.
756760
*/
761+
@Deprecated
757762
public void setTraceEntity(@Nullable Entity entity) {
758763
SegmentContext context = getSegmentContext();
759764
if (context == null) {

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/contexts/SegmentContextExecutors.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import com.amazonaws.xray.AWSXRay;
2121
import com.amazonaws.xray.AWSXRayRecorder;
22-
import com.amazonaws.xray.entities.Entity;
2322
import com.amazonaws.xray.entities.Segment;
2423
import java.util.concurrent.Executor;
2524
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -80,13 +79,7 @@ private SegmentContextExecutor(AWSXRayRecorder recorder, Segment segment) {
8079

8180
@Override
8281
public void execute(Runnable command) {
83-
Entity previous = recorder.getTraceEntity();
84-
recorder.setTraceEntity(segment);
85-
try {
86-
command.run();
87-
} finally {
88-
recorder.setTraceEntity(previous);
89-
}
82+
segment.run(command, recorder);
9083
}
9184
}
9285
}

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/entities/Entity.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,26 @@ static String generateId() {
3636
return AWSXRay.getGlobalRecorder().getIdGenerator().newEntityId();
3737
}
3838

39+
/**
40+
* Immediately runs the provided {@link Runnable} with this {@link Segment} as the current entity.
41+
*/
42+
default void run(Runnable runnable) {
43+
run(runnable, getCreator());
44+
}
45+
46+
/**
47+
* Immediately runs the provided {@link Runnable} with this {@link Segment} as the current entity.
48+
*/
49+
default void run(Runnable runnable, AWSXRayRecorder recorder) {
50+
Entity previous = recorder.getTraceEntity();
51+
recorder.setTraceEntity(this);
52+
try {
53+
runnable.run();
54+
} finally {
55+
recorder.setTraceEntity(previous);
56+
}
57+
}
58+
3959
String getName();
4060

4161
/**

aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/javax/servlet/AWSXRayServletAsyncListener.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,13 @@ private AWSXRayRecorder getRecorder() {
4848

4949
private void processEvent(AsyncEvent event) throws IOException {
5050
AWSXRayRecorder recorder = getRecorder();
51-
Entity prior = recorder.getTraceEntity();
52-
try {
53-
Entity entity = (Entity) event.getSuppliedRequest().getAttribute(ENTITY_ATTRIBUTE_KEY);
54-
recorder.setTraceEntity(entity);
51+
Entity entity = (Entity) event.getSuppliedRequest().getAttribute(ENTITY_ATTRIBUTE_KEY);
52+
entity.run(() -> {
5553
if (event.getThrowable() != null) {
5654
entity.addException(event.getThrowable());
5755
}
5856
filter.postFilter(event.getSuppliedRequest(), event.getSuppliedResponse());
59-
} finally {
60-
recorder.setTraceEntity(prior);
61-
}
57+
});
6258
}
6359

6460
@Override

aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/contexts/SegmentContextExecutorsTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.junit.Rule;
4040
import org.junit.Test;
4141
import org.mockito.Mock;
42+
import org.mockito.Spy;
4243
import org.mockito.junit.MockitoJUnit;
4344
import org.mockito.junit.MockitoRule;
4445

@@ -52,13 +53,13 @@ public class SegmentContextExecutorsTest {
5253
@Mock
5354
private volatile AWSXRayRecorder recorder;
5455

55-
@Mock
56+
@Spy
5657
private volatile Segment current;
5758

58-
@Mock
59+
@Spy
5960
private volatile Segment manual;
6061

61-
@Mock
62+
@Spy
6263
private volatile Segment previous;
6364

6465
@BeforeClass

dependencyManagement/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ val DEPENDENCY_SETS = listOf(
3737
),
3838
DependencySet(
3939
"org.mockito",
40-
"2.28.2",
40+
"3.6.0",
4141
listOf("mockito-all", "mockito-core", "mockito-junit-jupiter")
4242
)
4343
)

0 commit comments

Comments
 (0)