Change8

v4.3.0rc1

📦 datadog-sdkView on GitHub →
6 features🐛 14 fixes1 deprecations🔧 9 symbols

Summary

This release introduces significant enhancements to profiling, LLM Observability, and security analysis via AAP, while also increasing the minimum required version for the httpx dependency. Several critical bugs related to profiling stability and Django UUID tagging have been resolved.

Migration Steps

  1. If using `httpx` versions prior to `0.25.0`, upgrade to `httpx>=0.25.0` to ensure compatibility with `ddtrace`.
  2. Replace usage of `Tracer.data_streams_processor` with `ddtrace.data_streams.data_streams_processor()`.

✨ New Features

  • Added support for profiling `threading.Condition` locking type in Python, improving visibility into condition variable contention.
  • Profiler now supports tracking parent-child relationships between asyncio tasks, leading to better flame graph stacks.
  • Added SSRF exploit prevention and OWASP API top 10 security risk analysis for the httpx client via AAP.
  • WebSocket instrumentation is now enabled by default for ASGI applications, capturing traces automatically.
  • Added `EvaluatorResult` class for LLM Observability, allowing evaluators to return `reasoning`, `assessment`, `metadata`, and `tags` alongside the evaluation value.
  • Enabled lib-injection on Python 3.14.

🐛 Bug Fixes

  • Resolved an issue in AAP where downstream request analysis rules failed to match due to case-sensitive HTTP header name comparison; header names are now normalized.
  • Fixed a `RuntimeError` in exception replay caused by capturing the `__dict__` attribute of an object that mutates during iteration.
  • Fixed an issue in LLM Observability related to unexpected list types from AWS Bedrock.
  • Resolved an issue where the langchain integration incorrectly marked openai responses as duplicate LLM spans.
  • Fixed a race condition during PeriodicThread shutdown on Python 3.14+ that caused random crashes during application finalization.
  • Removed wrap executor and context provider after tracer shutdown.
  • Fixed an issue where Django user IDs formatted as UUIDs were not added as span tags.
  • Fixed a rare bug in profiling that caused the process to temporarily hang upon fork.
  • Fixed a `PicklingError` when using `multiprocessing.Manager()` with lock profiling enabled on Python 3.14+ by ensuring profiler wrappers support pickle serialization.
  • Resolved an issue where the stack profiler could loop infinitely while holding a lock, potentially blocking greenlets.
  • Resolved an issue where the stack profiler could loop infinitely when iterating through Python interpreter states by adding cycle detection and an iteration limit (256 interpreters).
  • Fixed an issue where memory profiler flamegraphs were rendered upside down.
  • Fixed an issue where a duplicate key in a cache could lead to inconsistent profiles.
  • Fixed an issue where initializing a TracedClient with `tracer=None` disabled tracing; the global tracer is now used instead.

Affected Symbols

⚡ Deprecations

  • The `Tracer.data_streams_processor` is deprecated and will be removed in v5.0.0. Users should switch to using `ddtrace.data_streams.data_streams_processor()` instead.