Estimated end-of-life date, accurate to within three months: 10-2027
See the support level definitions for more information.
Upgrade Notes
- AI Guard:
ddtrace.appsec.ai_guard.AIGuardAbortErrornow derives fromddtrace.internal._exceptions.DDBlockException(aBaseExceptionsubclass) instead ofException. This brings AI Guard block decisions in line with how ASM blocks are surfaced and prevents a genericexcept Exception:in user code from silently swallowing a block.
- settings: Legacy environment variable names registered as aliases in the configuration registry now also work when set via local or fleet stable config files, not just shell environment variables. #17958
Deprecation Notes
- Tracing:
DD_TRACE_INFERRED_SPANS_ENABLEDis deprecated and will be removed in 5.0.0. UseDD_TRACE_INFERRED_PROXY_SERVICES_ENABLEDinstead. The old environment variable continues to work but emits aDDTraceDeprecationWarningwhen set.
New Features
- aws_durable_execution_sdk_python: Add tracing support for the
aws-durable-execution-sdk-pythonlibrary. Instruments@durable_executionworkflows andDurableContextoperations (step,invoke,wait,wait_for_condition,wait_for_callback,create_callback,map,parallel,run_in_child_context) to generate spans.
- LLM Observability: Adds
stepspans to the Claude Agent SDK integration. Each inference cycle is now represented by astepcontainer span with anllmchild span for the model call andtoolchild spans for any tool invocations.
- tracing: Adds a centralized
supported-configurations.jsonregistry of all supportedDD_*andOTEL_*environment variables, following the same schema used by other Datadog tracing libraries. Accesses to unregistered environment variables now produce a debug log to help identify typos or unsupported configuration options.
- AI Guard: Copies anomaly-detection attributes from the local root (service-entry) span onto every
ai_guardspan:ai_guard.http.useragent,ai_guard.http.client_ip,ai_guard.network.client.ip,ai_guard.usr.idandai_guard.usr.session_id.
- ai_guard: add AI Guard evaluation support to the OpenAI SDK chat completions instrumentation. Both non-streaming and streaming requests and non-streaming responses are evaluated through the configured AI Guard client, and evaluation is automatically skipped when a framework integration (LangChain, Strands Agents) is already evaluating the same call.
- code origin for spans: The code origin for spans feature has been enabled by default.
- code origin: attach code origin information to the first span generated by a function wrapped with tracer.wrap.
- openfeature: This introduces a configurable initialization timeout for
DataDogProvider. The timeout controls how longinitialize()waits for configuration before returning, and defaults to 30 seconds. Set it via theDD_EXPERIMENTAL_FLAGGING_PROVIDER_INITIALIZATION_TIMEOUT_MSenvironment variable or theinit_timeoutconstructor parameter.
- CI Visibility: This introduces Jenkins custom parent ID propagation, which enables Datadog to correlate tests run from Jenkins with their Jenkins jobs and pipelines.
- LLM Observability: Adds an optional
cost_tagsargument toLLMObs.annotate()andLLMObs.annotation_context(). Pass a list of tag keys (already set viatagsor annotated previously on the same span) to have them attached to the cost and token metrics generated from LLM and embedding spans, which can help breaking down spend by team, project, org, or any custom dimension.
- LLM Observability: Adds support for an optional
version(string) field on each tool definition dictionary passed toLLMObs.annotate()via thetool_definitionsparameter.
- profiling: Add
DD_PROFILING_LOCK_EXCLUDE_MODULESconfig to skip lock profiling for framework-internal locks. Excluded locks remain native with zero profiling overhead. Set it to a comma-separated list of module prefixes (e.g.,django.db,sqlalchemy.pool,urllib3).
- LLM Observability: Bedrock Agent orchestration step events (model invocations, tool/action group calls, knowledge base lookups, guardrails, rationales) are now emitted as APM child spans of the
Bedrock Agent <agent_id>span when LLM Observability is enabled, with the same LLMObs payload shape as before.
Bug Fixes
- ai_guard: This fix resolves a conflict between
ddtrace.autoandstrandswhen imported in the same file, which left Strands hooks silently disabled. The Strands integration now loads lazily on first attribute access so its event class identities match those the agent dispatches.
- appsec: Adds telemetry metrics
instrum.user_auth.missing_user_loginandinstrum.user_auth.missing_user_idwhen Django auth events cannot resolve the expected identity fields, enabling detection of misconfigured user model field mappings.
- AAP: This fix resolves an issue where the
usr.session_idtag was missing from the entry span of authenticated follow-up Django requests when automatic user instrumentation was enabled. They now also carryusr.session_id, matching other authenticated user-tagging paths.
- azure_cosmos: This change removes the http.status_code tags from Azure CosmosDB spans and replaces them with the use of the db.response.status_code metric. For customers using ddtrace v4.8.0 and relying on the http.status_code tag of cosmosdb.query spans, this is a breaking change.
- CI Visibility: Fixes an issue in the pytest plugin where a malformed log call emitted a
--- Logging error ---traceback to stderr during Attempt to Fix retries, polluting pytest output and contributing to spurious test failures.
- CI Visibility: Fixes an
IndexErrorin retry bookkeeping that occurred when a test's teardown phase failed. The error produced--- Logging error ---tracebacks in stderr, which could pollute test output and cause spurious test failures during retries. #17863
- CI Visibility: Fixes a regression where setting
DD_TEST_MANAGEMENT_ENABLED=0was not honored by the new pytest plugin, causing Test Management features such as quarantining, disabling tests, and Attempt to Fix to remain enabled.
- datastreams: Demotes the
retry limit exceeded submitting pathway statslog fromERRORtoWARNINGand removes the multi-line traceback from the record. This message fires when the processor cannot reach the agent within its 1-second timeout; the dropped 10 seconds of DSM data is auto-recovered on the next flush.
- LLM Observability: Fixes a concurrency bug in the Bedrock Agent integration where concurrent
invoke_agentcalls could orphan or cross-attribute spans due to shared class-level state. Per-invocation state is now used.
- LLM Observability: This fix resolves an issue where text wrapped in Bedrock Converse
guardContentcontent blocks was rendered as[Unsupported content type: guardContent]in traces, dropping the user's input.
- CI Visibility: Fixes an issue where tests marked as attempt-to-fix could have failures hidden when they were also quarantined or disabled.
- django: Stop tagging async view and middleware spans as errored on routine ASGI cancellations (e.g. client disconnects on streaming responses), a regression introduced in 4.8.0rc4. Cancellation still propagates; the span just finishes without
error.type='asyncio.exceptions.CancelledError'.
- django: Fixes
DD_DJANGO_DATABASE_SERVICEandDD_DJANGO_DATABASE_SERVICE_NAME, which were previously generated asDD_DJANGO-DATABASE_SERVICEandDD_DJANGO-DATABASE_SERVICE_NAME. The hyphenated names were invalid POSIX identifiers and unusable from most shells. Hyphens in integration names are now normalized to underscores when building env var names. The old hyphenated names are preserved as aliases for backward compatibility. #17952
- telemetry: tolerate malformed installed distribution metadata so a single bad dist-info entry no longer floods stderr with repeated tracebacks.
- profiling: Fixes an issue where the lock profiler silently stopped capturing lock events when running under
ddtrace-runwith gevent installed.
- LLM Observability: The OpenAI integration now preserves assistant message content when
tool_callsare present on the same message. #17760
- openfeature: This fix resolves an issue where
DataDogProvider.initialize()returned before configuration was received, causing the OpenFeature SDK to mark the provider as ready to serve evaluations too early and flag evaluations to silently return default values. The provider now waits for configuration before returning.
- openfeature: Fixes targeting key handling in the OpenFeature provider.
Nonetargeting key is now correctly passed to the native evaluator instead of being coerced to empty string. Flags that don't require a targeting key (static, rule-based) now evaluate successfully without one, matching the Datadog provider spec. Additionally, the Rust binding now correctly mapsTargetingKeyMissingerrors from libdatadog instead of returning a generic error code.
- tracing: Fixes an issue where the
svc.autoprocess tag produced garbled values such aspython_-m_unittestwhen a process was launched with the full command as a singlesys.argv[0]string (e.g. from a DockerENTRYPOINT, a process manager, or a subprocess call with an unsplit command). The correct module or script name is now extracted in these cases. #17764
- tracing: This fix resolves a memory leak where reference cycles through a span's properties were invisible to Python's cyclic garbage collector and accumulated proportionally to traced call volume.
- starlette: This fix resolves an issue where passing
middleware=Nonecaused application startup to fail when Starlette tracing was enabled.
- tracing: A crash that occurred when exiting a gevent application with
DD_TRACE_DEBUG=1has been fixed.
- langchain: Strips interface identifiers (e.g.
chat,llm) and path prefixes (e.g.models/) when extracting themodel_providerandmodel_name, so reported values identify the actual provider and model name rather than the LangChain interface or API resource path.
- llmobs: fixes child spans created within an experiment task not inheriting the
dataset_idtag. Previously onlydataset_namewas propagated via baggage to child spans;dataset_idis now propagated as well, making dataset, project, and experiment context (name and ID) consistent across all spans in an experiment trace.
- Profiling: This fixes a bug where uploaded profiles would not have a linked span post fork
- propagation: Limits parsing of the W3C
tracestateheader duringtracecontextextraction to 32 list-members and 512 UTF-8 bytes, consistent with the W3C Trace Context specification (https://www.w3.org/TR/trace-context/). Extra list-members and trailing whole entries that would exceed the byte budget are ignored, so unusually large headers no longer expand unbounded work during extraction. The Datadogdd=list-member is preferred: it is kept when present (including when it appears late in the header or alone exceeds the byte cap), and other vendors are dropped first. List-members longer thanDD_TRACE_TRACESTATE_ITEM_MAX_CHARS(128) characters are removed first when trimming by list-member count or byte budget, so shorter vendor entries are kept when possible.
- Fixed a startup deadlock when using
snowflake-connector-python >= 4.4.0withDD_TRACE_SNOWFLAKE_ENABLED=true.
- tracing: This change fixes an issue in which svc_src is set to m in cases where service matches the _default_service of an active integration config. In such cases, the intended behavior is that it svc_src is equal to service. #17712
- tracing: Parsing incoming
baggageHTTP headers now respectsDD_TRACE_BAGGAGE_MAX_ITEMS[default 64] andDD_TRACE_BAGGAGE_MAX_BYTES[default 8192], consistent with baggage injection. Previously, extraction could retain every comma-separated entry regardless of those limits. The tracer drops excess pairs and records truncation telemetry when limits apply.
Other Changes
- profiling: The
ECHION_ALT_VM_READ_FORCEconfiguration flag has been removed and support for the associated feature has been dropped.