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 ;
@@ -39,36 +39,42 @@ public class LambdaSegmentContext implements SegmentContext {
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
- private static TraceHeader getTraceHeaderFromEnvironment () {
42
+ public static TraceHeader getTraceHeaderFromEnvironment () {
43
43
String lambdaTraceHeaderKey = System .getenv (LAMBDA_TRACE_HEADER_KEY );
44
44
return TraceHeader .fromString (lambdaTraceHeaderKey != null && lambdaTraceHeaderKey .length () > 0
45
45
? lambdaTraceHeaderKey
46
46
: System .getProperty (LAMBDA_TRACE_HEADER_PROP ));
47
47
}
48
48
49
- private static boolean isInitializing (TraceHeader traceHeader ) {
50
- return traceHeader .getRootTraceId () == null || traceHeader .getSampled () == null || traceHeader .getParentId () == null ;
51
- }
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
-
49
+ // SuppressWarnings is needed for passing Root TraceId to noOp segment
50
+ @ SuppressWarnings ("nullness" )
63
51
@ Override
64
52
public Subsegment beginSubsegment (AWSXRayRecorder recorder , String name ) {
65
53
if (logger .isDebugEnabled ()) {
66
54
logger .debug ("Beginning subsegment named: " + name );
67
55
}
68
56
57
+ TraceHeader traceHeader = LambdaSegmentContext .getTraceHeaderFromEnvironment ();
58
+ logger .warn ("TRACE HEADER IN CODE: " + traceHeader .toString ());
69
59
Entity entity = getTraceEntity ();
70
- if (entity == null ) { // First subsgment of a subsegment branch.
71
- Segment parentSegment = newFacadeSegment (recorder , name );
60
+ if (entity == null ) { // First subsegment of a subsegment branch
61
+ Segment parentSegment ;
62
+ // Trace header either takes the structure `Root=...;<extra-data>` or
63
+ // `Root=...;Parent=...;Sampled=...;<extra-data>`
64
+ if (traceHeader .getRootTraceId () != null && traceHeader .getParentId () != null && traceHeader .getSampled () != null ) {
65
+ logger .warn ("CREATING FACADE SEGMENT" );
66
+ parentSegment = new FacadeSegment (
67
+ recorder ,
68
+ traceHeader .getRootTraceId (),
69
+ traceHeader .getParentId (),
70
+ traceHeader .getSampled ());
71
+ } else {
72
+ if (logger .isDebugEnabled ()) {
73
+ logger .debug ("Creating No-Op parent segment" );
74
+ }
75
+ TraceID t = traceHeader .getRootTraceId () != null ? traceHeader .getRootTraceId () : TraceID .create (recorder );
76
+ parentSegment = Segment .noOp (t , recorder );
77
+ }
72
78
73
79
boolean isRecording = parentSegment .isRecording ();
74
80
@@ -145,6 +151,8 @@ public void endSubsegment(AWSXRayRecorder recorder) {
145
151
current .getCreator ().getEmitter ().sendSubsegment ((Subsegment ) current );
146
152
}
147
153
clearTraceEntity ();
154
+ } else if (parentEntity instanceof NoOpSegment ) {
155
+ clearTraceEntity ();
148
156
} else {
149
157
setTraceEntity (current .getParent ());
150
158
}
0 commit comments