Estimated end-of-life date, accurate to within three months: 08-2026 See the support level definitions for more information.
gevent.joinall is called.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
gevent.joinall is called.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
BaseEvaluator class, providing more flexibility and structure for implementing evaluation logic. The EvaluatorContext stores the context of the evaluation, including the dataset record and span information. Additionally, class-based summary evaluators are supported via BaseSummaryEvaluator, which receives a SummaryEvaluatorContext containing aggregated inputs, outputs, expected outputs, and per-row evaluation results.DD_TRACE_LOG_LEVEL to control the ddtrace logger level, following the log levels available in the logging module.pathlib.Path.open() for App and API Protection Exploit Prevention.DD_TRACE_TORNADO_ENABLED=true or DD_PATCH_MODULES=tornado:trueFallbackStreamWrapper (introduced for mid-stream fallback support) that caused an AttributeError when attempting to access the .handler attribute. The integration now gracefully handles both the original response format and wrapped responses by falling back to ddtrace's own stream wrapping when needed.asyncio task stacks could contain duplicated frames when the task was on-CPU is now fixed. The stack now correctly shows each frame only once.gevent.joinall is called.StreamedRunResult.stream_responses() method which was introduced in pydantic-ai==0.8.1. This was leading to agent spans not being finished.LLMObs.experiment was overly constrained due to the use of an invariant List type. The argument now uses the covariant Sequence type, allowing users to pass in a list of evaluator functions with narrower return type.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
BaseEvaluator class, providing more flexibility and structure for implementing evaluation logic. The EvaluatorContext stores the context of the evaluation, including the dataset record and span information. Additionally, class-based summary evaluators are supported via BaseSummaryEvaluator, which receives a SummaryEvaluatorContext containing aggregated inputs, outputs, expected outputs, and per-row evaluation results.DD_TRACE_LOG_LEVEL to control the ddtrace logger level, following the log levels available in the logging module.FallbackStreamWrapper (introduced for mid-stream fallback support) that caused an AttributeError when attempting to access the .handler attribute. The integration now gracefully handles both the original response format and wrapped responses by falling back to ddtrace's own stream wrapping when needed.asyncio task stacks could contain duplicated frames when the task was on-CPU is now fixed. The stack now correctly shows each frame only once.gevent.joinall is called.StreamedRunResult.stream_responses() method which was introduced in pydantic-ai==0.8.1. This was leading to agent spans not being finished.LLMObs.experiment was overly constrained due to the use of an invariant List type. The argument now uses the covariant Sequence type, allowing users to pass in a list of evaluator functions with narrower return type.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
⚠️ An issue was detected with Memory Profiling in this release. ⚠️ An issue was detected with Datastreams Monitoring in this release.
httpx library from 0.17.1 to 0.25.0. If you are using httpx versions prior to 0.25.0, upgrade to httpx>=0.25.0 to ensure compatibility with ddtrace.Tracer.data_streams_processor is deprecated and will be removed in v5.0.0. Use ddtrace.data_streams.data_streams_processor() instead.threading.Condition locking type profiling in Python. The Lock profiler now provides visibility into threading.Condition usage, helping identify contention in multi-threaded applications using condition variables.EvaluatorResult class that evaluator functions can return to provide additional fields beyond just the evaluation value. This enables evaluators to include reasoning, assessment, metadata, and tags alongside the evaluation result.RuntimeError caused by capturing the __dict__ attribute of an object that mutates during iteration.PicklingError when using multiprocessing.Manager() with lock profiling enabled on Python 3.14+. Python 3.14 changed the default multiprocessing start method from fork to forkserver, which requires all objects to be pickleable. The lock profiler's wrappers now properly support pickle serialization.tracer=None.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
BaseEvaluator class, providing more flexibility and structure for implementing evaluation logic. The EvaluatorContext stores the context of the evaluation, including the dataset record and span information. Additionally, class-based summary evaluators are supported via BaseSummaryEvaluator, which receives a SummaryEvaluatorContext containing aggregated inputs, outputs, expected outputs, and per-row evaluation results.FallbackStreamWrapper (introduced for mid-stream fallback support) that caused an AttributeError when attempting to access the .handler attribute. The integration now gracefully handles both the original response format and wrapped responses by falling back to ddtrace's own stream wrapping when needed.asyncio task stacks could contain duplicated frames when the task was on-CPU is now fixed. The stack now correctly shows each frame only once.StreamedRunResult.stream_responses() method which was introduced in pydantic-ai==0.8.1. This was leading to agent spans not being finished.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
FallbackStreamWrapper (introduced for mid-stream fallback support) that caused an AttributeError when attempting to access the .handler attribute. The integration now gracefully handles both the original response format and wrapped responses by falling back to ddtrace's own stream wrapping when needed.asyncio task stacks could contain duplicated frames when the task was on-CPU is now fixed. The stack now correctly shows each frame only once.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
httpx library from 0.17.1 to 0.25.0. If you are using httpx versions prior to 0.25.0, upgrade to httpx>=0.25.0 to ensure compatibility with ddtrace.Tracer.data_streams_processor is deprecated and will be removed in v5.0.0. Use ddtrace.data_streams.data_streams_processor() instead.threading.Condition locking type profiling in Python. The Lock profiler now provides visibility into threading.Condition usage, helping identify contention in multi-threaded applications using condition variables.EvaluatorResult class that evaluator functions can return to provide additional fields beyond just the evaluation value. This enables evaluators to include reasoning, assessment, metadata, and tags alongside the evaluation result.RuntimeError caused by capturing the __dict__ attribute of an object that mutates during iteration.PicklingError when using multiprocessing.Manager() with lock profiling enabled on Python 3.14+. Python 3.14 changed the default multiprocessing start method from fork to forkserver, which requires all objects to be pickleable. The lock profiler's wrappers now properly support pickle serialization.tracer=None.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
anthropic: Handle empty content field when tracing the beta client.
LLM Observability: Resolves an issue in activate_distributed_headers() where distributed requests missing a LLM Observability trace ID would be incorrectly propagated twice.
profiling: Fixes a bug where code that sub-classes our wrapped locks crashes with TypeError during profiling. One example of this is neo4j's AsyncRLock, which inherits from asyncio.Lock: https://github.com/neo4j/neo4j-python-driver/blob/6.x/src/neo4j/_async_compat/concurrency.py#L45
profiling: This fix resolves a race condition leading to incorrect stacks being reported for asyncio parent/child Tasks (e.g. when using asyncio.gather).
profiling: Fixes a PicklingError when using multiprocessing.Manager() with lock profiling enabled on Python 3.14+. Python 3.14 changed the default multiprocessing start method from fork to forkserver, which requires all objects to be pickleable. The lock profiler's wrappers now properly support pickle serialization.
Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
activate_distributed_headers() where distributed requests missing a LLM Observability trace ID would be incorrectly propagated twice.TypeError during profiling.
One example of this is neo4j's AsyncRLock, which inherits from asyncio.Lock:
https://github.com/neo4j/neo4j-python-driver/blob/6.x/src/neo4j/_async_compat/concurrency.py#L45asyncio.gather).Estimated end-of-life date, accurate to within three months: 08-2026 See the support level definitions for more information.
isDefined to result in an evaluation error.TypeError during profiling. One example of this is neo4j's AsyncRLock, which inherits from asyncio.Lock: https://github.com/neo4j/neo4j-python-driver/blob/6.x/src/neo4j/_async_compat/concurrency.py#L45Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
Bug Fixes
Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
Hooks class (config.<integration>.hooks) is deprecated and will be removed in v5.0. All hook methods (register(), on(), deregister(), emit()) are now no-op and no longer affect span behavior. To interact with spans, use ddtrace.trace_utils.get_current_span() or ddtrace.trace_utils.get_current_root_span() instead.initialize requests and their responses on modelcontextprotocol/python-sdk servers.source:otel tagging for evaluations when OpenTelemetry (OTel) tracing is enabled when DD_TRACE_OTEL_ENABLED=true is set. This tag allows the backend to wait for OTel span conversion before processing evaluations.DD_MCP_CAPTURE_INTENT environment variable.asyncio.BoundedSemaphore lock type profiling in Python Lock Profiler.asyncio.Condition locking type profiling in Python. The Lock profiler now provides visibility into asyncio.Condition usage, helping identify contention in async applications using condition variables.asyncio.Semaphore lock type profiling in Python Lock Profiler.asyncio.shield.asyncio.TaskGroup.aws.httpapi span name for v2 apis when the API Gateway sets the x-dd-proxy header to aws-httpapi. Additionally, the tag http.route and the resource name of the span now contains the api resource path instead of the path when propagated with the x-dd-proxy-resource-path header.DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED support, which was previously ignored.https:// scheme prefix as part of the http.url tag; this caused the entire url to be parsed as the http path.isDefined to result in an evaluation error.DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true), ensuring remote configuration is received before process forking occurs.None metadata in Ray job submission caused a crash.AttributeError when calling tag_agent_manifest.annotation_context blocks caused annotations to fail after the first operation in subsequent contexts. Previously, the trace context created by the first annotation_context remained active after exiting, causing the second context to reuse a stale context ID. This resulted in annotations not being applied to spans after the first batch call in the second annotation_context block.activate_distributed_headers() where distributed requests missing a LLM Observability trace ID would be incorrectly propagated twice.TypeError during profiling. One example of this is neo4j's AsyncRLock, which inherits from asyncio.Lock: https://github.com/neo4j/neo4j-python-driver/blob/6.x/src/neo4j/_async_compat/concurrency.py#L45uvloop and forking has been resolved._psutil_linux.abi3.so file in an injected environment.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
Hooks class (config.<integration>.hooks) is deprecated and will be removed in v5.0. All hook methods (register(), on(), deregister(), emit()) are now no-op and no longer affect span behavior. To interact with spans, use ddtrace.trace_utils.get_current_span() or ddtrace.trace_utils.get_current_root_span() instead.initialize requests and their responses on modelcontextprotocol/python-sdk servers.source:otel tagging for evaluations when OpenTelemetry (OTel) tracing is enabled when DD_TRACE_OTEL_ENABLED=true is set. This tag allows the backend to wait for OTel span conversion before processing evaluations.DD_MCP_CAPTURE_INTENT environment variable.asyncio.BoundedSemaphore lock type profiling in Python Lock Profiler.asyncio.Condition locking type profiling in Python. The Lock profiler now provides visibility into asyncio.Condition usage, helping identify contention in async applications using condition variables.asyncio.Semaphore lock type profiling in Python Lock Profiler.asyncio.shield.asyncio.TaskGroup.aws.httpapi span name for v2 apis when the API Gateway sets the x-dd-proxy header to aws-httpapi. Additionally, the tag http.route and the resource name of the span now contains the api resource path instead of the path when propagated with the x-dd-proxy-resource-path header.DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED support, which was previously ignored.https:// scheme prefix as part of the http.url tag; this caused the entire url to be parsed as the http path.isDefined to result in an evaluation error.DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true), ensuring remote configuration is received before process forking occurs.None metadata in Ray job submission caused a crash.AttributeError when calling tag_agent_manifest.annotation_context blocks caused annotations to fail after the first operation in subsequent contexts. Previously, the trace context created by the first annotation_context remained active after exiting, causing the second context to reuse a stale context ID. This resulted in annotations not being applied to spans after the first batch call in the second annotation_context block.activate_distributed_headers() where distributed requests missing a LLM Observability trace ID would be incorrectly propagated twice.TypeError during profiling. One example of this is neo4j's AsyncRLock, which inherits from asyncio.Lock: https://github.com/neo4j/neo4j-python-driver/blob/6.x/src/neo4j/_async_compat/concurrency.py#L45uvloop and forking has been resolved._psutil_linux.abi3.so file in an injected environment.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
Hooks class (config.<integration>.hooks) is deprecated and will be removed in v5.0. All hook methods (register(), on(), deregister(), emit()) are now no-op and no longer affect span behavior. To interact with spans, use ddtrace.trace_utils.get_current_span() or ddtrace.trace_utils.get_current_root_span() instead.initialize requests and their responses on modelcontextprotocol/python-sdk servers.source:otel tagging for evaluations when OpenTelemetry (OTel) tracing is enabled when DD_TRACE_OTEL_ENABLED=true is set. This tag allows the backend to wait for OTel span conversion before processing evaluations.DD_MCP_CAPTURE_INTENT environment variable.asyncio.BoundedSemaphore lock type profiling in Python Lock Profiler.asyncio.Condition locking type profiling in Python. The Lock profiler now provides visibility into asyncio.Condition usage, helping identify contention in async applications using condition variables.asyncio.Semaphore lock type profiling in Python Lock Profiler.asyncio.shield.asyncio.TaskGroup.aws.httpapi span name for v2 apis when the API Gateway sets the x-dd-proxy header to aws-httpapi. Additionally, the tag http.route and the resource name of the span now contains the api resource path instead of the path when propagated with the x-dd-proxy-resource-path header.DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED support, which was previously ignored.https:// scheme prefix as part of the http.url tag; this caused the entire url to be parsed as the http path.isDefined to result in an evaluation error.DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true), ensuring remote configuration is received before process forking occurs.None metadata in Ray job submission caused a crash.AttributeError when calling tag_agent_manifest.annotation_context blocks caused annotations to fail after the first operation in subsequent contexts. Previously, the trace context created by the first annotation_context remained active after exiting, causing the second context to reuse a stale context ID. This resulted in annotations not being applied to spans after the first batch call in the second annotation_context block.activate_distributed_headers() where distributed requests missing a LLM Observability trace ID would be incorrectly propagated twice.TypeError during profiling. One example of this is neo4j's AsyncRLock, which inherits from asyncio.Lock: https://github.com/neo4j/neo4j-python-driver/blob/6.x/src/neo4j/_async_compat/concurrency.py#L45uvloop and forking has been resolved._psutil_linux.abi3.so file in an injected environment.Estimated end-of-life date, accurate to within three months: 07-2027 See the support level definitions for more information.
_psutil_linux.abi3.so file in an injected environment.annotation_context blocks caused annotations to fail after the first operation in subsequent contexts. Previously, the trace context created by the first annotation_context remained active after exiting, causing the second context to reuse a stale context ID. This resulted in annotations not being applied to spans after the first batch call in the second annotation_context block.uvloop and forking has been resolved.Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.
uvloop and forking has been resolved.profiling: This fix resolves an issue where memory profiler module fails to load when the system doesn't have libatomic installed.
profiling: This fix ensures the profiler now correctly tracks dependencies between Tasks and Coroutines that are awaiting or being awaited via asyncio.wait.
Estimated end-of-life date, accurate to within three months: 08-2026 See the support level definitions for more information.
ddtrace>=4.0.0.profiling: This fix resolves an issue where memory profiler module fails to load when the system doesn't have libatomic installed.
profiling: This fix ensures the profiler now correctly tracks dependencies between Tasks and Coroutines that are awaiting or being awaited via asyncio.wait.