3
3
# This product includes software developed at Datadog (https://www.datadoghq.com/).
4
4
# Copyright 2019 Datadog, Inc.
5
5
6
+ import base64
6
7
import os
7
8
import logging
8
9
import traceback
37
38
create_inferred_span ,
38
39
InferredSpanInfo ,
39
40
)
40
- from datadog_lambda .trigger import extract_trigger_tags , extract_http_status_code_tag
41
+ from datadog_lambda .trigger import (
42
+ extract_trigger_tags ,
43
+ extract_http_status_code_tag ,
44
+ EventTypes ,
45
+ EventSubtypes ,
46
+ )
41
47
from datadog_lambda .tag_object import tag_object
42
48
43
49
profiling_env_var = os .environ .get ("DD_PROFILING_ENABLED" , "false" ).lower () == "true"
@@ -155,21 +161,7 @@ def __call__(self, event, context, **kwargs):
155
161
self ._before (event , context )
156
162
try :
157
163
self .response = self .func (event , context , ** kwargs )
158
- try :
159
- if (
160
- self .make_authorizer_span
161
- and self .response
162
- and self .response .get ("principalId" )
163
- and self .response .get ("policyDocument" )
164
- ):
165
- self ._inject_authorizer_span_headers ()
166
- except Exception as e :
167
- traceback .print_exc ()
168
- logger .debug (
169
- "Unable to inject the authorizer headers. \
170
- Continue to return the original response. Reason: %s" ,
171
- e ,
172
- )
164
+ self ._ending (event )
173
165
return self .response
174
166
except Exception :
175
167
submit_errors_metric (context )
@@ -179,19 +171,31 @@ def __call__(self, event, context, **kwargs):
179
171
finally :
180
172
self ._after (event , context )
181
173
182
- def _inject_authorizer_span_headers (self ):
174
+ def _inject_authorizer_span_headers (self , event ):
183
175
finish_time_ns = (
184
176
self .span .start_ns
185
177
if InferredSpanInfo .is_async (self .inferred_span ) and self .span
186
178
else time_ns ()
187
179
)
188
- self .response .setdefault ("context" , {})
189
- self .response ["context" ].setdefault ("_datadog" , {})
190
180
injected_headers = {}
191
181
source_span = self .inferred_span if self .inferred_span else self .span
192
182
HTTPPropagator .inject (source_span .context , injected_headers )
193
183
injected_headers [OtherConsts .parentSpanFinishTimeHeader ] = finish_time_ns / 1e6
194
- self .response ["context" ]["_datadog" ] = json .dumps (injected_headers )
184
+ encode_datadog_data = False
185
+ if self .event_source and self .event_source .equals (
186
+ EventTypes .API_GATEWAY , EventSubtypes .HTTP_API
187
+ ):
188
+ injected_headers [OtherConsts .originalAuthorizerRequestEpoch ] = event .get (
189
+ "requestContext" , {}
190
+ ).get ("timeEpoch" )
191
+ encode_datadog_data = True
192
+ datadog_data = json .dumps (injected_headers ).encode ()
193
+ if encode_datadog_data :
194
+ datadog_data = base64 .b64encode (
195
+ datadog_data
196
+ ) # special characters can corrupt the response
197
+ self .response .setdefault ("context" , {})
198
+ self .response ["context" ]["_datadog" ] = datadog_data
195
199
196
200
def _before (self , event , context ):
197
201
try :
@@ -203,6 +207,7 @@ def _before(self, event, context):
203
207
dd_context , trace_context_source , event_source = extract_dd_trace_context (
204
208
event , context , extractor = self .trace_extractor
205
209
)
210
+ self .event_source = event_source
206
211
# Create a Datadog X-Ray subsegment with the trace context
207
212
if dd_context and trace_context_source == TraceContextSource .EVENT :
208
213
create_dd_dummy_metadata_subsegment (
@@ -232,6 +237,19 @@ def _before(self, event, context):
232
237
except Exception :
233
238
traceback .print_exc ()
234
239
240
+ def _ending (self , event ):
241
+ try :
242
+ if (
243
+ self .make_authorizer_span
244
+ and self .response
245
+ and self .response .get ("principalId" )
246
+ and self .response .get ("policyDocument" )
247
+ and self .event_source
248
+ ):
249
+ self ._inject_authorizer_span_headers (event )
250
+ except Exception :
251
+ traceback .print_exc ()
252
+
235
253
def _after (self , event , context ):
236
254
try :
237
255
status_code = extract_http_status_code_tag (self .trigger_tags , self .response )
0 commit comments