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 ;
22
21
import com .amazonaws .xray .entities .Segment ;
23
22
import com .amazonaws .xray .entities .Subsegment ;
24
23
import com .amazonaws .xray .entities .SubsegmentImpl ;
25
24
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,44 +35,40 @@ 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
+
53
63
@ Override
54
64
public Subsegment beginSubsegment (AWSXRayRecorder recorder , String name ) {
55
65
if (logger .isDebugEnabled ()) {
56
66
logger .debug ("Beginning subsegment named: " + name );
57
67
}
58
68
59
- TraceHeader traceHeader = LambdaSegmentContext .getTraceHeaderFromEnvironment ();
60
69
Entity entity = getTraceEntity ();
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
- }
70
+ if (entity == null ) { // First subsgment of a subsegment branch.
71
+ Segment parentSegment = newFacadeSegment (recorder , name );
76
72
77
73
boolean isRecording = parentSegment .isRecording ();
78
74
@@ -149,8 +145,6 @@ public void endSubsegment(AWSXRayRecorder recorder) {
149
145
current .getCreator ().getEmitter ().sendSubsegment ((Subsegment ) current );
150
146
}
151
147
clearTraceEntity ();
152
- } else if (parentEntity instanceof NoOpSegment ) {
153
- clearTraceEntity ();
154
148
} else {
155
149
setTraceEntity (current .getParent ());
156
150
}
0 commit comments