datadog_lambda 5.91.0__py3-none-any.whl → 5.92.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
datadog_lambda/tracing.py CHANGED
@@ -68,6 +68,8 @@ if dd_tracing_enabled:
68
68
 
69
69
  propagator = HTTPPropagator()
70
70
 
71
+ DD_TRACE_JAVA_TRACE_ID_PADDING = "00000000"
72
+
71
73
 
72
74
  def _convert_xray_trace_id(xray_trace_id):
73
75
  """
@@ -248,28 +250,52 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context):
248
250
  first_record.get("Sns", {}).get("MessageAttributes", {}),
249
251
  )
250
252
  dd_payload = msg_attributes.get("_datadog", {})
251
- # SQS uses dataType and binaryValue/stringValue
252
- # SNS uses Type and Value
253
- dd_json_data_type = dd_payload.get("Type", dd_payload.get("dataType", ""))
254
- if dd_json_data_type == "Binary":
255
- dd_json_data = dd_payload.get(
256
- "binaryValue",
257
- dd_payload.get("Value", r"{}"),
258
- )
259
- dd_json_data = base64.b64decode(dd_json_data)
260
- elif dd_json_data_type == "String":
261
- dd_json_data = dd_payload.get(
262
- "stringValue",
263
- dd_payload.get("Value", r"{}"),
264
- )
253
+ if dd_payload:
254
+ # SQS uses dataType and binaryValue/stringValue
255
+ # SNS uses Type and Value
256
+ dd_json_data = None
257
+ dd_json_data_type = dd_payload.get("Type", dd_payload.get("dataType", ""))
258
+ if dd_json_data_type == "Binary":
259
+ dd_json_data = dd_payload.get(
260
+ "binaryValue",
261
+ dd_payload.get("Value", r"{}"),
262
+ )
263
+ dd_json_data = base64.b64decode(dd_json_data)
264
+ elif dd_json_data_type == "String":
265
+ dd_json_data = dd_payload.get(
266
+ "stringValue",
267
+ dd_payload.get("Value", r"{}"),
268
+ )
269
+ else:
270
+ logger.debug(
271
+ "Datadog Lambda Python only supports extracting trace"
272
+ "context from String or Binary SQS/SNS message attributes"
273
+ )
274
+
275
+ if dd_json_data:
276
+ dd_data = json.loads(dd_json_data)
277
+ return propagator.extract(dd_data)
265
278
  else:
266
- logger.debug(
267
- "Datadog Lambda Python only supports extracting trace"
268
- "context from String or Binary SQS/SNS message attributes"
269
- )
270
- return extract_context_from_lambda_context(lambda_context)
271
- dd_data = json.loads(dd_json_data)
272
- return propagator.extract(dd_data)
279
+ # Handle case where trace context is injected into attributes.AWSTraceHeader
280
+ # example: Root=1-654321ab-000000001234567890abcdef;Parent=0123456789abcdef;Sampled=1
281
+ x_ray_header = first_record.get("attributes", {}).get("AWSTraceHeader")
282
+ if x_ray_header:
283
+ x_ray_context = parse_xray_header(x_ray_header)
284
+ trace_id_parts = x_ray_context.get("trace_id", "").split("-")
285
+ if len(trace_id_parts) > 2 and trace_id_parts[2].startswith(
286
+ DD_TRACE_JAVA_TRACE_ID_PADDING
287
+ ):
288
+ # If it starts with eight 0's padding,
289
+ # then this AWSTraceHeader contains Datadog injected trace context
290
+ logger.debug(
291
+ "Found dd-trace injected trace context from AWSTraceHeader"
292
+ )
293
+ return Context(
294
+ trace_id=int(trace_id_parts[2][8:], 16),
295
+ span_id=int(int(x_ray_context["parent_id"], 16)),
296
+ sampling_priority=float(x_ray_context["sampled"]),
297
+ )
298
+ return extract_context_from_lambda_context(lambda_context)
273
299
  except Exception as e:
274
300
  logger.debug("The trace extractor returned with error %s", e)
275
301
  return extract_context_from_lambda_context(lambda_context)
datadog_lambda/wrapper.py CHANGED
@@ -22,7 +22,6 @@ from datadog_lambda.constants import (
22
22
  TraceContextSource,
23
23
  XraySubsegment,
24
24
  Headers,
25
- TraceHeader,
26
25
  )
27
26
  from datadog_lambda.metric import (
28
27
  flush_stats,
@@ -44,6 +43,7 @@ from datadog_lambda.tracing import (
44
43
  InferredSpanInfo,
45
44
  is_authorizer_response,
46
45
  tracer,
46
+ propagator,
47
47
  )
48
48
  from datadog_lambda.trigger import (
49
49
  extract_trigger_tags,
@@ -254,13 +254,7 @@ class _LambdaDecorator(object):
254
254
  injected_headers = {}
255
255
  source_span = self.inferred_span if self.inferred_span else self.span
256
256
  span_context = source_span.context
257
- injected_headers[TraceHeader.TRACE_ID] = str(span_context.trace_id)
258
- injected_headers[TraceHeader.PARENT_ID] = str(span_context.span_id)
259
- sampling_priority = span_context.sampling_priority
260
- if sampling_priority is not None:
261
- injected_headers[TraceHeader.SAMPLING_PRIORITY] = str(
262
- span_context.sampling_priority
263
- )
257
+ propagator.inject(span_context, injected_headers)
264
258
  injected_headers[Headers.Parent_Span_Finish_Time] = finish_time_ns
265
259
  if request_id is not None:
266
260
  injected_headers[Headers.Authorizing_Request_Id] = request_id
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datadog_lambda
3
- Version: 5.91.0
3
+ Version: 5.92.0
4
4
  Summary: The Datadog AWS Lambda Library
5
5
  Home-page: https://github.com/DataDog/datadog-lambda-python
6
6
  License: Apache-2.0
@@ -14,13 +14,13 @@ datadog_lambda/statsd_writer.py,sha256=F4SCJ6-J6YfvQNh0uQfAkP6QYiAtV3-MCsxz4QnaB
14
14
  datadog_lambda/tag_object.py,sha256=Kcys4Mo4_4vdXxq4XS7ilWpCuSQQyVRSjDejgq6RJS4,2112
15
15
  datadog_lambda/tags.py,sha256=wIG1f5iq85dq3FNV-yi-D0XwqYOx8jE0x_8Re6Ucmso,3240
16
16
  datadog_lambda/thread_stats_writer.py,sha256=fkjMDgrzwACrK_ZrCwl9mHz5U3CMLEyrsaondjdM3r8,2522
17
- datadog_lambda/tracing.py,sha256=P0WRNSGjeXUgFg1OgNODRJKRUQyTI4qf4fTsHXUkvOs,46855
17
+ datadog_lambda/tracing.py,sha256=4iYZ89Ow9pb9FpV8A5wrIwybvBdi6HJ_Ze3qdsCT990,48234
18
18
  datadog_lambda/trigger.py,sha256=_Sxpy9UpMDHdw_X1hD61G4OTex7CIYQw1guFu6dzByo,12082
19
- datadog_lambda/wrapper.py,sha256=NrM6_TCWi4sjIHSSGAjAZV7hdF8PxJwCurRQUCnjspo,15547
19
+ datadog_lambda/wrapper.py,sha256=ikeMVhpZO9bK6zf0YjbpU6qOcPMyXY13pOIOUUfKJMA,15223
20
20
  datadog_lambda/xray.py,sha256=05-8xd3GOOIDtGaB4k2Ow1kbWn86Px2mhyKEUYIwKIc,3448
21
- datadog_lambda-5.91.0.dist-info/LICENSE,sha256=4yQmjpKp1MKL7DdRDPVHkKYc2W0aezm5SIDske8oAdM,11379
22
- datadog_lambda-5.91.0.dist-info/LICENSE-3rdparty.csv,sha256=JDC3fYxFni7456BCvwPTA-DEDv8l8B0QHYDuqnu9UjI,290
23
- datadog_lambda-5.91.0.dist-info/METADATA,sha256=FpQ_FWxRjP7VzS0T42cwz7gYh7kA6fntqZXpWqlX58M,7326
24
- datadog_lambda-5.91.0.dist-info/NOTICE,sha256=Jue-d8mQ1ENIHDZdYc2-X8mVYtScXb8pzF1pTLN-kRc,141
25
- datadog_lambda-5.91.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
26
- datadog_lambda-5.91.0.dist-info/RECORD,,
21
+ datadog_lambda-5.92.0.dist-info/LICENSE,sha256=4yQmjpKp1MKL7DdRDPVHkKYc2W0aezm5SIDske8oAdM,11379
22
+ datadog_lambda-5.92.0.dist-info/LICENSE-3rdparty.csv,sha256=JDC3fYxFni7456BCvwPTA-DEDv8l8B0QHYDuqnu9UjI,290
23
+ datadog_lambda-5.92.0.dist-info/METADATA,sha256=HCeMsVTiswHqnKnfVRDOX47uz665OuddZbDYqxYhAtc,7326
24
+ datadog_lambda-5.92.0.dist-info/NOTICE,sha256=Jue-d8mQ1ENIHDZdYc2-X8mVYtScXb8pzF1pTLN-kRc,141
25
+ datadog_lambda-5.92.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
26
+ datadog_lambda-5.92.0.dist-info/RECORD,,