Bug Fixes

  • lib-injection: Use package versions published to PyPI to install the

    library. Formerly the published image was installing the package from source using the tagged commit SHA which resulted in slow and potentially failing installs.


Bug Fixes

  • profiling: This fix resolves an issue in Python 3.11 where a PyFrameObject strong reference count was not properly decremented in the stack collector.


Bug Fixes

  • Fix for ValueError when @ is not present in network location but other part of the url.


Bug Fixes

  • This fix removes unintended url parts in the http.url tag.



Initial library support has been added for Python 3.11.


Continuous Profiler and Dynamic Instrumentation are not yet compatible and must be disabled in order to use the library with Python 3.11. Support for them will be added in a future release. To track the status, see the Support Python 3.11 issue on GitHub.

Upgrade Notes

  • The default propagation style configuration changes to DD_TRACE_PROPAGATION_STYLE=tracecontext,datadog. To only support Datadog propagation and retain the existing default behavior, set DD_TRACE_PROPAGATION_STYLE=datadog.

  • Python 3.11: Continuous Profiler and Dynamic Instrumentation must be disabled as they do not current support Python 3.11.

  • The configured styles in DD_TRACE_PROPAGATION_STYLE_EXTRACT are now evaluated in order to specification. To keep the previous fixed evaluation order, set: DD_TRACE_PROPAGATION_STYLE_EXTRACT=datadog,b3,b3 single header.

  • tracing: upgrades the default trace API version to v0.5 for non-Windows systems. The v0.5 trace API version generates smaller payloads, thus increasing the throughput to the Datadog agent especially with larger traces.

Deprecation Notes

  • propagation: Configuration of propagation style with DD_TRACE_PROPAGATION_STYLE=b3 is deprecated and will be removed in version 2.0.0. Please use the newly added DD_TRACE_PROPAGATION_STYLE=b3multi instead.

  • aws: The boto, botocore and aiobotocore integrations no longer include all API parameters by default. To retain the deprecated behavior, set the environment variable DD_AWS_TAG_ALL_PARAMS=1. The deprecated behavior and environment variable will be removed in v2.0.0.

New Features

  • django: add configuration option to allow a resource format like {method} {handler}.{url_name} in projects with Django <2.2.0

  • django: Adds the DD_DJANGO_INCLUDE_USER_NAME option to toggle whether the integration sets the django.user.name tag.

  • Added environment variable DD_TRACE_PROPAGATION_STYLE to configure both injection and extraction propagation styles. The configured styles can be overridden with environment variables DD_TRACE_PROPAGATION_STYLE_INJECT and DD_TRACE_PROPAGATION_STYLE_EXTRACT.

  • tracing: This introduces none as a supported propagator for trace context extraction and injection. When none is the only propagator listed, the corresponding trace context operation is disabled. If there are other propagators in the inject or extract list, the none propagator has no effect. For example DD_TRACE_PROPAGATION_STYLE=none

  • ASM: One click activation enabled by default using Remote Configuration Management (RCM). Set DD_REMOTE_CONFIGURATION_ENABLED=false to disable this feature.

  • ASM: now http.client_ip and network.client.ip will only be collected if ASM is enabled.

  • celery: Enhances context tags containing dictionaries so that their contents are sent as individual tags (issue #4771).

  • tracing: Adds support for W3C Trace Context propagation style for distributed tracing. The traceparent and tracestate HTTP headers are enabled by default for all incoming and outgoing HTTP request headers. The Datadog propagation style continue to be enabled by default.

  • flask: Adds support for streamed responses. Note that two additional spans: flask.application and flask.response will be generated.

  • profiling: Adds support for Python 3.11.

  • tracer: added support for Python 3.11.

Known Issues

  • profiling: There is currently a known performance regression issue with the profiler’s code provenance feature. Note that this feature is disabled by default and will only be enabled if DD_PROFILING_ENABLE_CODE_PROVENANCE is set to true.

Bug Fixes

  • ASGI: response headers are correctly processed instead of ignored

  • Fix issue with attrs and contextlib2 version constraints for Python 2.7.

  • CGroup file parsing was fixed to correctly parse container UUID for PCF containers.

  • ASM: Do not raise exceptions when failing to parse XML request body.

  • ASM: fix a body read problem on some corner case where don’t passing the content length makes wsgi.input.read() blocks.

  • aws: We are reducing the number of API parameters that the boto, botocore and aiobotocore integrations collect as span tags by default. This change limits span tags to a narrow set of parameters for specific AWS APIs using standard tag names. To opt out of the new default behavior and collect no API parameters, set the environment variable DD_AWS_TAG_NO_PARAMS=1. To retain the deprecated behavior and collect all API parameters, set the environment variable DD_AWS_TAG_ALL_PARAMS=1.

  • tracing: make ddtrace.context.Context serializable which fixes distributed tracing across processes.

  • django: avoid SynchronousOnlyOperation when failing to retrieve user information.

  • dynamic instrumentation: Remove unnecessary log line from application start up

  • Remove forbiddenfruit as dependency and rollback wrapt changes where forbiddenfruit was called. IAST: Patch builtins only when IAST is enabled.

  • httpx: Fixes an incompatibility from httpx==0.23.1 when the URL.raw property is not available.

  • botocore: Before this change, the botocore integration stripped newlines from the JSON string encoded in the data blob of Amazon Kinesis records. This change includes a terminating newline if it is present in the decoded data.

  • Fix error in patching functions. forbiddenfruit package has conflicts with some libraries such as asynctest. This conflict raises AttributeError exception. See issue #4484.

  • tracer: This fix resolves an issue where the rate limiter used for span and trace sampling rules did not reset the time since last call properly if the rate limiter already had max tokens. This fix resets the time since last call always, which leads to more accurate rate limiting.

  • Ensure that worker threads that run on start-up are recreated at the right time after fork on Python < 3.7.

  • telemetry: This fix resolves an issue when we try to fetch platform.libc_ver() on an unsupported system.

  • tracing: This fix resolves an issue where the DD_SERVICE_MAPPING mapped service names were not used when updating span metadata with the DD_VERSION set version string.

  • wsgi: This fix resolves an issue where BaseException raised in a WSGI application caused spans to not be submitted.

  • library injection: Pin the library version in the library injection image. Prior, the latest version of ddtrace would always be installed, regardless of the image version.

  • Fix error in the agent response payload when the user disabled ASM in a dashboard using 1-click Remote Configuration.

  • flask: add support for flask v2.3. Remove deprecated usages of flask._app_ctx_stack and flask._request_ctx_stack.

  • The specification of DD_TRACE_PROPAGATION_STYLE_EXTRACT now respects the configured styles evaluation order. The evaluation order had previously been fixed and so the configured order was ignored.

  • tracing: Ensures that encoding errors due to wrong span tag types will be logged. Previously, if non-text span tags were set, this resulted in v0.5 encoding errors to be output to stderr instead of to a logger.

Other Changes

  • Kubernetes library injection: run commands as non-root user.

  • tracing: The value of ddtrace.constants.PID has been changed from system.pid to process_id. All spans will now use the metric tag of process_id instead.

  • tracing: The exception logged for writing errors no longer includes a long, unhelpful stack trace. The message now also includes the number of traces dropped and the number of retries attempted.



Application Security Management (ASM) has added support for preventing attacks by blocking malicious IPs using one click within Datadog.


One click activation for ASM is currently in beta.

Dynamic instrumentation allows instrumenting a running service dynamically to extract runtime information that could be useful for, e.g., debugging purposes, or to add extra metrics without having to make code changes and re-deploy the service. See https://ddtrace.readthedocs.io/en/stable/configuration.html for more details.

Upgrade Notes

  • Use Span.set_tag_str() instead of Span.set_tag() when the tag value is a text type as a performance optimizations in manual instrumentation.

New Features

  • ASM: add support for one click activation using Remote Configuration Management (RCM). Set DD_REMOTE_CONFIGURATION_ENABLED=true to enable this feature.

  • ASM: ip address collection will be enabled if not explicitly disabled and appsec is enabled.

  • tracing: HTTP query string tagged by default in http.url tag (sensitive query strings will be obfuscated).

  • Django: set usr.id tag by default if request.user is authenticated.

  • Add Span.set_tag_str() as an alternative to the overloaded functionality of Span.set_tag() when the value can be coerced to unicode text.

  • Enable telemetry collection when tracing is enabled.

Bug Fixes

  • ASM: only report actor.ip on attack.

  • aioredis: added exception handling for CancelledError in the aioredis integration.

  • CI Visibility: fixed AppVeyor integration not extracting the full commit message.

  • Add iterable methods on TracedCursor. Previously these were not present and would cause iterable usage of cursors in DB API integrations to fail.

  • Fix parsing of the DD_TAGS environment variable value to include support for values with colons (e.g. URLs). Also fixed the parsing of invalid tags that begin with a space (e.g. DD_TAGS=" key:val" will now produce a tag with label key, instead of `` key``, and value val).

  • opentracing: don’t raise an exception when distributed tracing headers are not present when attempting to extract.

  • sqlite3: fix error when using connection.backup method.

  • Change dependency from backport_ipaddress` to ``ipaddress. Only install ipaddress for Python < 3.7.

  • gevent: disable gevent after fork hook which could result in a performance regression.

  • profiling: restart automatically on all Python versions.

  • profiling: fixes an issue with Gunicorn child processes not storing profiling events.

  • wsgi: when using more than one nested wsgi traced middleware in the same app ensure wsgi spans have the correct parenting.

Other Changes

  • tracing: add http.route tag to root span for Flask framework.


New Features

  • Add support for aiobotocore 1.x and 2.x.

  • ASM: add user information to traces.

  • ASM: collect http client_ip.

  • ASM: configure the sensitive data obfuscator.

  • ASM: Detect attacks on Pylons body.

  • ASM: propagate user id.

  • ASM: Support In-App WAF metrics report.

  • Collect user agent in normalized span tag http.useragent.

  • ASM: Detect attacks on XML body (for Django, Pylons and Flask).

  • Adds support for Lambda profiling, which can be enabled by starting the profiler outside of the handler (on cold start).

  • profiler: collect and export the class name for the wall time, CPU time and lock profiles, when available.

  • add DD_PYMONGO_SERVICE configuration

  • ASM: Redact sensitive query strings if sent in http.url.

  • redis: track the connection client_name.

  • rediscluster: add service name configuration with DD_REDISCLUSTER_SERVICE

  • snowflake: add snowflake query id tag to sql.query span

Bug Fixes

  • aiohttp_jinja2: use app_key to look up templates.

  • ASM: (flask) avoid json decode error while parsing request body.

  • ASM: fix Python 2 error reading WAF rules.

  • ASM: reset wsgi input after reading.

  • tracing: fix handling of unicode _dd.origin tag for Python 2

  • tracing: fix nested web frameworks re-extracting and activating HTTP context propagation headers.

  • requests: fix split-by-domain service name when multiple @ signs are present in the url

  • profiling: internal use of RLock needs to ensure original threading locks are used rather than gevent threading lock. Because of an indirection in the initialization of the original RLock, we end up getting an underlying gevent lock. We work around this behavior with gevent by creating a patched RLock for use internally.

  • profiler: Remove lock for data structure linking threads to spans to avoid deadlocks with the trade-off of correctness of spans linked to threads by stack profiler at a given point in time.

  • profiling: fix a possible deadlock due to spans being activated unexpectedly.


New Features

  • ASM: Detect attacks on Django body.

  • ASM: Detect attacks on Flask request cookies

  • ASM: Detect attacks on Django request cookies

  • ASM: Detect attacks on Pylons HTTP query.

  • ASM: Detect attacks on Pylons request cookies

  • ASM: detect attacks on Pylons path parameters.

  • ASM: Report HTTP method on Pylons framework

  • ASM: Collect raw uri for Pylons framework.

  • AppSec: collect response headers

  • ASM: Detect attacks on Flask body.

  • ASM: Detect attacks on path parameters

  • The profiler now supports Windows.

  • The profiler now supports code provenance reporting. This can be enabled by using the enable_code_provenance=True argument to the profiler or by setting the environment variable DD_PROFILING_ENABLE_CODE_PROVENANCE to true.

Bug Fixes

  • flask: add support for flask>=2.2.0

  • Fixed the environment variable used for log file size bytes to be DD_TRACE_LOG_FILE_SIZE_BYTES as documented.

  • jinja2: fix handling of template names which are not strings.

  • Fixed support for pytest-bdd 6.

  • Fixes cases where a pytest test parameter object string representation includes the id() of the object, causing the test fingerprint to constantly change across executions.

  • wsgi: ignore GeneratorExit Exception in wsgi.response spans

  • wsgi: ensures resource and http tags are always set on wsgi.request spans.

Other Changes

  • profiler: don’t initialize the AsyncioLockCollector unless asyncio is

    available. This prevents noisy logs messages from being emitted in Python 2.

  • docs: Added troubleshooting section for missing error details in the root span of a trace.


New Features

  • internal: Add support for Datadog trace tag propagation

  • django: added DD_DJANGO_INSTRUMENT_TEMPLATES=false to allow tracing of Django template rendering.

  • internal: Add sampling mechanism trace tag

  • Add environment variables to write ddtrace logs to a file with DD_TRACE_LOG_FILE, DD_TRACE_LOG_FILE_LEVEL, and DD_TRACE_FILE_SIZE_BYTES

  • Adds pytest-bdd integration to show more details in CI Visibility product.

Bug Fixes

  • starlette: Add back removed aggregate_resources feature.

  • fastapi: Add back removed aggregate_resources feature.

  • aiomysql: fix AttributeError: __aenter__ when using cursors as context managers.

  • asgi, starlette, fastapi: Exclude background tasks duration from web request spans.

  • asgi: set the http.url tag using the hostname in the request header before defaulting to the hostname of the asgi server.

  • mypy: Avoid parsing redis asyncio files when type checking Python 2

  • starlette: Add back removed ddtrace.contrib.starlette.get_resource and ddtrace.contrib.starlette.span_modifier.

  • fastapi: Add back removed ddtrace.contrib.fastapi.span_modifier.

  • internal: fix exception raised for invalid values of DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH.

  • flask_caching: fix redis tagging after the v2.0 release.

  • redis: create default Pin on asyncio client. Not having a Pin was resulting in no traces being produced for the async redis client.

Other Changes

  • perf: don’t encode default parent_id value.

  • profiling: add support for protobuf >=4.0.


Upgrade Notes

  • The profiler asyncio_loop_policy attribute has been renamed to asyncio_loop_policy_class to accept a user-defined class. This guarantees the same asyncio loop policy class can be used process children.

New Features

  • Add tracing support for aiomysql>=0.1.0.

  • Add support for grpc.aio.

  • botocore: allow defining error status codes for specific API operations.

    See our botocore document for more information on how to enable this feature.

  • ciapp: detect code owners of PyTest tests

  • The memory profile collector can now entirely disabled with the DD_PROFILING_MEMORY_ENABLED environment variable.

  • psycopg2: add option to enable tracing psycopg2.connect method.

    See our psycopg documentation for more information.

  • Add asyncio support of redis ≥ 4.2.0

Bug Fixes

  • Fixes deprecation warning for asyncio.coroutine decorator.

  • internal: normalize header names in ASM

  • profiling: implement __aenter__ and __aexit__ methods on asyncio.Lock wrapper.

  • tracing: fix issue with ddtrace-run having the wrong priority order of tracer host/port/url env variable configuration.

  • django,redis: fix unicode decode error when using unicode cache key on Python 2.7

  • fastapi/starlette: when using sub-apps, formerly a call to /sub-app/hello/{name} would give a resource name of /sub-app. Now the full path /sub-app/hello/{name} is used for the resource name.

  • sanic: Don’t send non-500s error traces.

  • pin protobuf to version >=3,<4 due to incompatibility with version 4.21.

  • Fixes a performance issue with the profiler when used in an asyncio application.

  • The profiler now copy all user-provided attributes on fork.

  • pytest: Add note for disabling ddtrace plugin as workaround for side-effects

  • Set required header to indicate top level span computation is done in the client to the Datadog agent. This fixes an issue where spans were erroneously being marked as top level when partial flushing or in certain asynchronous applications.

    The impact of this bug is the unintended computation of stats for non-top level spans.

Other Changes

  • The default number of events kept by the profiler has been reduced to decreased CPU and memory overhead.



The Datadog APM Python team is happy to announce the release of v1.0.0 of ddtrace. This release introduces a formal versioning policy that simplifies the public interface and defines a release version policy for backwards compatible and incompatible changes to the public interface.

The v1.0.0 release is an important milestone for the library as it has grown substantially in scope. The first commit to the library was made on June 20, 2016. Nearly sixty minor releases later, the library now includes over sixty integrations for libraries. And the library has expanded from Tracing to support the Continuous Profiler and CI Visibility.


Before upgrading to v1.0.0, we recommend users install ddtrace>=0.60.0,<1.0.0 and enable deprecation warnings. All removals to the library interface and environment variables were deprecated on 0.x branch. Consult Upgrade 0.x for recommendations on migrating from the 0.x release branch.


The changes to environment variables apply only to the configuration of the ddtrace library and not the Datadog Agent.

Upgrading summary

Functionality changes

The default logging configuration functionality of ddtrace-run has changed to address conflicts with application logging configuration. See note on the new default behavior and note on deprecation for future removal.

Removed legacy environment variables

These environment variables have been removed. In all cases the same functionality is provided by other environment variables and replacements are provided as recommended actions for upgrading.




DATADOG_ prefix

DD_ prefix














Removed legacy tracing interfaces

These methods and module attributes have been removed. Where the same functionality is provided by a different public method or module attribute, a recommended action is provided for upgrading. In a few limited cases, because the interface was no longer used or had been moved to the internal interface, it was removed and so no action is provided for upgrading.




























































Removed legacy integration tracing

These tracing functions in integrations were no longer used for automatic instrumentation so have been removed. Any manual instrumentation code in an application will need to be replaced with ddtrace.patch_all() or ddtrace.patch() when upgrading.










































Removed deprecated modules

These modules have been removed. Many were moved to the internal interface as they were not intended to be used as part of the public interface. In these cases, no action is provided for upgrading. In a few cases, other modules are provided as alternatives to maintain functionality. See the notes for more information.

























Upgrade Notes

  • The deprecated attribute ddtrace.Sampler.default_sampler is removed.

  • Spans started after Tracer.shutdown() has been called will no longer be sent to the Datadog Agent.

  • Default value of DD_CALL_BASIC_CONFIG was updated from True to False. Call logging.basicConfig() to configure logging in your application.

  • aiohttp_jinja2: use patch(aiohttp_jinja2=True) instead of patch(aiohttp=True) for enabling/disabling the integration.

  • ddtrace.settings.Config.HTTPServerConfig is removed.

  • cassandra: get_traced_cassandra is removed. Use ddtrace.patch(cassandra=True) or ddtrace.patch_all() instead.

  • celery: ddtrace.contrib.celery.patch_task is removed. Use ddtrace.patch(celery=True) or ddtrace.patch_all() instead.

  • celery: ddtrace.contrib.celery.unpatch_task is removed. Use ddtrace.contrib.celery.unpatch() instead.

  • ddrace.context.Context.clone is removed. This is no longer needed since the tracer now supports asynchronous frameworks out of the box.

  • ddtrace.constants.FILTERS_KEY is removed.

  • ddtrace.constants.NUMERIC_TAGS is removed.

  • ddtrace.constants.LOG_SPAN_KEY is removed.

  • The deprecated module ddtrace.contrib.util is removed.

  • The deprecated module ddtrace.compat is removed.

  • The deprecated module ddtrace.encoding is removed.

  • The deprecated modules ddtrace.http and ddtrace.http.headers are removed. Use ddtrace.contrib.trace_utils.set_http_meta to store request and response headers on a span.

  • Remove deprecated ddtrace.install_excepthook.

  • Remove deprecated ddtrace.uninstall_excepthook.

  • The deprecated module ddtrace.propagation.utils is removed.

  • The deprecated module ddtrace.utils and its submodules are removed:
    • ddtrace.utils.attr

    • ddtrace.utils.attrdict

    • ddtrace.utils.cache

    • ddtrace.utils.config

    • ddtrace.utils.deprecation

    • ddtrace.utils.formats

    • ddtrace.utils.http

    • ddtrace.utils.importlib

    • ddtrace.utils.time

    • ddtrace.utils.version

    • ddtrace.utils.wrappers

  • ddtrace.Tracer.sampler is removed.

  • ddtrace.Tracer.priority_sampler is removed.

  • ddtrace.Tracer.tags is removed. Use the environment variable DD_TAGS to set the global tags instead.

  • ddtrace.Tracer.log was removed.

  • The deprecated module ddtrace.ext.errors is removed. Use the ddtrace.constants module instead:

    from ddtrace.constants import ERROR_MSG
    from ddtrace.constants import ERROR_STACK
    from ddtrace.constants import ERROR_TYPE
  • The deprecated module ddtrace.ext.priority is removed. Use the ddtrace.constants module instead for setting sampling priority tags:

    from ddtrace.constants import USER_KEEP
    from ddtrace.constants import USER_REJECT
  • The deprecated module ddtrace.ext.system is removed. Use ddtrace.constants.PID instead.

  • The legacy environment variables DD_SERVICE_NAME and DATADOG_SERVICE_NAME are removed. Use DD_SERVICE instead.

  • mongoengine: The deprecated method ddtrace.contrib.mongoengine.trace_mongoengine is removed. Use ddtrace.patch(mongoengine=True) or ddtrace.patch() instead.

  • mysql: The deprecated method ddtrace.contrib.mysql.get_traced_mysql_connection is removed. Use ddtrace.patch(mysql=True) or ddtrace.patch_all() instead.

  • Pin.app is removed.

  • Pin.app_type is removed.

  • psycopg: ddtrace.contrib.psycopg.connection_factory is removed. Use ddtrace.patch(psycopg=True) or ddtrace.patch_all() instead.

  • ddtrace.Span.pprint is removed.

  • Span.to_dict is removed.

  • Span.tracer is removed.

  • The deprecated tracer argument is removed from ddtrace.Span.__init__().

  • sqlite3: ddtrace.contrib.sqlite3.connection_factory is removed. Use ddtrace.patch(sqlite3=True) or ddtrace.patch_all() instead.

  • Remove deprecated attribute ddtrace.Tracer.debug_logging. Set the logging level for the ddtrace.tracer logger instead:

    import logging
    log = logging.getLogger("ddtrace.tracer")
  • ddtrace.Tracer.__call__ is removed.

  • ddtrace.Tracer.global_excepthook is removed.

  • ddtrace.Tracer.set_service_info is removed.

  • ddtrace.Tracer.writer is removed. To force flushing of buffered traces to the agent, use ddtrace.Tracer.flush() instead.

  • ddtrace.warnings.DDTraceDeprecationWarning is removed.

  • DD_TRACE_RAISE_DEPRECATIONWARNING environment variable is removed.

  • The environment variables prefixed with DATADOG_ are removed. Use environment variables prefixed with DD_ instead.

  • The environment variable DD_LOGGING_RATE_LIMIT is removed. Use DD_TRACE_LOGGING_RATE instead.

  • The environment variable DD_TRACER_PARTIAL_FLUSH_ENABLED is removed. Use DD_TRACE_PARTIAL_FLUSH_ENABLED instead.

  • The environment variable DD_TRACER_PARTIAL_FLUSH_MIN_SPANS is removed. Use DD_TRACE_PARTIAL_FLUSH_MIN_SPANS instead.

  • ddtrace.util is removed.

  • ddtrace.ext.SpanTypes is no longer an Enum. Use SpanTypes.<TYPE> instead of SpanTypes.<TYPE>.value.

  • Tracer.write has been removed.

Deprecation Notes

  • DD_CALL_BASIC_CONFIG is deprecated.

New Features

  • Add Span.get_tags and Span.get_metrics.

  • aiohttp: add client integration. This integration traces requests made using the aiohttp client and includes support for distributed tracing. See the documentation for more information.

  • aiohttp_jinja2: move into new integration. Formerly the aiohttp_jinja2 instrumentation was enabled using the aiohttp integration. Use patch(aiohttp_jinja2=True) instead of patch(aiohttp=True). To support legacy behavior patch(aiohttp=True) will still enable aiohttp_jinja2.

  • asyncpg: add integration supporting v0.18.0 and above. See the docs for more information.

  • fastapi: add support for tracing fastapi.routing.serialize_response.

    This will give an insight into how much time is spent calling jsonable_encoder within a given request. This does not provide visibility into how long it takes for Response.render/json.dumps.

  • Add support to reuse HTTP connections when sending trace payloads to the agent. This feature is disabled by default. Set DD_TRACE_WRITER_REUSE_CONNECTIONS=true to enable this feature.

  • MySQLdb: Added optional tracing for MySQLdb.connect, using the configuration option here.

  • The profiler now supports profiling asyncio.Lock objects.

Bug Fixes

  • aiohttp: fix issue causing ddtrace.contrib.aiohttp_jinja2.patch module to be imported instead of the patch() function.

  • botocore: omit SecretBinary and SecretString from span metadata for calls to Secrets Manager.

  • tracing/internal: fix encoding of propagated internal tags.

  • Fix issue building ddtrace from source on macOS 12.

  • Fix issue building ddtrace for the Pyston Python implementation by not building the _memalloc extension anymore when using Pyston.

  • tracer.get_log_correlation_context(): use active context in addition to

    active span. Formerly just the span was used and this would break cross execution log correlation as a context object is used for the propagation.

  • opentracer: update set_tag and set_operation_name to return a

    reference to the span to match the OpenTracing spec.

  • The CPU profiler now reports the main thread CPU usage even when asyncio tasks are running.

  • Fixes wrong numbers of memory allocation being reported in the memory profiler.

  • pymongo: fix write_command being patched with the wrong method signature.

Other Changes

  • tracing/internal: disable Datadog internal tag propagation


Deprecation Notes

  • ddtrace.constants.FILTERS_KEY is deprecated. Use settings={"FILTERS": ...} instead when calling tracer.configure.

  • ddtrace.constants.NUMERIC_TAGS is deprecated.

  • ddtrace.constants.LOG_SPAN_KEY is deprecated.

  • Pin.app is deprecated.

  • ddtrace.Span.tracer is deprecated.

  • ddtrace.Tracer.log is deprecated. Use ddtrace.tracer.log instead.

  • ddtrace.Tracer.sampler is deprecated.

  • ddtrace.Tracer.priority_sampler is deprecated.

  • ddtrace.Tracer.tags is deprecated. Use the environment variable DD_TAGS to set the global tags instead.

New Features

  • The profiler now reports asyncio tasks as part as the task field in profiles. This is enabled by default by replacing the default asyncio loop policy. CPU time, wall time and threading lock times are supported.

  • Add tracing support for sanic>=21.9.0.

Bug Fixes

  • Fix internal import of deprecated ddtrace.utils module.

  • Set correct service in logs correlation attributes when a span override the service.

  • Fixes import path to not reference __init__. This could otherwise be a problem for mypy.

  • flask: fix resource naming of request span when errors occur in middleware.

  • Fix issue when httpx service name is bytes.

  • Fixes build issues on older MacOS versions by updating libddwaf to 1.0.18

  • pytest: fix unsafe access to xfail reason.


Deprecation Notes

  • HttpServerConfig is no longer part of the public API.

  • ddtrace.Span.pprint() is deprecated and will be removed in v1.0.

  • ddtrace.Tracer.writer is deprecated. To force flushing of buffered traces to the agent, use ddtrace.Tracer.flush() instead.

New Features

  • botocore: add distributed tracing support for AWS EventBridge, AWS SNS & AWS Kinesis.

  • Only for CI Visibility (pytest integration): remove traces whose root span is not a test.

Bug Fixes

  • Fix application crash on startup when using channels >= 3.0.

  • Fix parenting of Redis command spans when using aioredis 1.3. Redis spans should now be correctly attributed as child of any active parent spans.

  • Fixes incompatibility of wrapped aioredis pipelines in async with statements.

  • Fixes issue with aioredis when empty pool is not available and execute returns a coroutine instead of a future. When patch tries to add callback for the span using add_done_callback function it crashes because this function is only for futures.

  • Escape non-Unicode bytes when decoding aioredis args. This fixes a UnicodeDecodeError that can be thrown from the aioredis integration when interacting with binary-encoded data, as is done in channels-redis.

  • Ensure gevent is automatically patched.

  • grpc: ensure grpc.intercept_channel is unpatched properly

  • Fix JSON encoding error when a bytes string is used for span metadata.

  • Profiler raises a typing error when Span.resource is unicode on Python 2.7.

  • Fix a bug in the heap profiler that could be triggered if more than 2^16 memory items were freed during heap data collection.

  • Fix a possible bug in the heap memory profiler that could trigger an overflow when too many allocations were being tracked.

  • Fix an issue in the heap profiler where it would iterate on the wrong heap allocation tracker.

  • Pymongo instrumentation raises an AttributeError when tracer.enabled == False


Deprecation Notes

  • ddtrace.sampler.DatadogSampler.default_sampler property is deprecated and will be removed in 1.0.

  • ddtrace.propagation.utils has been deprecated and will be removed in version 1.0.

New Features

  • Add new environment variables to enable/disable django database and cache instrumentation.


  • Add tracing support for the aioredis library. Version 1.3+ is fully supported.

  • Add django 4.0 support.

  • The profiler now automatically injects running greenlets as tasks into the main thread. They can be seen within the wall time profiles.

Bug Fixes

  • The thread safety of the custom buffered encoder was fixed in order to eliminate a potential cause of decoding errors of trace payloads (missing trace data) in the agent.

  • Fix handling of Python exceptions during trace encoding. The tracer will no longer silently fail to encode invalid span data and instead log an exception.

  • Fix error when calling concurrent.futures.ThreadPoolExecutor.submit with fn keyword argument.

  • Configure a writer thread in a child process after forking based on writer configuration from its parent process.

  • Only for CI Visibility (pytest integration): Fix calculation of pipeline URL for GitHub Actions.


Deprecation Notes

  • The ddtrace.utils module and all of its submodules have been copied over into ddtrace.internal in an effort to internalize these modules. Their public counterparts will be removed entirely in version 1.0.0.

New Features

  • Profiling now supports tracing greenlets with gevent version prior to 1.3.

  • The heap profiler is now enabled by default.

  • Add yaaredis ≥ 2.0.0 support.

Bug Fixes

  • Allow the elasticsearch service name to be overridden using the integration config or the DD_SERVICE_MAPPING environment variable.

  • Fixes parsing of botocore env variables to ensure they are parsed as booleans.

  • Ensure tornado spans are marked as an error if the response status code is 500 <= x < 600.


Bug Fixes

  • Fix memory leak caused when the tracer is disabled.


Upgrade Notes

  • The aredis integration is now enabled by default.

Deprecation Notes

  • The contents of monkey.py have been moved into _monkey.py in an effort to internalize the module. Public methods have been imported back into monkey.py in order to retain compatibility, but monkey.py will be removed entirely in version 1.0.0.

Bug Fixes

  • Fix Pyramid caller_package level issue which resulted in crashes when starting Pyramid applications. Level now left at default (2).

  • Set the correct package name in the Pyramid instrumentation. This should fix an issue where the incorrect package name was being used which would crash the application when trying to do relative imports within Pyramid (e.g. when including routes from a relative path).


Upgrade Notes

  • Instead of using error constants from ddtrace.ext.errors. Use constants from ddtrace.constants module. For example: ddtrace.ext.errors.ERROR_MSG -> ddtrace.constants.ERROR_MSG

  • Instead of using priority constants from ddtrace.ext.priority. Use constants from ddtrace.constants module. For Example:: ddtrace.ext.priority.AUTO_KEEP -> ddtrace.constants.AUTO_KEEP

  • Instead of using system constants from ddtrace.ext.system. Use constants from ddtrace.constants module. For Example:: ddtrace.ext.system.PID -> ddtrace.constants.PID

Deprecation Notes


    [Deprecated environment variable] | [Recommended environment variable]



    • For DATADOG_PRIORITY_SAMPLING, follow ingestion controls


  • Moved ddtrace.ext.errors constants into the ddtrace.constants module. ddtrace.ext.errors will be removed in v1.0. Shorthand error constant (MSG,TYPE,STACK) in ddtrace.ext.errors will be removed in v1.0. Function get_traceback() in ddtrace.ext.errors is now deprecated and will be removed v1.0.

  • Moved ddtrace.ext.priority constants into ddtrace.constants module.

  • Moved ddtrace.ext.system constants into ddtrace.constants module.

New Features

  • Add aredis support >= 1.1.0

  • Add automatic unix domain socket detection for Dogstatsd. The expected path for the socket is /var/run/datadog/dsd.socket which if exists, will be used instead of the previous UDP default, udp://localhost:8125/. To be used in conjunction with dogstatsd_socket in your datadog.yaml file, or the DD_DOGSTATSD_SOCKET environment variable set on the Datadog agent.

  • Add new DD_TRACE_SAMPLING_RULES environment variable to override default sampling rules. For Example:: DD_TRACE_SAMPLING_RULES='[{"sample_rate":0.5,"service":"my-service"}]'

  • Add support for snowflake-connector-python >= 2.0.0. Note that this integration is in beta and is not enabled by default. See the snowflake integration documentation for how to enable.

  • Only for CI Visibility (pytest integration): include pytest version as a tag in the test span.

  • Added official support for Python 3.10

  • Only for CI Visibility (pytest integration): Extract stage and job name from environment data in Azure Pipelines.

Bug Fixes

  • Fixes an issue where all Django function middleware will share the same resource name.

  • Fixed an issue with gevent worker processes that caused them to crash and stop.

  • Fixes exceptions raised when logging during tracer initialization when DD_LOGS_INJECTION is enabled.

  • The ddtrace.utils.wrappers.unwrap function now raises an error if trying to unwrap a non-wrapped object.

  • Only for CI Visibility (pytest integration): Fix extraction of branch in GitLab CI.


Deprecation Notes

  • Deprecate the DATADOG_ENV environment variable in favor of DD_ENV. The use of DD_ENV should follow Unified Service Tagging recommendations.

New Features

  • Add automatic unix domain socket detection for traces. The expected path for the socket is /var/run/datadog/apm.socket which if exists, will be used instead of the previous http default, http://localhost:8126/. To be used in conjunction with apm_config.receiver_socket in your datadog.yaml file, or the DD_APM_RECEIVER_SOCKET environment variable set on the Datadog agent.

  • Update the –info command to be easier to read and provide more helpful information.

  • Add support for DD_PROFILING_ENDPOINT_COLLECTION_ENABLED env variable to disable endpoint name collection in profiler.

  • Add rq integration.

  • Tag traces with HTTP headers specified on the DD_TRACE_HEADER_TAGS environment variable. Value must be either comma or space separated. e.g. Host:http.host,User-Agent,http.user_agent or referer:http.referer Content-Type:http.content_type.

Bug Fixes

  • pytest: report exception details directly instead of through a RuntimeWarning exception.

  • Fixed the support for Celery workers that fork sub-processes with Python 3.6 and earlier versions.

  • Fix the reporting of the allocated memory and the number of allocations in the profiler.

  • Fixes cases in which the test.status tag of a test span from pytest would be missing because pytest_runtest_makereport hook is not run, like when pytest has an internal error.

  • Pin protobuf version to <3.18 for Python <=3.5 due to support being dropped.

  • Make sure that correct endpoint name collected for profiling.

Other Changes

  • Added runtime metrics status and sampling rules to start-up logs.


Upgrade Notes


Deprecation Notes

  • The DD_TRACER_PARTIAL_FLUSH_ENABLED and DD_TRACER_PARTIAL_FLUSH_MIN_SPANS environment variables have been deprecated and will be removed in version 1.0 of the library.

New Features

  • The ddtrace.Tracer.get_log_correlation_context method has been added to replace ddtrace.helpers.get_correlation_ids. It now returns a dictionary which includes the current span’s trace and span ids, as well as the configured service, version, and environment names.

  • The gevent tasks are now tracked by the threading lock events

Bug Fixes

  • Fixes an issue where a manually set django.request span resource would get overwritten by the integration.

  • Pin setup_requires dependency setuptools_scm[toml]>=4,<6.1 to avoid breaking changes.

  • The profiler now updates the trace resource when capturing span information with the stack and lock collectors. That means that if the trace resource changes after the profiling events are created, the profiler samples will also be updated. This avoids having trace resource being empty when profiling, e.g., WSGI middleware.


Deprecation Notes

  • Removed the collect_metrics argument from Tracer.configure. See the release notes for v0.49.0 for the migration instructions.

New Features

  • Add tracing support for the httpx library. Supported versions >=0.14.0.

  • ASGI: store the ASGI span in the scope. The span can be retrieved with the

    ddtrace.contrib.asgi.span_from_scope function.

  • Submit runtime metrics as distribution metrics instead of gauge metrics.

  • Support flask-caching (>= 1.10.0) with the Flask-Cache tracer.

  • Only for CI Visibility (pytest integration): It is now possible to specify any of the following git metadata through environment variables: * DD_GIT_REPOSITORY_URL: The url of the repository where the code is stored * DD_GIT_TAG: The tag of the commit, if it has one * DD_GIT_BRANCH: The branch where this commit belongs to * DD_GIT_COMMIT_SHA: The commit hash of the current code * DD_GIT_COMMIT_MESSAGE: Commit message * DD_GIT_COMMIT_AUTHOR_NAME: Commit author name * DD_GIT_COMMIT_AUTHOR_EMAIL: Commit author email * DD_GIT_COMMIT_AUTHOR_DATE: The commit author date (ISO 8601) * DD_GIT_COMMIT_COMMITTER_NAME: Commit committer name * DD_GIT_COMMIT_COMMITTER_EMAIL: Commit committer email * DD_GIT_COMMIT_COMMITTER_DATE: The commit committer date (ISO 8601)

Bug Fixes

  • ASGI: handle decoding errors when extracting headers for trace propagation.

  • Corrected some typing annotations for PEP 484 compliance

  • Django: add support for version 3.1+ ASGI applications. A different codepath is taken for requests starting in Django 3.1 which led to the top level span not being generated for requests. The fix introduces automatic installation of the ASGI middleware to trace Django requests.

  • dogpile.cache: handle both kwargs and args in the wrapper functions (using

    only kwargs would result in an IndexError.

  • Fixes an issue with the Django integration where if the urlconf changes at any point during the handling of the request then the resource name will only be <METHOD> 404. This fix moves resource name resolution to the end of the request.

  • Fixes error with tagging non-string Flask view args.

  • werkzeug.exceptions.NotFound 404 errors are no longer raised and logged as a server error in the Flask integration.

  • Fixes type hinting for **patch_modules parameter for patch/patch_all functions.

  • Fixes an issue when using the pytest plugin with doctest which raises an AttributeError on DoctestItem.

  • Fixes a bug in the pytest plugin where xfail test cases in a test file with a module-wide skip raises attribute errors and are marked as xfail rather than skipped.

  • Fixed the handling of sanic endpoint paths with non-string arguments.

  • opentracer: don’t override default tracing config for the ENABLED,



Upgrade Notes

  • botocore: Update trace propagation format for directly invoked Lambda functions. This breaks compatibility with Lambda functions instrumented with datadog-lambda-python < v41 or datadog-lambda-js < v3.57.0. Please upgrade datadog-lambda-* in invoked lambda functions, or engage legacy compatibility mode in one of two ways: - ddtrace.config.botocore.invoke_with_legacy_context = True - DD_BOTOCORE_INVOKE_WITH_LEGACY_CONTEXT=true

New Features

  • Added support for aiopg~=0.16.0.

  • Add MariaDB integration.

  • The profiler now exports active tasks for CPU and wall time profiles.

Bug Fixes

  • Fixed JSON encoding errors in the pytest plugin for parameterized tests with dictionary parameters with tuple keys. The pytest plugin now always JSON encodes the string representations of test parameters.

  • Fixed JSON encoding errors in the pytest plugin for parameterized tests with complex Python object parameters. The pytest plugin now defaults to encoding the string representations of non-JSON serializable test parameters.

  • Fix a possible NoneType error in the WSGI middleware start_response method.


Upgrade Notes

  • The legacy Django configuration method (deprecated in 0.34) has been removed.

Deprecation Notes

  • monkey.patch_module is deprecated.

  • monkey.get_patch_module is deprecated.

New Features

  • Added support for jinja2~=3.0.0.

  • The pytest integration now uses the name of the repository being tested as the default test service name.

Bug Fixes

  • Fixes an issue with enabling the runtime worker introduced in v0.49.0 where no runtime metrics were sent to the agent.

  • Fix pymongo 3.12.0+ spans not being generated.


New Features

  • The Python heap profiler can now be enabled by setting the DD_PROFILING_HEAP_ENABLED environment variable to 1.

Other Changes

  • The botocore integration excludes AWS endpoint call parameters that have a name ending with Body from the set of span tags.


New Features

  • The pytest plugin now includes support for automatically tagging spans with parameters in parameterized tests.


Deprecation Notes

  • The deprecated dbapi2 configuration has been removed. The integration-specific configuration should be used instead. Look at the v0.48.0 release notes for migration instructions.

New Features

  • Add new environment variables to configure the internal trace writer.


  • The exception profiler now gathers and exports the traces and spans information.

Bug Fixes

  • Fixed the handling of the Django template name tag causing type errors.

  • Fixes an issue when trying to manually start the runtime metrics worker:

    AttributeError: module 'ddtrace.internal.runtime' has no attribute 'runtime_metrics'
  • sanic: update instrumentation to support version 21.

  • Performance of the Celery integration has been improved.

  • Fix runtime-id and system.pid tags not being set on distributed traces.


Deprecation Notes

  • The reuse of a tracer that has been shut down has been deprecated. A new tracer should be created for generating new traces.

New Features

  • Add new DD_TRACE_AGENT_TIMEOUT_SECONDS to override the default connection timeout used when sending data to the trace agent. The default is 2.0 seconds.

  • The CI tagging for the pytest plugin now includes OS and Python Runtime metadata including system architecture, platform, version, and Python runtime name and version.

Bug Fixes

  • The shutdown task is re-registered when a tracer is reused after it has been shut down.

  • Fixed the optional argument of Span.finish to Optional[float] instead of Optional[int].

Other Changes

  • The pytest plugin now includes git metadata tags including author name and email as well as commit message from CI provider environments.

  • The profiler won’t be ignoring its own resource usage anymore and will report it in the profiles.



Major changes to context management. See the upgrade section for the specifics. Note that only advanced users of the library should be affected by these changes. For the details please refer to the Context section of the docs: https://ddtrace.readthedocs.io/en/v0.50.0/advanced_usage.html

Upgrade Notes

  • ddtrace.contrib.asyncio - AsyncioContextProvider can now return and activate None, Span or Context objects.

  • ddtrace.contrib.gevent - GeventContextProvider can now return and activate None, Span or Context objects.

  • ddtrace.contrib.tornado - TracerStackContext can now return and activate None, Span or Context objects.

  • ddtrace.context.Context no longer maintains the active/current span state.

    get_current_root_span() has been removed. Use tracer.current_root_span() instead. get_current_span() has been removed. Use tracer.current_span() instead. add_span() has been removed. To activate a span in an execution use tracer.context_provider.activate() instead. close_span() has been removed. To deactivate a span in an execution use tracer.context_provider.activate() instead.

  • ddtrace.provider.BaseContextProvider active() now returns None, Span or Context objects. activate() now accepts None, Span or Context objects.

  • ddtrace.span.Span - Span.context will now return a Context

  • ddtrace.tracer.Tracer tracer.get_call_context() will now return a one-off Context reference. This is to maintain backwards compatibility with the API but the functionality differs slightly. tracer.start_span() passing a span.context for child_of no longer adds the strong _parent reference to the new span.

  • Support for MySQL-python has been removed.

  • Support for psycopg < 2.7 has been removed.

New Features

  • Add DD_CALL_BASIC_CONFIG={true,false} environment variable to control whether ddtrace calls logging.basicConfig. By default when using ddtrace-run or running in debug mode logging.basicConfig is called to ensure there is always a root handler. This has compatibility issues for some logging configurations. DD_CALL_BASIC_CONFIG=false can be used to skip calling logging.basicConfig. The default value is true to maintain existing behavior.

  • agent: support URL with a base path

  • Automated context management should now work in all asynchronous frameworks that use contextvars.

  • tracer.start_span() now accepts an activate argument (default False) to allow manual context management.

  • tracer.current_trace_context() has been added to be used to access the trace context of the active trace.

  • A warning has been added to alert when gevent monkey patching is done after ddtrace has been imported.

  • Add support for Flask 2

  • Added retry logic to the tracer to mitigate potential networking issues, like timeouts or dropped connections.

Bug Fixes

  • The OpenTracing tracer.start_span method no longer activates spans.

  • Datadog active spans will no longer take precedence over OpenTracing active spans.

  • django: fix a bug where multiple database backends would not be instrumented.

  • django: fix a bug when postgres query is composable sql object.

  • Fix double patching of pymongo client topology.



Several deprecations have been made to Context as we prepare to move active span management out of this class.

Upgrade Notes

  • Support for aiohttp previous to 2.0 has been removed.

  • Support for deprecated DD_PROFILING_API_URL environment variable has been removed. Use DD_SITE instead.

  • Support for deprecated DD_PROFILING_API_KEY environment variable has been removed. Use DD_API_KEY instead.

  • Profiling support for agentless mode must now be explicitly enabled.

  • The ddtrace pytest plugin can now label spans from test cases marked xfail with the tag “pytest.result”

    and the reason for being marked xfail under the tag “pytest.xfail.reason”.

  • Removed ddtrace.ext.AppTypes and its usages in the tracer library.

  • requests: spans will no longer inherit the service name from the parent.

  • The return value of Span.pprint() has been changed to a single line in the tracer debug logs rather than the previous custom multiline format.

  • Spans are now processed per tracer instance. Formerly spans were stored per-Context which could be shared between tracer instances. Note that context management is not affected. Tracers will still share active spans.

  • Spans from asynchronous executions (asyncio, gevent, tornado) will now be processed and flushed together. Formerly the spans were handled per-task.

  • tracer.write() will no longer have filters applied to the spans passed to it.

  • The function ddtrace.utils.merge_dicts has been removed.

Deprecation Notes

  • Context.clone is deprecated. It will not be required in 0.50.

  • Context.add_span is deprecated and will be removed in 0.50.

  • Context.add_span is deprecated and will be removed in 0.50.

  • Context.close_span is deprecated and will be removed in 0.50.

  • Context.get_current_span is deprecated and will be removed in 0.50 please use Tracer.current_span instead.

  • Context.get_current_root_span is deprecated and will be removed in 0.50 please use Tracer.current_root_span instead.

  • Deprecate the configuration of the analytics through the generic dbapi2 configuration. This should now be configured via integration configurations, for example:

    # Before
    # After
  • ddtrace.compat has been deprecated and will be removed from the public API in ddtrace version 1.0.0.

  • Deprecate ddtrace.config.dbapi2 as default for TracedCursor and TracedConnection as well as DD_DBAPI2_TRACE_FETCH_METHODS. Use IntegrationConfig and DD_<INTEGRATION>_TRACE_FETCH_METHODS specific to each dbapi-compliant library. For example:

    # Before
    config.dbapi2.trace_fetch_methods = True
    # After
    config.psycopg2.trace_fetch_methods = True
  • The use of ddtrace.encoding has been deprecated and will be removed in version 1.0.0.

  • The ddtrace.http module has been deprecated and will be removed in version 1.0.0, with the ddtrace.http.headers module now merged into ddtrace.trace_utils.

  • The collect_metrics argument of the tracer.configure method has been deprecated. Runtime metrics should be enabled only via the DD_RUNTIME_METRICS_ENABLED environment variable.

New Features

  • The futures integration is now enabled by default.

  • requests: add global config support. This enables the requests service name to be configured with ddtrace.config.requests['service'] or the DD_REQUESTS_SERVICE environment variable.

Bug Fixes

  • Fix broken builds for Python 2.7 on windows where <stdint.h> was not available. This change also ensures we build and publish cp27-win wheels.

  • CGroup file parsing was fixed to correctly parse container ID with preceding characters.

  • grpc: handle None values for span tags.

  • grpc: handle no package in fully qualified method

  • grpc: Add done callback in streaming response to avoid unfinished spans if a StopIteration is never raised, as is found in the Google Cloud libraries.

  • grpc: handle IPv6 addresses and no port in target.

  • Fix DD_LOGS_INJECTION incompatibility when using a logging.StrFormatStyle (logging.Formatter(fmt, style="{")) log formatter.

  • Fixed a bug that prevented the right integration name to be used when trying to patch a module on import that is already loaded.

  • Fix urllib3 patching not properly activating the integration.

  • gRPC client spans are now marked as measured by default.

  • Fixes issue of unfinished spans when response is not a grpc.Future but has the same interface, as is the case with the base future class in google-api-core.

  • In certain circumstances, the profiles generated in a uWSGI application could have been empty. This is now fixed and the profiler records correctly the generated events.

  • The default agent timeout for profiling has been restored from 2 to 10 seconds to avoid too many profiles from being dropped.

  • Fix issue with missing traces when using pymemcache.client.hash.HashClient.

  • Added missing pymongo integration configuration, which allows overriding the service name for all the emitted spans.

Other Changes

  • Added environment variable DD_BOTTLE_DISTRIBUTED_TRACING to enable distributed tracing for bottle.

  • The attrs library has been unvendored and is now required as a normal Python dependency with a minimum version requirement of 19.2.0.

  • The six library has been removed from vendor and the system-wide version is being used. It requires version 1.12.0 or later.

  • Documentation on how to use Gunicorn with the gevent worker class has been added.

  • Added environment variable DD_FALCON_DISTRIBUTED_TRACING to enable distributed tracing for falcon.

  • When extracting context information from HTTP headers, a new context is created when the trace ID is either 0 or not available within the headers.

  • Added environment variable DD_PYLONS_DISTRIBUTED_TRACING to enable distributed tracing for pylons.

  • Update pymemcache test suite to test latest versions.

  • Added config.pyramid.distributed_tracing setting to integration config for pyramid.

  • The ddtrace.payload submodule has been removed.

  • Added environment variable DD_TORNADO_DISTRIBUTED_TRACING to enable distributed tracing for tornado.


New Features

  • Adds support for the Datadog Lambda Extension. The tracer will send traces to the extension by default if it is present.

  • Add support for space-separated DD_TAGS.

  • urllib3: add urllib3 integration


Upgrade Notes

  • The deprecated dogstatsd_host and dogstatsd_port arguments to tracer.configure() have been removed.

  • Support for gevent 1.0 has been removed and gevent >= 1.1 is required.

  • flask: deprecated configuration option extra_error_codes has been removed.

  • The deprecated pyddprofile wrapper has been removed. Use ddtrace-run with DD_PROFILING_ENABLED=1 set instead.

  • A ValueError will now be raised on tracer initialization if the Agent URL specified to the initializer or with the environment variable DD_TRACE_AGENT_URL is malformed.

  • uWSGI is no longer supported with ddtrace-run due to a limitation of how tracer initialization occurs. See the updated instructions for enabling tracing in the library uWSGI documentation.

New Features

  • dogpile.cache: is now automatically instrumented by default.

  • pylons: now supports all the standard http tagging including query string, custom error codes, and request/response headers.

  • The ddtrace pytest plugin can now call ddtrace.patch_all via the --ddtrace-patch-all option.

  • Span now accepts a on_finish argument used for specifying functions to call when a span finishes.

Bug Fixes

  • The Records parameter to Firehose endpoint calls is being excluded from the tags to avoid generating traces with a large payload.

  • Tracer: fix configuring tracer with dogstatsd url.

  • elasticsearch: patch versioned elasticsearch modules (elasticsearch1, …, elasticsearch7).

  • botocore: Do not assume that ResponseMeta exists in the results.

  • django: handle erroneous middleware gracefully.

  • The tracer now captures the task ID from the cgroups file for Fargate >= 1.4.0 and reports it to the agent as the Datadog-Container-ID tag.

  • Fix a bug when tracing a mako DefTemplate or any Template that does not have a filename property.

  • flask: fix a bug when the query string would contain non-Unicode characters

  • Fix a formatting issue on error exporting profiles.

  • A workaround is provided for the problem with uWSGI worker processes failing to respawn. This can occur when using ddtrace-run for automatic instrumentation and configuration or manual instrumentation and configuration without the necessary uWSGI options. The problem is caused by how the tracer can end up starting threads in the master process before uWSGI forks to initialize the workers processes. To avoid this, we have provided updated instructions for enabling tracing in the library uWSGI documentation.

Other Changes

  • The logic behind the header extraction for distributed tracing has been improved.

  • The default connection timeout for the profiling agent has now been reduced from 10 to 2 seconds to match the tracer behavior.

  • The tracemalloc memory profiler, which was disabled by default, has been removed.

  • Query strings are stripped out from URLs by default when setting URL metadata on a span. This change affects all integrations that store HTTP metadata, like aiohttp, falcon, requests, urllib3.


Upgrade Notes

  • elasticsearch: removed get_traced_transport method and ddtrace.contrib.elasticsearch.transport module.

  • The profiler now automatically sets up uWSGI compatibility in auto mode or with profile_children=True. Make sure that you don’t have custom code instrumenting the profiler in those cases.


New Features

  • cherrypy: introduce TraceMiddleware for the CherryPy web framework.

  • django: tag root spans as measured.

  • elasticsearch: add support for version 7.

  • fastapi: add integration.

  • Introduce support for the DD_SERVICE_MAPPING environment variable to allow remapping service names on emitted spans.

  • httplib: distributed tracing is now enabled by default.

  • The profiler now supports most operation mode from uWSGI without much configuration. It will automatically plug itself in post fork hooks when multiprocess mode is used.

  • wsgi: add tracing middleware.

Bug Fixes

  • Resolves an issue in Django tracing where, if query_string is not present in request.META, a KeyError is raised, causing the request to 500

  • Deprecate the DD_LOGGING_RATE_LIMIT variable in favor of the standard DD_TRACE_LOGGING_RATE for configuring the logging rate limit.

  • sampler: removed bug causing sample_rate of 0 to be reset to 1, and raise ValueError instead of logging.

  • starlette: unpatch calls correctly.

  • flask: fix memory leak of sampled out traces.

  • Fix CPU time and wall time profiling not ignoring the profiler tasks with gevent.

Other Changes

  • The default maximum CPU time used for the stack profiler (CPU time, wall time and exceptions profiling) has been decreased from 2% to 1%.


Upgrade Notes

  • The profiler will only load tags from the DD_TAGS environment variable once at start.

Deprecation Notes

New Features

  • aiohttp: store request and response headers.

  • bottle: store request and response headers.

  • flask: store response headers.

  • molten: store request headers.

  • pyramid: store request and response headers.

  • flask: store request and response headers when auto-instrumented.

  • The ddtrace.profiling.auto module will warn users if gevent monkey patching is done after the profiler is auto-instrumented.

  • The Profiler object can now be passed tags with the tags keyword argument.

Bug Fixes

  • dbapi: avoid type error with potential non-compliance in db libraries when setting tag for row count.

  • django: add legacy resource format of {handler}.

  • grpc: fix wrapper for streaming response to support libraries that call an internal method directly.

  • sanic: use path parameter names instead of parameter values for the resource.

  • The profiler won’t deadlock on fork when gevent monkey patch is enabled.

  • requests: fix TracedSession when patches are not applied.



Build and deploy Python 3.9 wheels for releases

Upgrade Notes

  • Context.get() has been removed and the functionality has been rolled into Context.close_span().

  • Tracer.record() has similarly been removed as it is no longer useful with Context.get() removed.

  • The deprecated compatibility module ddtrace.profile has been removed.

  • The profiler now uses the tracer configuration is no configuration is provided.

Deprecation Notes

  • The pyddprofile wrapper is deprecated. Use DD_PROFILING_ENABLED=true ddtrace-run instead.

  • The profiler does not catch uncaught exception anymore.

New Features

  • botocore: added distributed_tracing configuration setting which is enabled by default.

  • The ddtrace-run command now supports the following arguments:

    -h, –help -d, –debug enable debug mode (disabled by default) -i, –info print library info useful for debugging -p, –profiling enable profiling (disabled by default) -v, –version show program’s version number and exit

    It now also has friendlier error messages when used incorrectly.

  • Add functionality to call gevent.monkey.patch_all() with ddtrace-run by setting the environment variable DD_GEVENT_PATCH_ALL=true. This ensures that gevent patching is done as early as possible in the application.

  • botocore: inject distributed tracing data to ClientContext to trace lambda invocations.

  • botocore: inject tracing data to MessageAttributes.

  • The profiler now tracks the running gevent Greenlet and store it as part of the CPU and wall time profiling information.

  • The profiler is now able to upload profiles to the Datadog Agent by using a Unix Domain Socket.

  • It is now possible to pass a url parameter to the Profiler to specify the Datadog agent location.

  • The new memory profiler for Python is now enabled by default. This improves the profiler memory consumption and performance impact. It can still be disabled by setting DD_PROFILING_MEMALLOC=0 as an environment variable.

  • The profiler now uses the tracer configuration is no configuration is provided.

  • pytest integration. This enables the pytest runner to trace test executions.

Bug Fixes

  • core: always reset the current_span in the context.

  • django: Http404 exceptions will no longer be flagged as errors

  • django: add safe guards for building http.url span tag.

  • aiobotocore: set span error for 5xx status codes.

  • elasticsearch: set span error for 5xx status codes.

  • django, DRF, ASGI: fix span type for web request spans.

  • Fixes span id tagging in lock profiling.

  • Fix UDS upload for profiling not using the correct path.

  • Fixed an issue in profiling exporting profiles twice when forking.

  • core: fix race condition in TracerTagCollector.

Other Changes

  • Start-up logs are now disabled by default. To enable start-up logs use DD_TRACE_STARTUP_LOGS=true or DD_TRACE_DEBUG=true.



Add support for Python 3.9

New Features

  • Store request headers in Flask integration.

  • pyodbc integration. This enables the pyodbc library to trace queries.

  • starlette integration resource aggregation This aggregates endpoints to the starlette application resource that was accessed. It occurs by default but it is configurable through config.starlette[“aggregate_resources”].

  • The profiler now captures the traces information with the lock profiling.

  • The Profiler instances now restart automatically in child process when the main program is forked. This only works for Python ≥ 3.7.

Bug Fixes

  • dbapi: add support for connection context manager usage

  • django: check view before instrumenting MRO.

  • core: use loose types when encoding.

  • Patch pynamodb on import to prevent patching conflicts with gevent.

  • tornado: handle when the current span is None in log_exception().