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
Mar 24, 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: Fix an unhandled RuntimeError that occurred when the git binary was not available. Git metadata upload is now skipped gracefully with a warning instead of aborting pytest startup.
<!-- -->
  • Fixed an issue with internal periodic threads that could have caused a crash during shutdown if a fork occurred.
<!-- -->
  • LLM Observability: Fixes an issue where SDK-side LLMObs spans (e.g. LLMObs.workflow()) and OTel-bridged spans (e.g. from Strands Agents with DD_TRACE_OTEL_ENABLED=1) produced separate LLMObs traces instead of a single unified trace.
Mar 23, 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: Fix an unhandled RuntimeError that occurred when the git binary was not available. Git metadata upload is now skipped gracefully with a warning instead of aborting pytest startup.
<!-- -->
  • LLM Observability: Fixes an issue where Anthropic LLM spans were dropped when streaming responses from Anthropic beta API features with tool use, such as tool_search_tool_regex.
<!-- -->
  • Fixed an issue with internal periodic threads that could have caused a crash during shutdown if a fork occurred.
<!-- -->
  • Fix for a potential race condition affecting internal periodic worker threads that could have caused a RuntimeError during forks.
<!-- -->
  • profiling: the memory profiler now uses the weighted allocation size in heap live size, fixing a bug where the reported heap live size was much lower than it really was.
Mar 19, 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: Fixes an issue where pytest plugins pytest-rerunfailures and flaky were silently overridden by the ddtrace plugin. With this change, external rerun plugins will now drive retries as expected when Auto Test Retries and Early Flake Detection features are both disabled, otherwise our retry mechanism takes precedence and a warning is emitted.
<!-- -->
  • CI Visibility (pytest): Fixed missing ITR tags in the new pytest plugin that caused time saved by Test Impact Analysis to not appear in dashboards.
<!-- -->
  • CI Visibility: Fixed an issue where a test marked as both quarantined and attempt-to-fix was incorrectly treated as plain quarantined, preventing attempt-to-fix flow from running.
<!-- -->
  • LLM Observability: Fixes an issue where Anthropic LLM spans were dropped when streaming responses from Anthropic beta API features with tool use, such as tool_search_tool_regex.
<!-- -->
  • tracing: Resolves an issue where a RuntimeError could be raised when iterating over the context._meta dictionary while creating spans or generating distributed traces.
<!-- -->
  • Fix for potential crashes at process shutdown due to incorrect detection of the VM finalization state when stopping periodic worker threads.
<!-- -->
  • profiling: Fix potential reentrant crashes in the memory profiler by avoiding object allocations and frees during stack unwinding inside the allocator hook.
<!-- -->
  • profiling: the memory profiler now uses the weighted allocation size in heap live size, fixing a bug where the reported heap live size was much lower than it really was.

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

Bug Fixes

  • CI Visibility: Fixes an issue where pytest plugins pytest-rerunfailures and flaky were silently overridden by the ddtrace plugin. With this change, external rerun plugins will now drive retries as expected when Auto Test Retries and Early Flake Detection features are both disabled, otherwise our retry mechanism takes precedence and a warning is emitted.
<!-- -->
  • CI Visibility (pytest): Fixed missing ITR tags in the new pytest plugin that caused time saved by Test Impact Analysis to not appear in dashboards.
<!-- -->
  • CI Visibility: Fixed an issue where a test marked as both quarantined and attempt-to-fix was incorrectly treated as plain quarantined, preventing attempt-to-fix flow from running.
<!-- -->
  • Tracing: Resolves an issue where a RuntimeError could be raised when iterating over the context._meta dictionary while creating spans or generating distributed traces.
Mar 18, 2026

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

New Features

  • mlflow

    • Adds a request header provider (auth plugin) for MLFlow. If the environment variables DD_API_KEY, DD_APP_KEY and DD_MODEL_LAB_ENABLED are set, HTTP requests to the MLFlow tracking server will include the DD-API-KEY and DD-APPLICATION-KEY headers. #16685
  • AI Guard

    • Calls to evaluate now block if blocking was enabled for the service in the AI Guard UI. This behavior can be disabled by passing the parameter block=False, which now defaults to block=True.
    • This updates the AI Guard API client to return Sensitive Data Scanner (SDS) results in the SDK response.
    • This introduces AI Guard support for Strands Agents. The Plugin API requires strands-agents>=1.29.0; the HookProvider works with any version that exposes the hooks system.
  • azure_durable_functions

    • Add tracing support for Azure Durable Functions. This integration traces durable activity and entity functions.
  • profiling

    • This adds process tags to profiler payloads. To deactivate this feature, set DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=false.
  • runtime metrics

    • This adds process tags to runtime metrics tags. To deactivate this feature, set DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=false.
  • remote configuration

    • This adds process tags to remote configuration payloads. To deactivate this feature, set DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=false.
  • dynamic instrumentation

    • This adds process tags to debugger payloads. To deactivate this feature, set DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=false.
  • crashtracking

    • This adds process tags to crash tracking payloads. To deactivate this feature, set DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=false.
  • data streams monitoring

    • This adds process tags to Data Streams Monitoring payloads. To deactivate this feature, set DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=false.
  • database monitoring

    • This adds process tags to Database Monitoring SQL service hash propagation. To deactivate this feature, set DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=false.
  • Stats computation

    • This adds process tags to stats computation payloads. To deactivate this feature, set DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=false.
  • LLM Observability

    • Experiment tasks can now optionally receive dataset record metadata as a third metadata parameter. Tasks with the existing (input_data, config) signature continue to work unchanged.
    • This introduces RemoteEvaluator which allows users to reference LLM-as-Judge evaluations configured in the Datadog UI by name when running local experiments. For more information, see the documentation: https://docs.datadoghq.com/llm_observability/guide/evaluation_developer_guide/#using-managed-evaluators
    • This adds cache creation breakdown metrics for the Anthropic integration. When making Anthropic calls with prompt caching, ephemeral_5m_input_tokens and ephemeral_1h_input_tokens metrics are now reported, distinguishing between 5 minute and 1 hour prompt caches.
    • Adds support for reasoning and extended thinking content in Anthropic, LiteLLM, and OpenAI-compatible integrations. Anthropic thinking blocks (type: "thinking") are now captured as role: "reasoning" messages in both streaming and non-streaming responses, as well as in input messages for tool use continuations. LiteLLM now extracts reasoning_output_tokens from completion_tokens_details and captures reasoning_content in output messages for OpenAI-compatible providers.
  • tracer

    • This introduces API endpoint discovery support for Tornado applications. HTTP endpoints are now automatically collected at application startup and reported via telemetry, bringing Tornado in line with Flask, FastAPI, and Django.
    • This adds process tags to trace payloads. To deactivate this feature, set DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=false.

Bug Fixes

  • CI Visibility
    • Fixes an issue where pytest plugins pytest-rerunfailures and flaky were silently overridden by the ddtrace plugin. With this change, external rerun plugins will now drive retries as expected when Auto Test Retries and Early Flake Detection features are both disabled, otherwise our retry mechanism takes precedence and a warning is emitted.
    • pytest:
      • Fixed missing ITR tags in the new pytest plugin that caused time saved by Test Impact Analysis to not appear in dashboards.
  • tracing
    • Resolves an issue where a RuntimeError could be raised when iterating over the context._meta dictionary while creating spans or generating distributed traces.
    • fixes an issue where telemetry debug mode was incorrectly enabled by DD_TRACE_DEBUG instead of its own dedicated environment variable DD_INTERNAL_TELEMETRY_DEBUG_ENABLED. Setting DD_TRACE_DEBUG=true no longer enables telemetry debug mode. To enable telemetry debug mode, set DD_INTERNAL_TELEMETRY_DEBUG_ENABLED=true.
  • LLM Observability
    • This fix resolves an issue where cache_creation_input_tokens and cache_read_input_tokens were not captured when using the LiteLLM integration with providers that support prompt caching (e.g., Anthropic, OpenAI, Deepseek).
  • profiling
    • Fixes an issue where enabling the profiler with gevent workers caused gunicorn to skip graceful shutdown, killing in-flight requests immediately on SIGTERM instead of honoring --graceful-timeout. #16424
    • Fix potential reentrant crashes in the memory profiler by avoiding object allocations and frees during stack unwinding inside the allocator hook. #16661
    • the Profiler now correctly flushes profiles at most once per upload interval.
    • Fixes an AttributeError crash that occurred when the lock profiler or stack profiler encountered _DummyThread instances. _DummyThread lacks the _native_id attribute, so accessing native_id raises AttributeError. The profiler now falls back to using the thread identifier when native_id is unavailable.
    • Lock acquire samples are now only recorded if the acquire call was successful.
  • Fix for potential crashes at process shutdown due to incorrect detection of the VM finalization state when stopping periodic worker threads.
Mar 16, 2026

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

Upgrade Notes

  • LLM Observability
    • Experiments spans now contain config from the experiment initialization, allowing for searching of relevant spans using the experiment config.
    • Experiments spans now contain the tags from the dataset records, allowing for searching of relevant spans using the dataset record tags.

Deprecation Notes

  • tracing
    • The type annotation for Span.parent_id will change from Optional[int] to int in v5.0.0.

New Features

  • azure-api-management
    • This introduces inferred proxy support for Azure API Management.
  • Stats computation
    • Enable stats computation by default for python 3.14 and above.
  • AI Guard
    • Adds SDS (Sensitive Data Scanner) findings to AI Guard spans, enabling visibility into sensitive data detected in LLM inputs and outputs.
  • LLM Observability
    • Experiments now report their execution status to the backend. Status transitions to running when execution starts, completed on success, failed when tasks or evaluators error with raise_errors=False, and interrupted when the experiment is stopped by an exception. #16713

    • Adds LLMObs.publish_evaluator() to sync a locally-defined LLMJudge evaluator to the Datadog UI as a custom LLM-as-Judge evaluation.

    • Adds support for DeepEval evaluations in LLM Observability Experiments by allowing users to pass a DeepEval evaluation (which either inherents from BaseMetric or BaseConversationalMetric) in an LLM Obs Experiment.

      Example:

      from deepeval.metrics import GEval
      from deepeval.test_case import LLMTestCaseParams
      
      from ddtrace.llmobs import LLMObs
      
      correctness_metric = GEval(
          name="Correctness",
          criteria="Determine whether the actual output is factually correct based on the expected output.",
          evaluation_steps=[
              "Check whether the facts in 'actual output' contradicts any facts in 'expected output'",
              "You should also heavily penalize omission of detail",
              "Vague language, or contradicting OPINIONS, are OK"
          ],
          evaluation_params=[LLMTestCaseParams.INPUT, LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.EXPECTED_OUTPUT],
          async_mode=True
      )
      
      dataset = LLMObs.create_dataset(
          dataset_name="<DATASET_NAME>",
          description="<DATASET_DESCRIPTION>",
          records=[RECORD_1, RECORD_2, RECORD_3, ...]
      )
      
      def my_task(input_data, config):
          return input_data["output"]
      
      def my_summary_evaluator(inputs, outputs, expected_outputs, evaluators_results):
          return evaluators_results["Correctness"].count(True)
      
      experiment = LLMObs.experiment(
          name="<EXPERIMENT_NAME>",
          task=my_task,
          dataset=dataset,
          evaluators=[correctness_metric],
          summary_evaluators=[my_summary_evaluator], # optional, used to summarize the experiment results
          description="<EXPERIMENT_DESCRIPTION>."
      )
      
      result = experiment.run()
      
    • adds experiment summary logging after run() with row count, run count, per-evaluator stats, and error counts.

    • adds max_retries and retry_delay parameters to experiment.run() for retrying failed tasks and evaluators. Example: experiment.run(max_retries=3, retry_delay=lambda attempt: 2 ** attempt).

    • This introduces LLMObs.get_prompt() to retrieve managed prompts from Datadog's Prompt Registry. The method returns a ManagedPrompt object with a format() method for variable substitution. Prompt updates propagate to running applications within the cache TTL (default: 60 seconds). Use with annotation_context or annotate to correlate prompts with LLM spans:

      prompt = LLMObs.get_prompt("greeting")
      variables = {"user": "Alice"}
      with LLMObs.annotation_context(prompt=prompt.to_annotation_dict(**variables)):
          openai.chat.completions.create(messages=prompt.format(**variables))
      
    • experiments propagate canonical_ids from dataset records to the corresponding experiments span when present. The canonical_ids are only guaranteed to be available after calling pull_dataset.

    • LLMObs.create_dataset supports a bulk_upload parameter to control data uploading behavior. Both LLMObs.create_dataset and LLMObs.create_dataset_from_csv supports users specifying the deduplicate parameter.

    • Subset of dataset records can now be pulled with tags by using the tags argument to LLMObs.pull_dataset, provided in a list of strings of key value pairs: LLMObs.pull_dataset(dataset_name="my-dataset", tags=["env:prod", "version:1.0"])

Bug Fixes

  • LLM Observability
    • Fix data duplication issue when uploading > 5MB datasets via LLMObs.create_dataset.
  • ai_guard
    • Fix TypeError while processing failed AI Guard responses, leading to overriding the original error.
  • openai_agents
    • Fixes an AttributeError on openai-agents >= 0.8.0 caused by the removal of AgentRunner._run_single_turn.
  • profiling
    • A bug which could prevent Profiling from being enabled when the library is installed through Single Step Instrumentation was fixed.
    • This fixes an issue where the profiler was patching the gevent module unnecessarily even when the profiler was not enabled.
    • A bug that would cause certain function names to be displayed as <module> in flame graphs has been fixed.
    • Fix lock contention in the profiler's greenlet stack sampler that could cause connection pool exhaustion in gevent-based applications (e.g. gunicorn + gevent + psycopg2). #16657
    • This fix resolves an issue where the lock profiler's wrapper class did not support PEP 604 type union syntax (e.g., asyncio.Condition | None). This was causing a TypeError at import time for libraries such as kopf that use union type annotations at class definition time.
  • data_streams
    • Add kafka_cluster_id tag to Kafka offset/backlog tracking for confluent-kafka. Previously, cluster ID was only included in DSM checkpoint edge tags (produce/consume) but missing from offset commit and produce offset backlogs. This ensures correct attribution of backlog data to specific Kafka clusters when multiple clusters share topic names.
  • AAP
    • Fixes a memory corruption issue where concurrent calls to the WAF on the same request context from multiple threads (e.g. an asyncio event loop and a thread pool executor inheriting the same context via contextvars) could cause use-after-free or double-free crashes (SIGSEGV) inside libddwaf. A per-context lock now serializes WAF calls on the same context.
  • tracing
    • Avoid pickling wrappers in ddtrace.internal.wrapping.context.BaseWrappingContext.
  • CI Visibility
    • Fixed an incompatibility with pytest-html and other third-party reporting plugins caused by the ddtrace pytest plugin using a non-standard dd_retry test outcome for retry attempts. The outcome is now set to rerun, which is the standard value used by pytest-rerunfailures and recognized by reporting plugins.
  • dynamic instrumentation
    • Fixes a RuntimeError: generator didn't yield in the Symbol DB remote config subscriber when the process has no writable temporary directory.
  • celery
    • Propagate distributed tracing headers for tasks that are not registered locally so traces link correctly across workers. #16662
  • Fix for a potential race condition affecting internal periodic worker threads that could have caused a RuntimeError during forks.
  • Add a timeout to Unix socket connections to prevent thread I/O hangs during pre-fork shutdown.

Other Changes

  • profiling
    • reduces code provenance CPU overhead when using fork-based frameworks like gunicorn and uWSGI.
  • LLM Observability
    • Exports LLMJudge, BooleanStructuredOutput, ScoreStructuredOutput, and CategoricalStructuredOutput to the public ddtrace.llmobs module level.
Mar 13, 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 an issue where the lock profiler's wrapper class did not support PEP 604 type union syntax (e.g., asyncio.Condition | None). This was causing a TypeError at import time for libraries such as kopf that use union type annotations at class definition time.

  • Fix for potential crashes at process shutdown due to incorrect detection of the VM finalization state when stopping periodic worker threads.

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

Bug Fixes

  • AAP: Fixes a memory corruption issue where concurrent calls to the WAF on the same request context from multiple threads (e.g. an asyncio event loop and a thread pool executor inheriting the same context via contextvars) could cause use-after-free or double-free crashes (SIGSEGV) inside libddwaf. A per-context lock now serializes WAF calls on the same context.
Mar 10, 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: This fix resolves an issue where cache_creation_input_tokens and cache_read_input_tokens were not captured when using the LiteLLM integration with providers that support prompt caching (e.g., Anthropic, OpenAI, Deepseek).
Mar 9, 2026

New Features

  • azure-api-management: This introduces inferred proxy support for Azure API Management.
<!-- -->
  • Stats computation: Enable stats computation by default for python 3.14 and above.
<!-- -->
  • LLM Observability: Adds LLMObs.publish_evaluator() to sync a locally-defined
    LLMJudge evaluator to the Datadog UI as a custom LLM-as-Judge evaluation.
<!-- -->
  • LLM Observability: Experiments now report their execution status to the backend. Status transitions to running when execution starts, completed on success, failed when tasks or evaluators error with raise_errors=False, and interrupted when the experiment is stopped by an exception. #16713

Bug Fixes

  • celery: Propagate distributed tracing headers for tasks that are not registered locally so traces link correctly across workers. #16662
<!-- -->
  • profiling: This fix resolves an issue where the lock profiler's wrapper class did not support PEP 604 type union syntax (e.g., asyncio.Condition | None). This was causing a TypeError at import time for libraries such as kopf that use union type annotations at class definition time.
<!-- -->
  • Fix for a potential race condition affecting internal periodic worker threads that could have caused a RuntimeError during forks.
<!-- -->
  • profiling: Fix lock contention in the profiler's greenlet stack sampler that could cause connection pool exhaustion in gevent-based applications (e.g. gunicorn + gevent + psycopg2). #16657
<!-- -->
  • Add a timeout to Unix socket connections to prevent thread I/O hangs during pre-fork shutdown.

Other Changes

  • LLM Observability: Exports LLMJudge, BooleanStructuredOutput, ScoreStructuredOutput, and CategoricalStructuredOutput to the public ddtrace.llmobs module level.

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

Bug Fixes

  • Add a timeout to Unix socket connections to prevent thread I/O hangs during pre-fork shutdown.
Mar 5, 2026

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

⚠️ Known issues

We have identified a bug where workloads relying on fork could encounter crashes post-fork due to a race condition. We are currently working on a fix.

Bug Fixes

  • AAP: Fixes a memory corruption issue where concurrent calls to the WAF on the same request context from multiple threads (e.g. an asyncio event loop and a thread pool executor inheriting the same context via contextvars) could cause use-after-free or double-free crashes (SIGSEGV) inside libddwaf. A per-context lock now serializes WAF calls on the same context.

  • CI Visibility: Fixed an incompatibility with pytest-html and other third-party reporting plugins caused by the ddtrace pytest plugin using a non-standard dd_retry test outcome for retry attempts. The outcome is now set to rerun, which is the standard value used by pytest-rerunfailures and recognized by reporting plugins.

New Features

  • AI Guard: Adds SDS (Sensitive Data Scanner) findings to AI Guard spans, enabling visibility into sensitive data detected in LLM inputs and outputs.
<!-- -->
  • LLM Observability: Adds support for DeepEval evaluations in LLM Observability Experiments by allowing users to pass a DeepEval evaluation (which either inherents from BaseMetric or BaseConversationalMetric) in an LLM Obs Experiment.

    Example:

    from deepeval.metrics import GEval
    from deepeval.test_case import LLMTestCaseParams
    
    from ddtrace.llmobs import LLMObs
    
    correctness_metric = GEval(
        name="Correctness",
        criteria="Determine whether the actual output is factually correct based on the expected output.",
        evaluation_steps=[
            "Check whether the facts in 'actual output' contradicts any facts in 'expected output'",
            "You should also heavily penalize omission of detail",
            "Vague language, or contradicting OPINIONS, are OK"
        ],
        evaluation_params=[LLMTestCaseParams.INPUT, LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.EXPECTED_OUTPUT],
        async_mode=True
    )
    
    dataset = LLMObs.create_dataset(
        dataset_name="<DATASET_NAME>",
        description="<DATASET_DESCRIPTION>",
        records=[RECORD_1, RECORD_2, RECORD_3, ...]
    )
    
    def my_task(input_data, config):
        return input_data["output"]
    
    def my_summary_evaluator(inputs, outputs, expected_outputs, evaluators_results):
        return evaluators_results["Correctness"].count(True)
    
    experiment = LLMObs.experiment(
        name="<EXPERIMENT_NAME>",
        task=my_task, 
        dataset=dataset,
        evaluators=[correctness_metric],
        summary_evaluators=[my_summary_evaluator], # optional, used to summarize the experiment results
        description="<EXPERIMENT_DESCRIPTION>."
    )
    
    result = experiment.run()
    
<!-- -->
  • LLM Observability: adds experiment summary logging after run() with row count, run count, per-evaluator stats, and error counts.
<!-- -->
  • LLM Observability: adds max_retries and retry_delay parameters to experiment.run() for retrying failed tasks and evaluators. Example: experiment.run(max_retries=3, retry_delay=lambda attempt: 2 ** attempt).

Bug Fixes

  • AAP: Fixes a memory corruption issue where concurrent calls to the WAF on the same request context from multiple threads (e.g. an asyncio event loop and a thread pool executor inheriting the same context via contextvars) could cause use-after-free or double-free crashes (SIGSEGV) inside libddwaf. A per-context lock now serializes WAF calls on the same context.
<!-- -->
  • tracing: Avoid pickling wrappers in ddtrace.internal.wrapping.context.BaseWrappingContext.
<!-- -->
  • CI Visibility: Fixed an incompatibility with pytest-html and other third-party reporting plugins caused by the ddtrace pytest plugin using a non-standard dd_retry test outcome for retry attempts. The outcome is now set to rerun, which is the standard value used by pytest-rerunfailures and recognized by reporting plugins.
<!-- -->
  • dynamic instrumentation: Fixes a RuntimeError: generator didn't yield in the Symbol DB remote config subscriber when the process has no writable temporary directory.
<!-- -->
  • profiling: A bug that would cause certain function names to be displayed as <module> in flame graphs has been fixed.
Feb 26, 2026

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

Upgrade Notes

  • LLM Observability
    • Experiments spans now contain config from the experiment initialization, allowing for searching of relevant spans using the experiment config.
    • Experiments spans now contain the tags from the dataset records, allowing for searching of relevant spans using the dataset record tags.

Deprecation Notes

  • tracing
    • The type annotation for Span.parent_id will change from Optional[int] to int in v5.0.0.

New Features

  • LLM Observability
    • This introduces LLMObs.get_prompt() to retrieve managed prompts from Datadog's Prompt Registry. The method returns a ManagedPrompt object with a format() method for variable substitution. Prompt updates propagate to running applications within the cache TTL (default: 60 seconds). Use with annotation_context or annotate to correlate prompts with LLM spans:

      prompt = LLMObs.get_prompt("greeting")
      variables = {"user": "Alice"}
      with LLMObs.annotation_context(prompt=prompt.to_annotation_dict(**variables)):
          openai.chat.completions.create(messages=prompt.format(**variables))
      
    • experiments propagate canonical_ids from dataset records to the corresponding experiments span when present. The canonical_ids are only guaranteed to be available after calling pull_dataset.

    • LLMObs.create_dataset supports a bulk_upload parameter to control data uploading behavior. Both LLMObs.create_dataset and LLMObs.create_dataset_from_csv supports users specifying the deduplicate parameter.

    • Subset of dataset records can now be pulled with tags by using the tags argument to LLMObs.pull_dataset, provided in a list of strings of key value pairs: LLMObs.pull_dataset(dataset_name="my-dataset", tags=["env:prod", "version:1.0"])

Bug Fixes

  • LLM Observability
    • Fix data duplication issue when uploading > 5MB datasets via LLMObs.create_dataset.
  • ai_guard
    • Fix TypeError while processing failed AI Guard responses, leading to overriding the original error.
  • openai_agents
    • Fixes an AttributeError on openai-agents >= 0.8.0 caused by the removal of AgentRunner._run_single_turn.
  • profiling
    • A bug which could prevent Profiling from being enabled when the library is installed through Single Step Instrumentation was fixed.
    • This fixes an issue where the profiler was patching the gevent module unnecessarily even when the profiler was not enabled.
  • data_streams
    • Add kafka_cluster_id tag to Kafka offset/backlog tracking for confluent-kafka. Previously, cluster ID was only included in DSM checkpoint edge tags (produce/consume) but missing from offset commit and produce offset backlogs. This ensures correct attribution of backlog data to specific Kafka clusters when multiple clusters share topic names.

Other Changes

  • profiling
    • reduces code provenance CPU overhead when using fork-based frameworks like gunicorn and uWSGI.
Feb 24, 2026

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

⚠️ Known issues

We have identified a bug where workloads relying on fork could encounter crashes post-fork due to a race condition. We are currently working on a fix.

Upgrade Notes

  • dynamic instrumentation
    • log probes now use the debugger intake track. This requires Datadog agent version 7.49.0 or above.
  • CI Visibility
    • Official release of the new version of the pytest plugin, with architectural improvements. This new version uses an independent span writer for Test Optimization (similar to the DD_CIVISIBILITY_USE_BETA_WRITER option), and also contains performance and memory usage improvements. A beta version of the plugin had been available since v4.2.0, and could be enabled via the DD_PYTEST_USE_NEW_PLUGIN environment variable. This new version is now the default, and the environment variable can be used to revert to the previous plugin if used with false or 0 values.

Deprecation Notes

  • tracing

    • DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is deprecated and will be removed in version 5.0.0. 128-bit trace ID generation will become mandatory.
  • The tracer parameter is deprecated in the following functions and class methods and will be removed in version 5.0.0:

    • aiohttp: trace_app
    • asgi: TraceMiddleware.__init__
    • bottle: TracePlugin.__init__
    • cherrypy: TraceMiddleware.__init__
    • falcon: TraceMiddleware.__init__
    • flask_cache: get_traced_cache
    • sqlalchemy: trace_engine
    • wsgi: WSGIMiddleware.__init__

    The ddtrace.trace.tracer singleton is always used.

New Features

  • profiling
    • It is now possible to profile applications using uvloop with asyncio.
  • pymongo
    • Adds support for tracing pymongo 4.12+ AsyncMongoClient operations. The integration now automatically instruments both synchronous and asynchronous clients when using pymongo >= 4.12.
  • Code Security (IAST)
    • This introduces support for Python 3.14 template strings (PEP-750). Template strings (t-strings) are now tracked for taint propagation, enabling detection of security vulnerabilities when user input is embedded in template strings.
  • claude_agent_sdk
    • Introduces tracing support for the Claude Agent SDK's query, ClaudeSDKClient.query, and ClaudeSDKClient.receive_messages methods. See the docs for more information.
  • opentelemetry: Adds support for the start_as_current_span decorator on asynchronous functions. Requires opentelemetry-api>=1.24.
  • LLM Observability
    • Adds LLM Observability tracing support for Claude Agent SDK requests.
    • Adds Azure OpenAI as a supported provider for the LLM Judge evaluator.
    • Adds Vertex AI as a supported provider for the LLM Judge evaluator.
    • Introduces the LLMObs.async_experiment() method for running experiments with async task functions and mixed sync/async evaluators.
    • Adds built-in evaluators for common evaluation tasks. The following evaluators are now available:
      • StringCheckEvaluator: Performs string comparison operations (equals, not equals, contains, case-insensitive contains).
      • RegexMatchEvaluator: Validates output against regex patterns with search, match, or fullmatch modes.
      • LengthEvaluator: Validates output length constraints by characters, words, or lines.
      • JSONEvaluator: Validates JSON syntax and optionally checks for required keys.
      • SemanticSimilarityEvaluator: Measures semantic similarity between output and expected output using embedding vectors.
    • Adds support for json metric type in evaluation metrics. Users can now submit dict values as evaluation metrics using LLMObs.submit_evaluation() with metric_type="json". Additionally, experiment evaluators that return dict values are automatically detected as json metric type.
    • Adds LLMJudge evaluator for automated evaluation of LLM outputs using another LLM as the judge. Supports OpenAI and Anthropic providers with boolean, score, categorical, and custom JSON schema output formats.
    • Adds AWS Bedrock as a supported provider for the LLM Judge evaluator.

Bug Fixes

  • lib injection
    • the injected site-packages directory is now added as the last entry in the PYTHONPATH environment variable (it previously was added before the last entry).
  • profiling
    • A race condition that could lead to out-of-bounds access in the Profiler was fixed.
    • A bug where the Stack Profiler could loop infinitely (and allocate large amounts of memory, leading to crashes) when sampling asyncio Tasks has been fixed.
    • Fixes crashes in the memory profiler caused by re-entering the Python interpreter from inside CPython's allocator hook.
    • This fix resolves an issue where stack profiler could hold frame references to greenlets, which could have already completed. This could delay garbage collecting local variables from the greenlet.
    • A bug where corrupted or circular stack chunk linked lists on Python 3.11+ could cause infinite recursion during stack unwinding was fixed.
    • This fix resolves an issue where the dropped frames indicator frame could be added multiple times when exporting the same sample repeatedly, resulting in duplicate "<N frame(s) omitted>" entries in profiling data and unbounded memory growth in the memory profiler.
  • internal
    • This fix resolves an issue where ddtrace ignored the uwsgi --skip-atexit flag and registered Python atexit handlers regardless. This caused profiler cleanup code to run during process shutdown even when --skip-atexit was set, leading to crashes and hangs in uwsgi workers.
  • tracing
    • This fix resolves an issue where traces may not be flushed during the handling of SIGTERM or SIGINT signals.
  • telemetry
    • This fix resolves an issue where telemetry events may not be flushed during the handling of SIGTERM or SIGINT signals.
    • handle closed logging streams in writer background threads
  • AAP
    • Add the noopener and noreferrer link tags in the Datadog link in the footer of the App and API Protection HTML blocking response template. This could previously trigger a "reverse tabnabbing" vulnerability finding from other security analysis tools.
  • DSM
    • This fix resolves an issue where malformed DSM payloads prevented data from being reported when DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED was enabled.
Feb 18, 2026

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

Upgrade Notes

  • dynamic instrumentation
    • log probes now use the debugger intake track. This requires Datadog agent version 7.49.0 or above.
  • CI Visibility
    • Official release of the new version of the pytest plugin, with architectural improvements. This new version uses an independent span writer for Test Optimization (similar to the DD_CIVISIBILITY_USE_BETA_WRITER option), and also contains performance and memory usage improvements. A beta version of the plugin had been available since v4.2.0, and could be enabled via the DD_PYTEST_USE_NEW_PLUGIN environment variable. This new version is now the default, and the environment variable can be used to revert to the previous plugin if used with false or 0 values.

Deprecation Notes

  • tracing

    • DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is deprecated and will be removed in version 5.0.0. 128-bit trace ID generation will become mandatory.
  • The tracer parameter is deprecated in the following functions and class methods and will be removed in version 5.0.0:

    • aiohttp: trace_app
    • asgi: TraceMiddleware.__init__
    • bottle: TracePlugin.__init__
    • cherrypy: TraceMiddleware.__init__
    • falcon: TraceMiddleware.__init__
    • flask_cache: get_traced_cache
    • sqlalchemy: trace_engine
    • wsgi: WSGIMiddleware.__init__

    The ddtrace.trace.tracer singleton is always used.

New Features

  • profiling
    • It is now possible to profile applications using uvloop with asyncio.
  • pymongo
    • Adds support for tracing pymongo 4.12+ AsyncMongoClient operations. The integration now automatically instruments both synchronous and asynchronous clients when using pymongo >= 4.12.
  • Code Security (IAST)
    • This introduces support for Python 3.14 template strings (PEP-750). Template strings (t-strings) are now tracked for taint propagation, enabling detection of security vulnerabilities when user input is embedded in template strings.
  • claude_agent_sdk
    • Introduces tracing support for the Claude Agent SDK's query, ClaudeSDKClient.query, and ClaudeSDKClient.receive_messages methods. See the docs for more information.
  • opentelemetry: Adds support for the start_as_current_span decorator on asynchronous functions. Requires opentelemetry-api>=1.24.
  • LLM Observability
    • Adds LLM Observability tracing support for Claude Agent SDK requests.
    • Adds Azure OpenAI as a supported provider for the LLM Judge evaluator.
    • Adds Vertex AI as a supported provider for the LLM Judge evaluator.
    • Introduces the LLMObs.async_experiment() method for running experiments with async task functions and mixed sync/async evaluators.
    • Adds built-in evaluators for common evaluation tasks. The following evaluators are now available:
      • StringCheckEvaluator: Performs string comparison operations (equals, not equals, contains, case-insensitive contains).
      • RegexMatchEvaluator: Validates output against regex patterns with search, match, or fullmatch modes.
      • LengthEvaluator: Validates output length constraints by characters, words, or lines.
      • JSONEvaluator: Validates JSON syntax and optionally checks for required keys.
      • SemanticSimilarityEvaluator: Measures semantic similarity between output and expected output using embedding vectors.
    • Adds support for json metric type in evaluation metrics. Users can now submit dict values as evaluation metrics using LLMObs.submit_evaluation() with metric_type="json". Additionally, experiment evaluators that return dict values are automatically detected as json metric type.
    • Adds LLMJudge evaluator for automated evaluation of LLM outputs using another LLM as the judge. Supports OpenAI and Anthropic providers with boolean, score, categorical, and custom JSON schema output formats.
    • Adds AWS Bedrock as a supported provider for the LLM Judge evaluator.

Bug Fixes

  • lib injection
    • the injected site-packages directory is now added as the last entry in the PYTHONPATH environment variable (it previously was added before the last entry).
  • profiling
    • A race condition that could lead to out-of-bounds access in the Profiler was fixed.
    • A bug where the Stack Profiler could loop infinitely (and allocate large amounts of memory, leading to crashes) when sampling asyncio Tasks has been fixed.
    • Fixes crashes in the memory profiler caused by re-entering the Python interpreter from inside CPython's allocator hook.
    • This fix resolves an issue where stack profiler could hold frame references to greenlets, which could have already completed. This could delay garbage collecting local variables from the greenlet.
    • A bug where corrupted or circular stack chunk linked lists on Python 3.11+ could cause infinite recursion during stack unwinding was fixed.
    • This fix resolves an issue where the dropped frames indicator frame could be added multiple times when exporting the same sample repeatedly, resulting in duplicate "<N frame(s) omitted>" entries in profiling data and unbounded memory growth in the memory profiler.
  • internal
    • This fix resolves an issue where ddtrace ignored the uwsgi --skip-atexit flag and registered Python atexit handlers regardless. This caused profiler cleanup code to run during process shutdown even when --skip-atexit was set, leading to crashes and hangs in uwsgi workers.
  • tracing
    • This fix resolves an issue where traces may not be flushed during the handling of SIGTERM or SIGINT signals.
  • telemetry
    • This fix resolves an issue where telemetry events may not be flushed during the handling of SIGTERM or SIGINT signals.
    • handle closed logging streams in writer background threads
  • AAP
    • Add the noopener and noreferrer link tags in the Datadog link in the footer of the App and API Protection HTML blocking response template. This could previously trigger a "reverse tabnabbing" vulnerability finding from other security analysis tools.
  • DSM
    • This fix resolves an issue where malformed DSM payloads prevented data from being reported when DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED was enabled.
Feb 17, 2026

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

Upgrade Notes

  • dynamic instrumentation
    • log probes now use the debugger intake track. This requires Datadog agent version 7.49.0 or above.

Deprecation Notes

  • tracing

    • DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is deprecated and will be removed in version 5.0.0. 128-bit trace ID generation will become mandatory.
  • The tracer parameter is deprecated in the following functions and class methods and will be removed in version 5.0.0:

    • aiohttp: trace_app
    • asgi: TraceMiddleware.__init__
    • bottle: TracePlugin.__init__
    • cherrypy: TraceMiddleware.__init__
    • falcon: TraceMiddleware.__init__
    • flask_cache: get_traced_cache
    • sqlalchemy: trace_engine
    • wsgi: WSGIMiddleware.__init__

    The ddtrace.trace.tracer singleton is always used.

New Features

  • profiling
    • It is now possible to profile applications using uvloop with asyncio.
  • pymongo
    • Adds support for tracing pymongo 4.12+ AsyncMongoClient operations. The integration now automatically instruments both synchronous and asynchronous clients when using pymongo >= 4.12.
  • Code Security (IAST)
    • This introduces support for Python 3.14 template strings (PEP-750). Template strings (t-strings) are now tracked for taint propagation, enabling detection of security vulnerabilities when user input is embedded in template strings.
  • LLM Observability
    • Adds built-in evaluators for common evaluation tasks. The following evaluators are now available:
      • StringCheckEvaluator: Performs string comparison operations (equals, not equals, contains, case-insensitive contains).
      • RegexMatchEvaluator: Validates output against regex patterns with search, match, or fullmatch modes.
      • LengthEvaluator: Validates output length constraints by characters, words, or lines.
      • JSONEvaluator: Validates JSON syntax and optionally checks for required keys.
      • SemanticSimilarityEvaluator: Measures semantic similarity between output and expected output using embedding vectors.
    • Adds support for json metric type in evaluation metrics. Users can now submit dict values as evaluation metrics using LLMObs.submit_evaluation() with metric_type="json". Additionally, experiment evaluators that return dict values are automatically detected as json metric type.
    • Adds LLMJudge evaluator for automated evaluation of LLM outputs using another LLM as the judge. Supports OpenAI and Anthropic providers with boolean, score, categorical, and custom JSON schema output formats.
    • Adds AWS Bedrock as a supported provider for the LLM Judge evaluator.

Bug Fixes

  • lib injection
    • the injected site-packages directory is now added as the last entry in the PYTHONPATH environment variable (it previously was added before the last entry).
  • profiling
    • A bug where the Stack Profiler could loop infinitely (and allocate large amounts of memory, leading to crashes) when sampling asyncio Tasks has been fixed.
    • Fixes crashes in the memory profiler caused by re-entering the Python interpreter from inside CPython's allocator hook.
    • This fix resolves an issue where stack profiler could hold frame references to greenlets, which could have already completed. This could delay garbage collecting local variables from the greenlet.
    • A bug where corrupted or circular stack chunk linked lists on Python 3.11+ could cause infinite recursion during stack unwinding was fixed.
    • This fix resolves an issue where the dropped frames indicator frame could be added multiple times when exporting the same sample repeatedly, resulting in duplicate "<N frame(s) omitted>" entries in profiling data and unbounded memory growth in the memory profiler.
  • internal
    • This fix resolves an issue where ddtrace ignored the uwsgi --skip-atexit flag and registered Python atexit handlers regardless. This caused profiler cleanup code to run during process shutdown even when --skip-atexit was set, leading to crashes and hangs in uwsgi workers.
  • tracing
    • This fix resolves an issue where traces may not be flushed during the handling of SIGTERM or SIGINT signals.
  • telemetry
    • This fix resolves an issue where telemetry events may not be flushed during the handling of SIGTERM or SIGINT signals.
    • handle closed logging streams in writer background threads
  • AAP
    • Add the noopener and noreferrer link tags in the Datadog link in the footer of the App and API Protection HTML blocking response template. This could previously trigger a "reverse tabnabbing" vulnerability finding from other security analysis tools.
  • DSM
    • This fix resolves an issue where malformed DSM payloads prevented data from being reported when DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED was enabled.
Feb 12, 2026

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

Upgrade Notes

  • dynamic instrumentation
    • log probes now use the debugger intake track. This requires Datadog agent version 7.49.0 or above.

Deprecation Notes

  • tracing

    • DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is deprecated and will be removed in version 5.0.0. 128-bit trace ID generation will become mandatory.
  • The tracer parameter is deprecated in the following functions and class methods and will be removed in version 5.0.0:

    • aiohttp: trace_app
    • asgi: TraceMiddleware.__init__
    • bottle: TracePlugin.__init__
    • cherrypy: TraceMiddleware.__init__
    • falcon: TraceMiddleware.__init__
    • flask_cache: get_traced_cache
    • sqlalchemy: trace_engine
    • wsgi: WSGIMiddleware.__init__

    The ddtrace.trace.tracer singleton is always used.

New Features

  • profiling
    • It is now possible to profile applications using uvloop with asyncio.
  • pymongo
    • Adds support for tracing pymongo 4.12+ AsyncMongoClient operations. The integration now automatically instruments both synchronous and asynchronous clients when using pymongo >= 4.12.
  • Code Security (IAST)
    • This introduces support for Python 3.14 template strings (PEP-750). Template strings (t-strings) are now tracked for taint propagation, enabling detection of security vulnerabilities when user input is embedded in template strings.
  • LLM Observability
    • Adds built-in evaluators for common evaluation tasks. The following evaluators are now available:
      • StringCheckEvaluator: Performs string comparison operations (equals, not equals, contains, case-insensitive contains).
      • RegexMatchEvaluator: Validates output against regex patterns with search, match, or fullmatch modes.
      • LengthEvaluator: Validates output length constraints by characters, words, or lines.
      • JSONEvaluator: Validates JSON syntax and optionally checks for required keys.
      • SemanticSimilarityEvaluator: Measures semantic similarity between output and expected output using embedding vectors.
    • Adds support for json metric type in evaluation metrics. Users can now submit dict values as evaluation metrics using LLMObs.submit_evaluation() with metric_type="json". Additionally, experiment evaluators that return dict values are automatically detected as json metric type.
    • Adds LLMJudge evaluator for automated evaluation of LLM outputs using another LLM as the judge. Supports OpenAI and Anthropic providers with boolean, score, categorical, and custom JSON schema output formats.
    • Adds AWS Bedrock as a supported provider for the LLM Judge evaluator.

Bug Fixes

  • lib injection
    • the injected site-packages directory is now added as the last entry in the PYTHONPATH environment variable (it previously was added before the last entry).
  • profiling
    • Fixes crashes in the memory profiler caused by re-entering the Python interpreter from inside CPython's allocator hook.
    • This fix resolves an issue where stack profiler could hold frame references to greenlets, which could have already completed. This could delay garbage collecting local variables from the greenlet.
    • A bug where corrupted or circular stack chunk linked lists on Python 3.11+ could cause infinite recursion during stack unwinding was fixed.
    • This fix resolves an issue where the dropped frames indicator frame could be added multiple times when exporting the same sample repeatedly, resulting in duplicate "<N frame(s) omitted>" entries in profiling data and unbounded memory growth in the memory profiler.
  • internal
    • This fix resolves an issue where ddtrace ignored the uwsgi --skip-atexit flag and registered Python atexit handlers regardless. This caused profiler cleanup code to run during process shutdown even when --skip-atexit was set, leading to crashes and hangs in uwsgi workers.
  • tracing
    • This fix resolves an issue where traces may not be flushed during the handling of SIGTERM or SIGINT signals.
  • telemetry
    • This fix resolves an issue where telemetry events may not be flushed during the handling of SIGTERM or SIGINT signals.
    • handle closed logging streams in writer background threads
  • AAP
    • Add the noopener and noreferrer link tags in the Datadog link in the footer of the App and API Protection HTML blocking response template. This could previously trigger a "reverse tabnabbing" vulnerability finding from other security analysis tools.
  • DSM
    • This fix resolves an issue where malformed DSM payloads prevented data from being reported when DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED was enabled.
Feb 11, 2026

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

Upgrade Notes

  • dynamic instrumentation
    • log probes now use the debugger intake track. This requires Datadog agent version 7.49.0 or above.

Deprecation Notes

  • tracing

    • DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is deprecated and will be removed in version 5.0.0. 128-bit trace ID generation will become mandatory.
  • The tracer parameter is deprecated in the following functions and class methods and will be removed in version 5.0.0:

    • aiohttp: trace_app
    • asgi: TraceMiddleware.__init__
    • bottle: TracePlugin.__init__
    • cherrypy: TraceMiddleware.__init__
    • falcon: TraceMiddleware.__init__
    • flask_cache: get_traced_cache
    • sqlalchemy: trace_engine
    • wsgi: WSGIMiddleware.__init__

    The ddtrace.trace.tracer singleton is always used.

New Features

  • pymongo
    • Adds support for tracing pymongo 4.12+ AsyncMongoClient operations. The integration now automatically instruments both synchronous and asynchronous clients when using pymongo >= 4.12.
  • Code Security (IAST)
    • This introduces support for Python 3.14 template strings (PEP-750). Template strings (t-strings) are now tracked for taint propagation, enabling detection of security vulnerabilities when user input is embedded in template strings.
  • LLM Observability
    • Adds built-in evaluators for common evaluation tasks. The following evaluators are now available:
      • StringCheckEvaluator: Performs string comparison operations (equals, not equals, contains, case-insensitive contains).
      • RegexMatchEvaluator: Validates output against regex patterns with search, match, or fullmatch modes.
      • LengthEvaluator: Validates output length constraints by characters, words, or lines.
      • JSONEvaluator: Validates JSON syntax and optionally checks for required keys.
      • SemanticSimilarityEvaluator: Measures semantic similarity between output and expected output using embedding vectors.
    • Adds support for json metric type in evaluation metrics. Users can now submit dict values as evaluation metrics using LLMObs.submit_evaluation() with metric_type="json". Additionally, experiment evaluators that return dict values are automatically detected as json metric type.
    • Adds LLMJudge evaluator for automated evaluation of LLM outputs using another LLM as the judge. Supports OpenAI and Anthropic providers with boolean, score, categorical, and custom JSON schema output formats.

Bug Fixes

  • lib injection
    • the injected site-packages directory is now added as the last entry in the PYTHONPATH environment variable (it previously was added before the last entry).
  • profiling
    • Fixes crashes in the memory profiler caused by re-entering the Python interpreter from inside CPython's allocator hook.
    • This fix resolves an issue where stack profiler could hold frame references to greenlets, which could have already completed. This could delay garbage collecting local variables from the greenlet.
    • A bug where corrupted or circular stack chunk linked lists on Python 3.11+ could cause infinite recursion during stack unwinding was fixed.
    • This fix resolves an issue where the dropped frames indicator frame could be added multiple times when exporting the same sample repeatedly, resulting in duplicate "<N frame(s) omitted>" entries in profiling data and unbounded memory growth in the memory profiler.
  • internal
    • This fix resolves an issue where ddtrace ignored the uwsgi --skip-atexit flag and registered Python atexit handlers regardless. This caused profiler cleanup code to run during process shutdown even when --skip-atexit was set, leading to crashes and hangs in uwsgi workers.
  • tracing
    • This fix resolves an issue where traces may not be flushed during the handling of SIGTERM or SIGINT signals.
  • Telemetry
    • handle closed logging streams in writer background threads
Feb 5, 2026

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

⚠️ Known issues

We have identified a bug where profiles emitted by ddtrace v4.4.* do not contain tags injected by the Datadog Trace Agent (like pod_name, kube_namespace, etc.)
This issue is fixed in ddtrace v4.5.0.

We’re currently investigating an issue impacting services using ddtrace versions v4.1.* -> v4.4.* with profiling turned on. Our engineering teams are actively working on a permanent fix. In the meantime, disabling the memory profiler in the ddtrace configuration has been identified as a temporary workaround, DD_PROFILING_MEMORY_ENABLED=false.

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.
Latest
v4.7.1
Tracking Since
Sep 4, 2025
Last fetched Apr 19, 2026