3
3
import threading
4
4
5
5
from aws_xray_sdk import global_sdk_config
6
+ from .models .dummy_entities import DummySegment
6
7
from .models .facade_segment import FacadeSegment
7
8
from .models .trace_header import TraceHeader
8
9
from .context import Context
@@ -44,7 +45,7 @@ class LambdaContext(Context):
44
45
"""
45
46
Lambda service will generate a segment for each function invocation which
46
47
cannot be mutated. The context doesn't keep any manually created segment
47
- but instead every time ``get_trace_entity()`` gets called it refresh the facade
48
+ but instead every time ``get_trace_entity()`` gets called it refresh the
48
49
segment based on environment variables set by Lambda worker.
49
50
"""
50
51
def __init__ (self ):
@@ -65,12 +66,12 @@ def end_segment(self, end_time=None):
65
66
66
67
def put_subsegment (self , subsegment ):
67
68
"""
68
- Refresh the facade segment every time this function is invoked to prevent
69
+ Refresh the segment every time this function is invoked to prevent
69
70
a new subsegment from being attached to a leaked segment/subsegment.
70
71
"""
71
72
current_entity = self .get_trace_entity ()
72
73
73
- if not self ._is_subsegment (current_entity ) and current_entity . initializing :
74
+ if not self ._is_subsegment (current_entity ) and ( getattr ( current_entity , ' initializing' , None ) or isinstance ( current_entity , DummySegment )) :
74
75
if global_sdk_config .sdk_enabled ():
75
76
log .warning ("Subsegment %s discarded due to Lambda worker still initializing" % subsegment .name )
76
77
return
@@ -99,9 +100,9 @@ def get_trace_entity(self):
99
100
100
101
def _refresh_context (self ):
101
102
"""
102
- Get current facade segment. To prevent resource leaking in Lambda worker,
103
+ Get current segment. To prevent resource leaking in Lambda worker,
103
104
every time there is segment present, we compare its trace id to current
104
- environment variables. If it is different we create a new facade segment
105
+ environment variables. If it is different we create a new segment
105
106
and clean up subsegments stored.
106
107
"""
107
108
header_str = os .getenv (LAMBDA_TRACE_HEADER_KEY )
@@ -136,8 +137,8 @@ def handle_context_missing(self):
136
137
137
138
def _initialize_context (self , trace_header ):
138
139
"""
139
- Create a facade segment based on environment variables
140
- set by AWS Lambda and initialize storage for subsegments.
140
+ Create a segment based on environment variables set by
141
+ AWS Lambda and initialize storage for subsegments.
141
142
"""
142
143
sampled = None
143
144
if not global_sdk_config .sdk_enabled ():
@@ -148,12 +149,17 @@ def _initialize_context(self, trace_header):
148
149
elif trace_header .sampled == 1 :
149
150
sampled = True
150
151
151
- segment = FacadeSegment (
152
- name = 'facade' ,
153
- traceid = trace_header .root ,
154
- entityid = trace_header .parent ,
155
- sampled = sampled ,
156
- )
152
+ segment = None
153
+ if not trace_header .root or not trace_header .parent or trace_header .sampled is None :
154
+ segment = DummySegment ()
155
+ log .debug ("Creating NoOp/Dummy parent segment" )
156
+ else :
157
+ segment = FacadeSegment (
158
+ name = 'facade' ,
159
+ traceid = trace_header .root ,
160
+ entityid = trace_header .parent ,
161
+ sampled = sampled ,
162
+ )
157
163
segment .save_origin_trace_header (trace_header )
158
164
setattr (self ._local , 'segment' , segment )
159
165
setattr (self ._local , 'entities' , [])
0 commit comments