v4.3.0
📦 datadog-sdkView on GitHub →
✨ 6 features🐛 14 fixes⚡ 1 deprecations🔧 14 symbols
Summary
This release introduces new profiling capabilities for threading conditions and asyncio task relationships, enhances LLM Observability, and enables WebSocket tracing by default for ASGI. It also mandates an upgrade for the minimum supported `httpx` version to 0.25.0 and fixes several stability and correctness issues across profiling and integrations.
Migration Steps
- If using `httpx` versions prior to `0.25.0`, upgrade to `httpx>=0.25.0` to ensure compatibility with `ddtrace`.
- If using `Tracer.data_streams_processor`, replace usage with `ddtrace.data_streams.data_streams_processor()`.
✨ New Features
- Profiling now supports `threading.Condition` locking type profiling in Python, providing visibility into condition variable usage.
- Profiler now supports tracking parent-child relationships between asyncio tasks, leading to better flame graphs.
- Added SSRF exploit prevention and OWASP API top 10 security risks analysis for the httpx client via AAP.
- WebSocket instrumentation is now enabled by default for ASGI applications, automatically capturing traces.
- Added `EvaluatorResult` class for LLM Observability, allowing evaluator functions to return additional fields like `reasoning`, `assessment`, `metadata`, and `tags`.
- 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.
- Avoided `RuntimeError` during exception replay caused by capturing `__dict__` of an object that mutates during iteration.
- Fixed AWS Bedrock unexpected list type issue in LLM Observability.
- Resolved an issue where the langchain integration incorrectly marked openai responses as duplicate LLM spans.
- Fixed a race condition during PeriodicThread shutdown that caused random crashes on Python 3.14+ 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 lock profiler wrappers support pickle serialization.
- Resolved an issue where the stack profiler could loop infinitely while holding a lock, preventing greenlets from starting/exiting.
- 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 upside down.
- Fixed an issue where a duplicate key in a cache could lead to inconsistent profiles.
- Fixed an issue where initializing a TracedClient without a tracer disabled tracing; the global tracer is now used when `tracer=None` for pylibmc.
Affected Symbols
⚡ Deprecations
- `Tracer.data_streams_processor` is deprecated and will be removed in v5.0.0. Use `ddtrace.data_streams.data_streams_processor()` instead.