18
18
import com .amazonaws .xray .AWSXRayRecorder ;
19
19
import com .amazonaws .xray .entities .Entity ;
20
20
import com .amazonaws .xray .entities .FacadeSegment ;
21
+ import com .amazonaws .xray .entities .NoOpSegment ;
21
22
import com .amazonaws .xray .entities .Segment ;
22
23
import com .amazonaws .xray .entities .Subsegment ;
23
24
import com .amazonaws .xray .entities .SubsegmentImpl ;
24
25
import com .amazonaws .xray .entities .TraceHeader ;
25
- import com .amazonaws .xray .entities .TraceHeader .SampleDecision ;
26
26
import com .amazonaws .xray .entities .TraceID ;
27
27
import com .amazonaws .xray .exceptions .SubsegmentNotFoundException ;
28
28
import com .amazonaws .xray .listeners .SegmentListener ;
@@ -35,40 +35,44 @@ public class LambdaSegmentContext implements SegmentContext {
35
35
private static final Log logger = LogFactory .getLog (LambdaSegmentContext .class );
36
36
37
37
private static final String LAMBDA_TRACE_HEADER_KEY = "_X_AMZN_TRACE_ID" ;
38
-
38
+
39
39
// See: https://github.com/aws/aws-xray-sdk-java/issues/251
40
40
private static final String LAMBDA_TRACE_HEADER_PROP = "com.amazonaws.xray.traceHeader" ;
41
41
42
42
private static TraceHeader getTraceHeaderFromEnvironment () {
43
43
String lambdaTraceHeaderKey = System .getenv (LAMBDA_TRACE_HEADER_KEY );
44
- return TraceHeader .fromString (lambdaTraceHeaderKey != null && lambdaTraceHeaderKey .length () > 0
45
- ? lambdaTraceHeaderKey
44
+ return TraceHeader .fromString (lambdaTraceHeaderKey != null && lambdaTraceHeaderKey .length () > 0
45
+ ? lambdaTraceHeaderKey
46
46
: System .getProperty (LAMBDA_TRACE_HEADER_PROP ));
47
47
}
48
48
49
49
private static boolean isInitializing (TraceHeader traceHeader ) {
50
50
return traceHeader .getRootTraceId () == null || traceHeader .getSampled () == null || traceHeader .getParentId () == null ;
51
51
}
52
52
53
- private static FacadeSegment newFacadeSegment (AWSXRayRecorder recorder , String name ) {
54
- TraceHeader traceHeader = getTraceHeaderFromEnvironment ();
55
- if (isInitializing (traceHeader )) {
56
- logger .warn (LAMBDA_TRACE_HEADER_KEY + " is missing a trace ID, parent ID, or sampling decision. Subsegment "
57
- + name + " discarded." );
58
- return new FacadeSegment (recorder , TraceID .create (recorder ), "" , SampleDecision .NOT_SAMPLED );
59
- }
60
- return new FacadeSegment (recorder , traceHeader .getRootTraceId (), traceHeader .getParentId (), traceHeader .getSampled ());
61
- }
62
-
63
53
@ Override
64
54
public Subsegment beginSubsegment (AWSXRayRecorder recorder , String name ) {
65
55
if (logger .isDebugEnabled ()) {
66
56
logger .debug ("Beginning subsegment named: " + name );
67
57
}
68
58
59
+ TraceHeader traceHeader = LambdaSegmentContext .getTraceHeaderFromEnvironment ();
69
60
Entity entity = getTraceEntity ();
70
- if (entity == null ) { // First subsgment of a subsegment branch.
71
- Segment parentSegment = newFacadeSegment (recorder , name );
61
+ if (entity == null ) { // First subsegment of a subsegment branch
62
+ Segment parentSegment ;
63
+ if (isInitializing (traceHeader )) {
64
+ if (logger .isDebugEnabled ()) {
65
+ logger .debug ("Creating No-Op parent segment" );
66
+ }
67
+ parentSegment = Segment .noOp (TraceID .create (recorder ), recorder );
68
+ } else {
69
+ parentSegment = new FacadeSegment (
70
+ recorder ,
71
+ traceHeader .getRootTraceId (),
72
+ traceHeader .getParentId (),
73
+ traceHeader .getSampled ()
74
+ );
75
+ }
72
76
73
77
boolean isRecording = parentSegment .isRecording ();
74
78
@@ -145,6 +149,8 @@ public void endSubsegment(AWSXRayRecorder recorder) {
145
149
current .getCreator ().getEmitter ().sendSubsegment ((Subsegment ) current );
146
150
}
147
151
clearTraceEntity ();
152
+ } else if (parentEntity instanceof NoOpSegment ) {
153
+ clearTraceEntity ();
148
154
} else {
149
155
setTraceEntity (current .getParent ());
150
156
}
0 commit comments