datadog_lambda 5.91.0__tar.gz → 5.92.0__tar.gz

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.
Files changed (26) hide show
  1. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/PKG-INFO +1 -1
  2. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/tracing.py +47 -21
  3. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/wrapper.py +2 -8
  4. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/pyproject.toml +1 -1
  5. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/LICENSE +0 -0
  6. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/LICENSE-3rdparty.csv +0 -0
  7. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/NOTICE +0 -0
  8. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/README.md +0 -0
  9. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/__init__.py +0 -0
  10. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/api.py +0 -0
  11. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/cold_start.py +0 -0
  12. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/constants.py +0 -0
  13. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/dogstatsd.py +0 -0
  14. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/extension.py +0 -0
  15. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/handler.py +0 -0
  16. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/logger.py +0 -0
  17. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/metric.py +0 -0
  18. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/module_name.py +0 -0
  19. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/patch.py +0 -0
  20. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/stats_writer.py +0 -0
  21. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/statsd_writer.py +0 -0
  22. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/tag_object.py +0 -0
  23. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/tags.py +0 -0
  24. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/thread_stats_writer.py +0 -0
  25. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/trigger.py +0 -0
  26. {datadog_lambda-5.91.0 → datadog_lambda-5.92.0}/datadog_lambda/xray.py +0 -0
@@ -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
@@ -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)
@@ -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
  [tool.poetry]
2
2
  name = "datadog_lambda"
3
- version = "5.91.0"
3
+ version = "5.92.0"
4
4
  description = "The Datadog AWS Lambda Library"
5
5
  authors = ["Datadog, Inc. <dev@datadoghq.com>"]
6
6
  license = "Apache-2.0"
File without changes
File without changes