releases.shpreview
Datadog/Datadog dd-trace-py

Datadog dd-trace-py

$npx -y @buildinternet/releases show datadog-dd-trace-py
Mon
Wed
Fri
AprMayJunJulAugSepOctNovDecJanFebMarApr
Less
More
Releases54Avg17/moVersionsv4.2.1 → v4.7.1
Feb 4, 2026

Estimated end-of-life date, accurate to within three months: 08-2026 See the support level definitions for more information.

Bug Fixes

  • profiling: fixed an issue that causes greenlets to misbehave when gevent.joinall is called.
Feb 2, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Bug Fixes

  • celery: This fix resolves panics in the NativeWriter caused by celery closing file descriptors when starting beat.
  • Data Streams Monitoring: Fixes a regression introduced in v4.3.0 that prevented DSM from being automatically enabled for Kaf ka, AioKafka, Kombu, and Botocore integrations.
  • profiling: Fixed an issue that causes greenlets to misbehave when gevent.joinall is called.

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

New Features

  • LLM Observability
    • Adds support for class-based evaluators in LLM Observability. Users can now define custom evaluators by subclassing the 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.
    • Adds support for running synchronous evaluators concurrently in experiments. Async evaluators are not supported.
  • logging
    • Adds a new environment variable DD_TRACE_LOG_LEVEL to control the ddtrace logger level, following the log levels available in the logging module.
  • dynamic instrumentation
    • added support for capture expressions in log probes.
  • AAP
    • This introduces support for Local File Inclusion (LFI) detection in pathlib.Path.open() for App and API Protection Exploit Prevention.
    • This introduces AAP support for tornado web framework. This must be explicitly enabled with DD_TRACE_TORNADO_ENABLED=true or DD_PATCH_MODULES=tornado:true

Bug Fixes

  • AAP
    • Fixes an issue where agent-based samplers could interfere with Standalone App and API Protection. In standalone mode, a trace need to be sent every minute to keep the service enabled, agent-based samplers with low sample rates could reject traces before the custom App and API Protection sampler was evaluated.
  • aws_lambda
    • This fix resolves an issue where user-defined SIGALRM handlers were not restored after TimeoutChannel cleanup, causing custom timeout handlers to stop working after the first Lambda invocation.
  • exception replay
    • fix a gevent support issue that could cause an exception when Exception Replay tries to figure out if a frame belongs to user code for capturing.
    • fix for errors while capturing exception replay snapshots.
  • litellm
    • This fix resolves an issue where litellm>=1.74.15 wrapped router streaming responses in 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.
  • profiling
    • A bug where non-pushed samples could leak data to subsequent samples has been fixed.
    • A bug where 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.
    • The stack Profiler now correctly resets thread, task, and greenlet information after a fork, preventing stale data from the parent process from affecting profiling in child processes.
    • Fixed crash in lock profiler when stack traces are too shallow (less than 4 frames). This could occur during interpreter bootstrap, atexit callbacks, or other edge cases. In these rare scenarios, locks may now appear with location "unknown:0" in profiling data instead of causing application crashes.
    • fixed an issue that causes greenlets to misbehave when gevent.joinall is called.
    • This fix resolves a crash occurring when forking while using the memory profiler.
    • The Profiler now always reports CPU time for threads, regardless of whether they are running when the sample is captured.
    • This fix ensures the memory profiler clears its internal state immediately after fork in child processes via pthread_atfork. This prevents potential issues from stale data and prepares the codebase for future performance optimizations.
  • LLM Observability
    • This fix resolves an issue where the Pydantic AI integration was not properly tracing the StreamedRunResult.stream_responses() method which was introduced in pydantic-ai==0.8.1. This was leading to agent spans not being finished.
    • This fix addresses an issue where the evaluators argument type for 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.
    • Fixes an issue where OpenAI spans would show <span class="title-ref">model_name: "None"</span> instead of falling back to the request model if the API response returns a None model field. The model name now properly falls back to <span class="title-ref">openai.request.model</span> or <span class="title-ref">"unknown_model"</span> if both are unavailable.
  • celery
    • This fix resolves panics in the NativeWriter caused by celery closing file descriptors when starting beat.
  • code origin
    • remove noisy warning messages for non-callable view objects that cannot be instrumented.
  • dynamic instrumentation
    • fixed an issue that prevented instrumented probes from being removed correctly when Dynamic Instrumentation is disabled remotely from the Datadog UI via the Settings page.
  • Data Streams Monitoring
    • Fixes a regression introduced in v4.3.0 that prevented DSM from being automatically enabled for Kafka, AioKafka, Kombu, and Botocore integrations.
Jan 29, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Bug Fixes

  • profiling
    • This fix resolves a crash occurring when forking while using the memory profiler.
Jan 28, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

New Features

  • LLM Observability
    • Adds support for class-based evaluators in LLM Observability. Users can now define custom evaluators by subclassing the 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.
  • logging
    • Adds a new environment variable DD_TRACE_LOG_LEVEL to control the ddtrace logger level, following the log levels available in the logging module.

Bug Fixes

  • AAP
    • Fixes an issue where agent-based samplers could interfere with Standalone App and API Protection. In standalone mode, a trace need to be sent every minute to keep the service enabled, agent-based samplers with low sample rates could reject traces before the custom App and API Protection sampler was evaluated.
  • aws_lambda
    • This fix resolves an issue Fhere user-defined SIGALRM handlers were not restored after TimeoutChannel cleanup, causing custom timeout handlers to stop working after the first Lambda invocation.
  • exception replay
    • Fix a gevent support issue that could cause an exception when Exception Replay tries to figure out if a frame belongs to user code for capturing.
  • litellm
    • This fix resolves an issue where litellm>=1.74.15 wrapped router streaming responses in 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.
  • profiling
    • A bug where non-pushed samples could leak data to subsequent samples has been fixed.
    • A bug where 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.
    • The stack Profiler now correctly resets thread, task, and greenlet information after a fork, preventing stale data from the parent process from affecting profiling in child processes.
    • Fixed crash in lock profiler when stack traces are too shallow (less than 4 frames). This could occur during interpreter bootstrap, atexit callbacks, or other edge cases. In these rare scenarios, locks may now appear with location "unknown:0" in profiling data instead of causing application crashes.
    • Fixed an issue that causes greenlets to misbehave when gevent.joinall is called.
    • This fix resolves a crash occurring when forking while using the memory profiler.
  • LLM Observability
    • This fix resolves an issue where the Pydantic AI integration was not properly tracing the StreamedRunResult.stream_responses() method which was introduced in pydantic-ai==0.8.1. This was leading to agent spans not being finished.
    • This fix addresses an issue where the evaluators argument type for 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.
    • Fixes an issue where OpenAI spans would show <span class="title-ref">model_name: "None"</span> instead of falling back to the request model if the API response returns a None model field. The model name now properly falls back to <span class="title-ref">openai.request.model</span> or <span class="title-ref">"unknown_model"</span> if both are unavailable.
Jan 27, 2026

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.

Upgrade Notes

  • httpx
    • This upgrades the minimum supported version of the 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.

Deprecation Notes

  • tracing
    • Tracer.data_streams_processor is deprecated and will be removed in v5.0.0. Use ddtrace.data_streams.data_streams_processor() instead.

New Features

  • profiling
    • Add support for 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.
    • The profiler now supports tracking parent-child relationships between asyncio tasks. This will result in better stacks in flame graphs.
  • AAP
    • Add SSRF exploit prevention and OWASP API top 10 security risks analysis for the <span class="title-ref">httpx</span> client.
  • asgi
    • WebSocket instrumentation is now enabled by default, automatically capturing traces for WebSocket connections without requiring additional configuration.
  • LLM Observability
    • Adds 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.
  • lib-injection
    • Enable lib-injection on Python 3.14.

Bug Fixes

  • AAP
    • This fix resolves an issue where some downstream request analysis rules were not matched because HTTP header names were compared case-sensitively; header names are now normalized so rules match correctly.
  • exception replay
    • avoid RuntimeError caused by capturing the __dict__ attribute of an object that mutates during iteration.
  • LLM Observability
    • fix AWS Bedrock unexpected list type.
    • Resolves an issue where the langchain integration incorrectly marked openai responses as duplicate LLM spans even if there was a downstream LLM span generated by the openai integration.
  • internal
    • This fix resolves an issue where a race condition during PeriodicThread shutdown caused random crashes on Python 3.14+ during application finalization.
  • tracer
    • Removes wrap executor and context provider after tracer shutdown.
    • django
      • fixes an issue where Django user IDs did not get added as a span tag if they were UUID formatted.
  • profiling
    • A bug that would cause the process to temporarily hang upon fork in very rare cases has been fixed.
    • 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.
    • This fix resolves an issue where stack profiler could loop infinitely while holding a lock. This could have led to stopping greenlets from starting and/or exiting.
    • This fix resolves an issue where the stack profiler could loop infinitely when iterating through Python interpreter states. This could have occurred if the interpreter linked list became corrupted or contained a cycle, potentially causing the profiler to hang. The fix adds both cycle detection and an iteration limit (256 interpreters) to prevent unbounded loops.
    • This fix resolves an issue where memory profiler flamegraphs were upside down.
    • An issue where a duplicate key in a cache could lead to inconsistent profiles has been fixed.
  • pylibmc
    • Fixes an issue where initializing a TracedClient without a tracer disables tracing. The global tracer is now used when tracer=None.

Other Changes

  • profiling
    • A redundant syscall per thread during stack sampling was eliminated by caching the thread running state when updating CPU time, reducing syscall overhead from 3 to 2 calls per thread on Linux.

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Bug fixes

  • Profiling
    • A bug that would cause the process to temporarily hang upon fork in very rare cases has been fixed.

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

New Features

  • LLM Observability
    • Adds support for class-based evaluators in LLM Observability. Users can now define custom evaluators by subclassing the 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.

Bug Fixes

  • AAP
    • Fixes an issue where agent-based samplers could interfere with Standalone App and API Protection. In standalone mode, a trace need to be sent every minute to keep the service enabled, agent-based samplers with low sample rates could reject traces before the custom App and API Protection sampler was evaluated.
  • aws_lambda
    • This fix resolves an issue where user-defined SIGALRM handlers were not restored after TimeoutChannel cleanup, causing custom timeout handlers to stop working after the first Lambda invocation.
  • exception replay
    • fix a gevent support issue that could cause an exception when Exception Replay tries to figure out if a frame belongs to user code for capturing.
  • litellm
    • This fix resolves an issue where litellm>=1.74.15 wrapped router streaming responses in 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.
  • profiling
    • A bug where non-pushed samples could leak data to subsequent samples has been fixed.
    • A bug where 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.
    • The stack Profiler now correctly resets thread, task, and greenlet information after a fork, preventing stale data from the parent process from affecting profiling in child processes.
  • LLM Observability
    • This fix resolves an issue where the Pydantic AI integration was not properly tracing the StreamedRunResult.stream_responses() method which was introduced in pydantic-ai==0.8.1. This was leading to agent spans not being finished.
Jan 22, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Bug Fixes

  • LLM Observability
    • Resolves an issue where the langchain integration incorrectly marked openai responses as duplicate LLM spans even if there was a downstream LLM span generated by the openai integration.
    • litellm: This fix resolves an issue where litellm>=1.74.15 wrapped router streaming responses in 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.
  • profiling
    • A bug where 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.
    • This fix resolves an issue where memory profiler flamegraphs were upside down.
Jan 21, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Upgrade Notes

  • httpx
    • This upgrades the minimum supported version of the 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.

Deprecation Notes

  • tracing
    • Tracer.data_streams_processor is deprecated and will be removed in v5.0.0. Use ddtrace.data_streams.data_streams_processor() instead.

New Features

  • profiling
    • Add support for 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.
    • The profiler now supports tracking parent-child relationships between asyncio tasks. This will result in better stacks in flame graphs.
  • AAP
    • Add SSRF exploit prevention and OWASP API top 10 security risks analysis for the <span class="title-ref">httpx</span> client.
  • asgi
    • WebSocket instrumentation is now enabled by default, automatically capturing traces for WebSocket connections without requiring additional configuration.
  • LLM Observability
    • Adds 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.
  • lib-injection
    • Enable lib-injection on Python 3.14.

Bug Fixes

  • AAP
    • This fix resolves an issue where some downstream request analysis rules were not matched because HTTP header names were compared case-sensitively; header names are now normalized so rules match correctly.
  • exception replay
    • avoid RuntimeError caused by capturing the __dict__ attribute of an object that mutates during iteration.
  • LLM Observability
    • fix AWS Bedrock unexpected list type.
    • Resolves an issue where the langchain integration incorrectly marked openai responses as duplicate LLM spans even if there was a downstream LLM span generated by the openai integration.
  • internal
    • This fix resolves an issue where a race condition during PeriodicThread shutdown caused random crashes on Python 3.14+ during application finalization.
  • tracer
    • Removes wrap executor and context provider after tracer shutdown.
    • django
      • fixes an issue where Django user IDs did not get added as a span tag if they were UUID formatted.
  • profiling
    • A bug that would cause the process to temporarily hang upon fork in very rare cases has been fixed.
    • 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.
    • This fix resolves an issue where stack profiler could loop infinitely while holding a lock. This could have led to stopping greenlets from starting and/or exiting.
    • This fix resolves an issue where the stack profiler could loop infinitely when iterating through Python interpreter states. This could have occurred if the interpreter linked list became corrupted or contained a cycle, potentially causing the profiler to hang. The fix adds both cycle detection and an iteration limit (256 interpreters) to prevent unbounded loops.
    • This fix resolves an issue where memory profiler flamegraphs were upside down.
    • An issue where a duplicate key in a cache could lead to inconsistent profiles has been fixed.
  • pylibmc
    • Fixes an issue where initializing a TracedClient without a tracer disables tracing. The global tracer is now used when tracer=None.

Other Changes

  • profiling
    • A redundant syscall per thread during stack sampling was eliminated by caching the thread running state when updating CPU time, reducing syscall overhead from 3 to 2 calls per thread on Linux.
Jan 14, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Bug Fixes

  • 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.

Bug Fixes

  • LLM Observability: Resolves an issue in activate_distributed_headers() where distributed requests missing a LLM Observability trace ID would be incorrectly propagated twice.
<!-- --> <!-- -->
  • profiling: This fix resolves a race condition leading to incorrect stacks being reported for asyncio parent/child Tasks (e.g. when using asyncio.gather).
Jan 13, 2026

Estimated end-of-life date, accurate to within three months: 08-2026 See the support level definitions for more information.

Bug Fixes

  • dynamic instrumentation: fixed an issue that caused condition expressions containing isDefined to result in an evaluation error.
<!-- -->
Jan 12, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Bug Fixes

  • LLM Observability
    • Handle empty content field when tracing the anthropic beta client.
  • profiling
    • A bug that would cause missing frames in profiles for off-CPU asyncio Tasks has been resolved.
Jan 9, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Upgrade Notes

  • tracing
    • The 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.

New Features

  • LLM Observability
    • Adds tracing of initialize requests and their responses on modelcontextprotocol/python-sdk servers.
    • This introduces automatic 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.
    • Changes format of MCP server tool call span input, output, and tags to include the full request and response objects.
    • Reasoning token counts are now captured from VertexAI responses.
    • Adds ability to automatically capture the intent and context of an MCP server tool call to modelcontextprotocol/python-sdk servers using the DD_MCP_CAPTURE_INTENT environment variable.
  • profiling
    • Add support for asyncio.BoundedSemaphore lock type profiling in Python Lock Profiler.
    • Add support for 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.
    • Add support for asyncio.Semaphore lock type profiling in Python Lock Profiler.
    • the Profiler now properly stacks flame graphs for Tasks awaiting and awaited through asyncio.shield.
    • the Profiler now tracks Tasks created through asyncio.TaskGroup.
  • AAP
    • Add business logic event detection for Stripe. This feature instruments the payment intent and checkout session creation actions as well as the payment_intent.succeeded, payment_intent.payment_failed and payment_intent.canceled events.
    • Proxy inferred spans now contain events when AppSec is enabled so that they are reported on the App and API Protection Endpoint Catalog.
  • DBM
    • Adds container tags support
  • DSM
    • Adds container tags support
  • tracing
    • Proxy inferred spans now differentiate between API Gateway v1 and v2 apis by emitting the 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.
  • vllm
    • Introduces tracing and LLM Observability support for vLLM V1 engine. Requires vLLM >= 0.10.2. See the docs for more information.

Bug Fixes

  • CI Visibility
    • This fix resolves an issue where code coverage instrumentation in Python 3.9 would raise an exception while handling line numbers in some corner cases.
  • crash tracking
    • Passing in all environment variables to the crashtracker receiver process caused conflicts with export location derivation. This change only passes in the DD_CRASHTRACKING_ERRORS_INTAKE_ENABLED environment variable.
  • falcon
    • Fixes DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED support, which was previously ignored.
  • tracing
    • Proxy inferred spans used to omit the https:// scheme prefix as part of the http.url tag; this caused the entire url to be parsed as the http path.
    • psycopg
      • Fixes an OperationalError that occurred when patching a closed psycopg3 connection.
  • dynamic instrumentation
    • fixed an issue that caused condition expressions containing isDefined to result in an evaluation error.
    • fixed an issue that prevented autocomplete information to be extracted from the running application.
  • openfeature
    • This fix resolves an issue where Feature Flagging and Experimentation (FFE) was not receiving remote configuration in forking web server environments (gunicorn, uWSGI). This caused the OpenFeature provider to return default values instead of configured feature flags. FFE is now properly registered as a product during tracer initialization (when DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true), ensuring remote configuration is received before process forking occurs.
    • Fix exposure event deduplication to use (flag_key, subject_id) as cache key instead of (flag_key, variant_key, allocation_key). This ensures different users each receive their own exposure event while still deduplicating repeated evaluations for the same user. Also adds LRU eviction to prevent unbounded memory growth and respects the do_log flag from flag metadata.
  • ray
  • This fix resolves an issue where None metadata in Ray job submission caused a crash.
  • openai_agents
    • This fix resolves an issue where a missing active span caused an AttributeError when calling tag_agent_manifest.
  • LLM Observability
    • This fix resolves an issue where using multiple sequential 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.
    • Resolves an issue in activate_distributed_headers() where distributed requests missing a LLM Observability trace ID would be incorrectly propagated twice.
  • profiling
    • This fix resolves an issue where memory profiler module fails to load when the system doesn't have libatomic installed.
    • This fix resolves an issue where the Lock profiler would not call the necessary initialization function, which would sometimes result in crashes.
    • the Profiler now always uses the name of leaf tasks for the "Task name" label. Previously, one of the Stacks would be labelled with the parent task's name, which would lead to inconsistent behaviour across runs.
    • 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
    • a bug causing crashes when using uvloop and forking has been resolved.
    • This improves the accuracy of stacks for on-CPU asyncio Tasks by reducing the odds of Frames for a Task polluting the stack of other Tasks.
    • the build now uses the correct location for the native extension module. Previously, linking would work correctly in tests, but published wheels failed to import the memory profiler extension.
  • SSI
    • This fixes an issue where ddtrace fails to find _psutil_linux.abi3.so file in an injected environment.
Jan 8, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Upgrade Notes

  • tracing
    • The 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.

New Features

  • LLM Observability
    • Adds tracing of initialize requests and their responses on modelcontextprotocol/python-sdk servers.
    • This introduces automatic 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.
    • Changes format of MCP server tool call span input, output, and tags to include the full request and response objects.
    • Reasoning token counts are now captured from VertexAI responses.
    • Adds ability to automatically capture the intent and context of an MCP server tool call to modelcontextprotocol/python-sdk servers using the DD_MCP_CAPTURE_INTENT environment variable.
  • profiling
    • Add support for asyncio.BoundedSemaphore lock type profiling in Python Lock Profiler.
    • Add support for 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.
    • Add support for asyncio.Semaphore lock type profiling in Python Lock Profiler.
    • the Profiler now properly stacks flame graphs for Tasks awaiting and awaited through asyncio.shield.
    • the Profiler now tracks Tasks created through asyncio.TaskGroup.
  • AAP
    • Add business logic event detection for Stripe. This feature instruments the payment intent and checkout session creation actions as well as the payment_intent.succeeded, payment_intent.payment_failed and payment_intent.canceled events.
    • Proxy inferred spans now contain events when AppSec is enabled so that they are reported on the App and API Protection Endpoint Catalog.
  • DBM
    • Adds container tags support
  • DSM
    • Adds container tags support
  • tracing
    • Proxy inferred spans now differentiate between API Gateway v1 and v2 apis by emitting the 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.
  • vllm
    • Introduces tracing and LLM Observability support for vLLM V1 engine. Requires vLLM >= 0.10.2. See the docs for more information.

Bug Fixes

  • CI Visibility
    • This fix resolves an issue where code coverage instrumentation in Python 3.9 would raise an exception while handling line numbers in some corner cases.
  • crash tracking
    • Passing in all environment variables to the crashtracker receiver process caused conflicts with export location derivation. This change only passes in the DD_CRASHTRACKING_ERRORS_INTAKE_ENABLED environment variable.
  • falcon
    • Fixes DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED support, which was previously ignored.
  • tracing
    • Proxy inferred spans used to omit the https:// scheme prefix as part of the http.url tag; this caused the entire url to be parsed as the http path.
    • psycopg
      • Fixes an OperationalError that occurred when patching a closed psycopg3 connection.
  • dynamic instrumentation
    • fixed an issue that caused condition expressions containing isDefined to result in an evaluation error.
    • fixed an issue that prevented autocomplete information to be extracted from the running application.
  • openfeature
    • This fix resolves an issue where Feature Flagging and Experimentation (FFE) was not receiving remote configuration in forking web server environments (gunicorn, uWSGI). This caused the OpenFeature provider to return default values instead of configured feature flags. FFE is now properly registered as a product during tracer initialization (when DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true), ensuring remote configuration is received before process forking occurs.
    • Fix exposure event deduplication to use (flag_key, subject_id) as cache key instead of (flag_key, variant_key, allocation_key). This ensures different users each receive their own exposure event while still deduplicating repeated evaluations for the same user. Also adds LRU eviction to prevent unbounded memory growth and respects the do_log flag from flag metadata.
  • ray
  • This fix resolves an issue where None metadata in Ray job submission caused a crash.
  • openai_agents
    • This fix resolves an issue where a missing active span caused an AttributeError when calling tag_agent_manifest.
  • LLM Observability
    • This fix resolves an issue where using multiple sequential 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.
    • Resolves an issue in activate_distributed_headers() where distributed requests missing a LLM Observability trace ID would be incorrectly propagated twice.
  • profiling
    • This fix resolves an issue where memory profiler module fails to load when the system doesn't have libatomic installed.
    • This fix resolves an issue where the Lock profiler would not call the necessary initialization function, which would sometimes result in crashes.
    • the Profiler now always uses the name of leaf tasks for the "Task name" label. Previously, one of the Stacks would be labelled with the parent task's name, which would lead to inconsistent behaviour across runs.
    • 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
    • a bug causing crashes when using uvloop and forking has been resolved.
    • This improves the accuracy of stacks for on-CPU asyncio Tasks by reducing the odds of Frames for a Task polluting the stack of other Tasks.
    • the build now uses the correct location for the native extension module. Previously, linking would work correctly in tests, but published wheels failed to import the memory profiler extension.
  • SSI
    • This fixes an issue where ddtrace fails to find _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.

Upgrade Notes

  • tracing
    • The 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.

New Features

  • LLM Observability
    • Adds tracing of initialize requests and their responses on modelcontextprotocol/python-sdk servers.
    • This introduces automatic 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.
    • Changes format of MCP server tool call span input, output, and tags to include the full request and response objects.
    • Reasoning token counts are now captured from VertexAI responses.
    • Adds ability to automatically capture the intent and context of an MCP server tool call to modelcontextprotocol/python-sdk servers using the DD_MCP_CAPTURE_INTENT environment variable.
  • profiling
    • Add support for asyncio.BoundedSemaphore lock type profiling in Python Lock Profiler.
    • Add support for 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.
    • Add support for asyncio.Semaphore lock type profiling in Python Lock Profiler.
    • the Profiler now properly stacks flame graphs for Tasks awaiting and awaited through asyncio.shield.
    • the Profiler now tracks Tasks created through asyncio.TaskGroup.
  • AAP
    • Add business logic event detection for Stripe. This feature instruments the payment intent and checkout session creation actions as well as the payment_intent.succeeded, payment_intent.payment_failed and payment_intent.canceled events.
    • Proxy inferred spans now contain events when AppSec is enabled so that they are reported on the App and API Protection Endpoint Catalog.
  • DBM
    • Adds container tags support
  • DSM
    • Adds container tags support
  • tracing
    • Proxy inferred spans now differentiate between API Gateway v1 and v2 apis by emitting the 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.
  • vllm
    • Introduces tracing and LLM Observability support for vLLM V1 engine. Requires vLLM >= 0.10.2. See the docs for more information.

Bug Fixes

  • CI Visibility
    • This fix resolves an issue where code coverage instrumentation in Python 3.9 would raise an exception while handling line numbers in some corner cases.
  • crash tracking
    • Passing in all environment variables to the crashtracker receiver process caused conflicts with export location derivation. This change only passes in the DD_CRASHTRACKING_ERRORS_INTAKE_ENABLED environment variable.
  • falcon
    • Fixes DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED support, which was previously ignored.
  • tracing
    • Proxy inferred spans used to omit the https:// scheme prefix as part of the http.url tag; this caused the entire url to be parsed as the http path.
    • psycopg
      • Fixes an OperationalError that occurred when patching a closed psycopg3 connection.
  • dynamic instrumentation
    • fixed an issue that caused condition expressions containing isDefined to result in an evaluation error.
    • fixed an issue that prevented autocomplete information to be extracted from the running application.
  • openfeature
    • This fix resolves an issue where Feature Flagging and Experimentation (FFE) was not receiving remote configuration in forking web server environments (gunicorn, uWSGI). This caused the OpenFeature provider to return default values instead of configured feature flags. FFE is now properly registered as a product during tracer initialization (when DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true), ensuring remote configuration is received before process forking occurs.
    • Fix exposure event deduplication to use (flag_key, subject_id) as cache key instead of (flag_key, variant_key, allocation_key). This ensures different users each receive their own exposure event while still deduplicating repeated evaluations for the same user. Also adds LRU eviction to prevent unbounded memory growth and respects the do_log flag from flag metadata.
  • ray
  • This fix resolves an issue where None metadata in Ray job submission caused a crash.
  • openai_agents
    • This fix resolves an issue where a missing active span caused an AttributeError when calling tag_agent_manifest.
  • LLM Observability
    • This fix resolves an issue where using multiple sequential 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.
    • Resolves an issue in activate_distributed_headers() where distributed requests missing a LLM Observability trace ID would be incorrectly propagated twice.
  • profiling
    • This fix resolves an issue where memory profiler module fails to load when the system doesn't have libatomic installed.
    • This fix resolves an issue where the Lock profiler would not call the necessary initialization function, which would sometimes result in crashes.
    • the Profiler now always uses the name of leaf tasks for the "Task name" label. Previously, one of the Stacks would be labelled with the parent task's name, which would lead to inconsistent behaviour across runs.
    • 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
    • a bug causing crashes when using uvloop and forking has been resolved.
    • This improves the accuracy of stacks for on-CPU asyncio Tasks by reducing the odds of Frames for a Task polluting the stack of other Tasks.
    • the build now uses the correct location for the native extension module. Previously, linking would work correctly in tests, but published wheels failed to import the memory profiler extension.
  • SSI
    • This fixes an issue where ddtrace fails to find _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.

Bug Fixes

  • SSI: This fixes an issue where ddtrace fails to find _psutil_linux.abi3.so file in an injected environment.
<!-- -->
  • LLM Observability: This fix resolves an issue where using multiple sequential 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.
<!-- -->
  • profiling: the Profiler now always uses the name of leaf tasks for the "Task name" label. Previously, one of the Stacks would be labelled with the parent task's name, which would lead to inconsistent behaviour across runs.
<!-- -->
  • profiling: a bug causing crashes when using uvloop and forking has been resolved.
<!-- -->
  • profiling: This improves the accuracy of stacks for on-CPU asyncio Tasks by reducing the odds of Frames for a Task polluting the stack of other Tasks.
<!-- -->
  • profiling: This fix resolves an issue where memory profiler module fails to load when the system doesn't have libatomic installed.
Jan 7, 2026

Estimated end-of-life date, accurate to within three months: 05-2027 See the support level definitions for more information.

Bug Fixes

  • CI Visibility: This fix resolves an issue where code coverage instrumentation in Python 3.9 would raise an exception while handling line numbers in some corner cases.
<!-- -->
  • profiling: a bug causing crashes when using 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.

Deprecation Notes

  • LLM Observability: Warning logs for incorrect usage of the LLM Observability SDK are deprecated and will be replaced with raised errors in ddtrace>=4.0.0.

Bug Fixes

  • CI Visibility: This fix resolves an issue where code coverage instrumentation in Python 3.9 would raise an exception while handling line numbers in some corner cases.
<!-- -->
  • profiling: This fix resolves an issue where the Lock profiler would not call the necessary initialization function, which would sometimes result in crashes.
<!-- -->
  • 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.

Latest
v4.7.1
Tracking Since
Sep 4, 2025
Last fetched Apr 19, 2026