NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #494 most downloaded on PyPI
Datadog APM client library
Last release 3 days ago
01 Oct 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
5 versions withdrawn
withdrawn after publishing
10 years old
853 releases · first in 2017
[core] add a processing pipeline to the AsyncWorker, so that traces can be filtered easily. This change doesn't have any performance impact with exist
New features
AsyncWorker, so that traces can be filtered easily. This change doesn't have any performance impact with existing installations, and is expected to work well with async frameworks / libraries (#303, docs)Bugfixes
async with context manager so that it returns the wrapper instead of the wrapped object (#307)Documentation
[core] add process ID in root spans metadata
One column per quarter.
New features
Improvements
Context when a Greenlet is created so that the tracing context is automatically propagated with the right parenting (#287)patch() method to automatically propagate the tracing context between different asyncio tasks (#260 #297, docs -- thanks @thehesiod)DEFAULT_DATABASE_PREFIX setting to append a prefix to database service (#291, docs -- thanks @jairhenrique)Bugfixes
monkey.py module (#281)ddtrace exception middleware catches exceptions even if a custom middleware returns a Response object (#278)View is a partial function (#292)New integrations
httplib and http.lib(#137 -- thanks @brettlangdon)aiobotocore support (#257, #298, docs -- thanks @thehesiod)aiopg support (#258, docs -- thanks @thehesiod)[flask] add the http method to flask spans
Bugfixes
db (#276)span.set_traceback()now sets the traceback even if there's no exception (#277)Read the full changeset.
[flask] avoid using weak references when Flask is instrumented via Blinker. This resolves initialization issues when the traced_app = TraceMiddleware(
Bugfixes
traced_app = TraceMiddleware(app, ...) reference goes out of the scope or is garbage collected (#273)[sqlalchemy] provide a patch() method that uses the PIN object; this is not a breaking change, but the preferred way to instrument SQLAlchemy is throu…
Improvements
X-Datadog-Trace-Count) so that the receiving agent has more information when dealing with sampling (#254)Bugfixes
PatchException that is handled in the patch_all() when the patch failed. This distinguishes: errors during patch, when an integration is not available and simply when the module is not installed (#262)MySQL-Python instrumentation so that only mysql-connector package is patched; this provides better feedback about what library is supported (#263, #266)patch() method that uses the PIN object; this is not a breaking change, but the preferred way to instrument SQLAlchemy is through patch_all(sqlalchemy=True) or patch(sqlalchemy=True) (#261)BaseException since a SystemExit might've been raised; 500 errors are handled if a timeout occurs (#267, #270)BaseException since a SystemExit might've been raised; 500 errors are handled if a timeout occurs (#269)Read the full changeset
[django] handle tuple INSTALLED_APPS for Django < 1.9
[core] fixed msgpack-python kwarg usage for versions earlier than 0.4.x
Bugfixes
msgpack-python kwarg usage for versions earlier than 0.4.x (#245)Read the full changeset.
Add support for Tornado web 4.0+. Currently this integration is ignored by autopatching, but can be enabled via patch_all(tornado=True) (#204, [docs][
New integrations
4.0+. Currently this integration is ignored by autopatching, but can be enabled via patch_all(tornado=True) (#204, docs -- thanks @ross for reviewing and testing the implementation)Bugfixes
getouterframes(). This is a major improvement that reduces the impact of our tracing calls for Boto2 (#243 -- thanks @wackywendell)func_name work with any callable and not only with functions (#195, #203 -- thanks @m0n5t3r)Breaking change
elasticsearch before executing patch_all(), no traces are created. This patch changed where the PIN object is attached, so you should update your instrumentation as described below (#238)Migrate from 0.7.x to 0.8.0
elasticsearch module while now it uses elasticsearch.Transport. If you were using the Pin to override some tracing settings, you must update your code from:Pin.override(client, service='elasticsearch-traces')
to:
Pin.override(client.transport, service='elasticsearch-traces')
Internals update
wrap() tracer decorator can be extended by Python integrations when the usual approach is not suitable for the given execution context (#221)Read the full changeset.
Add support for boto (>=2.29.0) and botocore (>= 1.4.51) #209 . Currently these integrations are ignored by autopatching, but can be enabled via patch
New integrations
boto (>=2.29.0) and botocore (>= 1.4.51) #209 . Currently these integrations are ignored by autopatching, but can be enabled via patch_all(boto=True, botocore=True)New features
ddtrace-run command-line entrypoint to provide tracing without explicit additions to code. More information here http://pypi.datadoghq.com/trace/docs/#get-started #169Bugfixes
datadog_django app label to avoid clashes with existing app configs #235Add support for asynchronous Python. This is a major improvement that adds support for asyncio, aiohttp and gevent (#161, docs: [asyncio][1] - [aiohtt
New integrations
asyncio, aiohttp and gevent (#161, docs: asyncio - aiohttp - gevent)New features
debug_logging is activated; useful in synchronous environments to detect unfinished/unreported traces (#210)Bugfixes
mysql integration is patched when using patch() or patch_all() (#178)DATADOG_TRACE setting (#159)tracer reference when set_service_info is invoked (#199)Breaking changes
7777 has been replaced with the new 8126 available from Datadog Agent 5.11.0 and above (#212)ThreadLocalSpanBuffer. It has been fully replaced by the Context propagation (#211)Migrate from 0.5.x to 0.6.0
ThreadLocalSpanBuffer manually, you need to use the Context class in your logic so that it is compliant with the Context propagation. Check the Advanced usage section.Advanced usage This is a list of new features that may be used for manual instrumentation when you're using a library or a framework that is not currently supported:
Context propagation instead of a global buffer. This plays well with asynchronous programming where a context switching may happen while handling different logical execution flows (#172)tracer.trace() handles automatically the Context propagation and remains the preferable APItracer.get_call_context() to retrieve the current Context instance that is holding the entire trace for this logical execution (docs)start_span as a way to manually create spans, while handling the Context propagation (docs)Read the full changeset.
ElasticSearch integration takes care of the returning status code in case of a TransportError
Improvements
TransportError (#175)Bugfixes
Span.error attribute if the response is a server error (#176)Read the full changeset.
Nothing published for this version
[ElasticSearch] use ElasticSearch serializer so that the serialization works with dates, decimals and UUIDs #131
Bugfixes
AGENT_PORT because Django recast strings as unicode strings, which invalidate the input for getaddrinfo() in Python 2.7 #140Compatibility
django.contrib.auth is installed through the django.apps module. This improves the best-effort support for Django < 1.7 #136Read the full changeset
Your coding agent can read these notes before it upgrades. Set up the MCP server →