Skip to content

Commit 398ec05

Browse files
rohitnairatshaw43
andauthored
Optimize default resolver chain construction (#387)
* Optimize default resolver chain construction We can figure out the right SegmentContextResolver at init time since it should remain static throughout the lifetime of an application. Trying to resolve through the resolver chain each time at runtime seems unnecessary. --------- Co-authored-by: atshaw43 <[email protected]>
1 parent babdde3 commit 398ec05

File tree

3 files changed

+21
-17
lines changed

3 files changed

+21
-17
lines changed

aws-xray-recorder-sdk-aws-sdk/src/test/java/com/amazonaws/xray/handlers/TracingHandlerLambdaTest.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,18 @@ public void testSamplingOverrideFalseInLambda() throws Exception {
7373
public void testSamplingOverrideTrueInLambda() {
7474
Emitter mockedEmitted = Mockito.mock(DefaultEmitter.class);
7575

76-
AWSXRayRecorder recorder = AWSXRayRecorderBuilder.standard()
77-
.withSamplingStrategy(new NoSamplingStrategy())
78-
.withEmitter(mockedEmitted)
79-
.build();
80-
8176
TraceHeader header = TraceHeader.fromString(TRACE_HEADER);
8277

8378
PowerMockito.stub(PowerMockito.method(
8479
LambdaSegmentContext.class, "getTraceHeaderFromEnvironment")).toReturn(header);
8580
PowerMockito.stub(PowerMockito.method(
8681
LambdaSegmentContextResolver.class, "getLambdaTaskRoot")).toReturn("/var/task");
8782

83+
AWSXRayRecorder recorder = AWSXRayRecorderBuilder.standard()
84+
.withSamplingStrategy(new NoSamplingStrategy())
85+
.withEmitter(mockedEmitted)
86+
.build();
87+
8888
Mockito.doAnswer(invocation -> { return true; }).when(mockedEmitted).sendSubsegment(any());
8989

9090
lambdaTestHelper(recorder, "testTrue", true);
@@ -95,18 +95,18 @@ public void testSamplingOverrideTrueInLambda() {
9595
public void testSamplingOverrideMixedInLambda() {
9696
Emitter mockedEmitted = Mockito.mock(DefaultEmitter.class);
9797

98-
AWSXRayRecorder recorder = AWSXRayRecorderBuilder.standard()
99-
.withSamplingStrategy(new NoSamplingStrategy())
100-
.withEmitter(mockedEmitted)
101-
.build();
102-
10398
TraceHeader header = TraceHeader.fromString(TRACE_HEADER);
10499

105100
PowerMockito.stub(PowerMockito.method(
106101
LambdaSegmentContext.class, "getTraceHeaderFromEnvironment")).toReturn(header);
107102
PowerMockito.stub(PowerMockito.method(
108103
LambdaSegmentContextResolver.class, "getLambdaTaskRoot")).toReturn("/var/task");
109104

105+
AWSXRayRecorder recorder = AWSXRayRecorderBuilder.standard()
106+
.withSamplingStrategy(new NoSamplingStrategy())
107+
.withEmitter(mockedEmitted)
108+
.build();
109+
110110
Mockito.doAnswer(invocation -> { return true; }).when(mockedEmitted).sendSubsegment(any());
111111

112112
lambdaTestHelper(recorder, "test1", true);

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

+7-3
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,13 @@ public AWSXRayRecorder() {
164164
}
165165

166166
segmentContextResolverChain = new SegmentContextResolverChain();
167-
segmentContextResolverChain.addResolver(new LambdaSegmentContextResolver());
168-
segmentContextResolverChain.addResolver(new ThreadLocalSegmentContextResolver());
169-
167+
LambdaSegmentContextResolver lambdaSegmentContextResolver = new LambdaSegmentContextResolver();
168+
if (lambdaSegmentContextResolver.resolve() != null) {
169+
segmentContextResolverChain.addResolver(lambdaSegmentContextResolver);
170+
} else {
171+
segmentContextResolverChain.addResolver(new ThreadLocalSegmentContextResolver());
172+
}
173+
170174
segmentListeners = new ArrayList<>();
171175

172176
awsRuntimeContext = new ConcurrentHashMap<>();

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -967,10 +967,6 @@ public void testDefaultContextMissingBehaviorEnd() {
967967

968968
@Test
969969
public void testMalformedTraceId() {
970-
AWSXRayRecorder recorder = AWSXRayRecorderBuilder.standard()
971-
.withSamplingStrategy(new NoSamplingStrategy())
972-
.build();
973-
974970
TraceHeader malformedHeader = TraceHeader.fromString("malformedTraceID");
975971

976972
PowerMockito.stub(PowerMockito.method(
@@ -981,6 +977,10 @@ public void testMalformedTraceId() {
981977
LambdaSegmentContextResolver.class, "getLambdaTaskRoot"))
982978
.toReturn("/var/task");
983979

980+
AWSXRayRecorder recorder = AWSXRayRecorderBuilder.standard()
981+
.withSamplingStrategy(new NoSamplingStrategy())
982+
.build();
983+
984984
recorder.beginSubsegment("Test");
985985

986986
// Sanity checks that this is a NoOpSubsegment. (We cannot compare the instance of the private class directly)

0 commit comments

Comments
 (0)