{ "info": { "author": "Florimond Manca", "author_email": "florimond.manca@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8" ], "description": "# ddtrace-asgi\n\n[![Build Status](https://travis-ci.com/florimondmanca/ddtrace-asgi.svg?branch=master)](https://travis-ci.com/florimondmanca/ddtrace-asgi)\n[![Coverage](https://codecov.io/gh/florimondmanca/ddtrace-asgi/branch/master/graph/badge.svg)](https://codecov.io/gh/florimondmanca/ddtrace-asgi)\n[![Package version](https://badge.fury.io/py/ddtrace-asgi.svg)](https://pypi.org/project/ddtrace-asgi)\n\nUnofficial `ddtrace` integration for ASGI apps and frameworks.\n\nShould work seamlessly for any ASGI web framework, e.g. Starlette, FastAPI, Quart, etc.\n\n**Note**: This project is in alpha stage.\n\n## Requirements\n\n- Python 3.6+.\n- [`ddtrace`](https://github.com/DataDog/dd-trace-py) must be installed to use the `ddtrace-run` command.\n- The [Datadog Agent](https://docs.datadoghq.com/agent/) must be installed and running for traces to be effectively sent to Datadog APM.\n\n## Installation\n\n```bash\npip install ddtrace-asgi\n```\n\n## Quickstart\n\nTo automatically send traces to [Datadog APM](https://docs.datadoghq.com/tracing/) on each HTTP request, wrap your ASGI application around `TraceMiddleware`:\n\n```python\n# app.py\nfrom ddtrace_asgi.middleware import TraceMiddleware\n\nasync def app(scope, receive, send):\n assert scope[\"type\"] == \"http\"\n headers = [[b\"content-type\", b\"text/plain\"]]\n await send({\"type\": \"http.response.start\", \"status\": 200, \"headers\": headers})\n await send({\"type\": \"http.response.body\", \"body\": b\"Hello, world!\"})\n\napp = TraceMiddleware(\n app, service=\"asgi-hello-world\", tags={\"env\": \"local\"},\n)\n```\n\nThen use `ddtrace-run` when serving your application. For example, if serving with Uvicorn:\n\n```bash\nddtrace-run uvicorn app:app\n```\n\nFor more information on using `ddtrace`, please see the official [`dd-trace-py`](https://github.com/DataDog/dd-trace-py) repository.\n\n## Examples\n\n### Starlette\n\n```python\nfrom ddtrace_asgi.middleware import TraceMiddleware\nfrom starlette.applications import Starlette\n\napp = Starlette()\napp.add_middleware(TraceMiddleware, service=\"my-starlette-app\")\n```\n\n### FastAPI\n\n```python\nfrom ddtrace_asgi.middleware import TraceMiddleware\nfrom fastapi import FastAPI\n\napp = FastAPI()\napp.add_middleware(TraceMiddleware, service=\"my-fastapi-app\")\n```\n\n## API Reference\n\n### `TracingMiddleware`\n\n```python\nclass TracingMiddleware:\n def __init__(self, app, tracer=None, service=\"asgi\", tags=None, distributed_tracing=True):\n ...\n```\n\nAn ASGI middleware that sends traces of HTTP requests to Datadog APM.\n\n**Parameters**\n\n- **app** - An [ASGI] application.\n- **tracer** - _(optional)_ A [`Tracer`](http://pypi.datadoghq.com/trace/docs/advanced_usage.html#tracer) object. Defaults to the global `ddtrace.tracer` object.\n- **service** - _(optional)_ Name of the service as it will appear on Datadog.\n- **tags** - _(optional)_ Default tags attached to all request spans. Either a dictionary, or a string of comma-separated tags (e.g. `\"env:staging, app:shop\"`). See also [Tagging](https://docs.datadoghq.com/tagging/).\n- **distributed_tracing** - _(optional)_ Whether to enable [distributed tracing](http://pypi.datadoghq.com/trace/docs/advanced_usage.html#distributed-tracing).\n\n\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).\n\n## 0.3.0 - 2019-11-15\n\n### Added\n\n- Allow to set default tags on all request spans. (Pull #24)\n\n## 0.2.2 - 2019-11-03\n\n### Added\n\n- Now ships with binary distribution (wheel) in addition to source distribution (sdist). (Pull #16)\n\n## 0.2.1 - 2019-10-31\n\n### Fixed\n\n- Improve resilience to ASGI protocol violations. (Pull #11)\n\n## 0.2.0 - 2019-10-30\n\n### Changed\n\n- The `tracer`, `service` and `distributed_tracing` parameters of `TraceMiddleware` are now keyword-only. (Pull #10)\n\n### Added\n\n- The `tracer` for `TraceMiddleware` is now the global `ddtrace.tracer` by default. (Pull #10)\n\n## 0.1.0 - 2019-10-23\n\nInitial release.\n\n### Added\n\n- Add `TracingMiddleware`.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/florimondmanca/ddtrace-asgi", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "ddtrace-asgi", "package_url": "https://pypi.org/project/ddtrace-asgi/", "platform": "", "project_url": "https://pypi.org/project/ddtrace-asgi/", "project_urls": { "Homepage": "http://github.com/florimondmanca/ddtrace-asgi" }, "release_url": "https://pypi.org/project/ddtrace-asgi/0.3.0/", "requires_dist": [ "ddtrace", "starlette (==0.*)" ], "requires_python": ">=3.6", "summary": "Unofficial ddtrace integration for ASGI apps and frameworks", "version": "0.3.0", "yanked": false, "yanked_reason": null }, "last_serial": 6144799, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "95a19d15689cd41b08fd351056f47ba5", "sha256": "1e09b41bd8a19055aa59d077e69aecd780523f668dedb337cacc59a4010da7d2" }, "downloads": -1, "filename": "ddtrace-asgi-0.1.0.tar.gz", "has_sig": false, "md5_digest": "95a19d15689cd41b08fd351056f47ba5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5122, "upload_time": "2019-10-23T20:28:10", "upload_time_iso_8601": "2019-10-23T20:28:10.466336Z", "url": "https://files.pythonhosted.org/packages/72/37/0ba569a2cd8b970159cdd8a5729f059bad2b3513441f5d763b63c0d3fb74/ddtrace-asgi-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "051d15db8d23d59c9568b924100787af", "sha256": "4c062dac767badec731b72fb2dd7aa4858f215599a5a23fede14f051b74cb26f" }, "downloads": -1, "filename": "ddtrace-asgi-0.2.0.tar.gz", "has_sig": false, "md5_digest": "051d15db8d23d59c9568b924100787af", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5584, "upload_time": "2019-10-30T21:01:57", "upload_time_iso_8601": "2019-10-30T21:01:57.844534Z", "url": "https://files.pythonhosted.org/packages/ff/32/773a156814ab9e4330ab67c33c72503747f78b7b7c216ced5733164c704a/ddtrace-asgi-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "6edde4e858c5e3984c77a4e4e1dd0f44", "sha256": "d42276d1ac41357478a06d6773d1b7ed97e03d2d3c5da640f4d6a945044d6152" }, "downloads": -1, "filename": "ddtrace-asgi-0.2.1.tar.gz", "has_sig": false, "md5_digest": "6edde4e858c5e3984c77a4e4e1dd0f44", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5840, "upload_time": "2019-10-30T23:41:47", "upload_time_iso_8601": "2019-10-30T23:41:47.484385Z", "url": "https://files.pythonhosted.org/packages/1b/ff/106ae97d5b2550b0d51fc52fe97e8d1fa1744329559436ea6f60ed0374a2/ddtrace-asgi-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "af966750a269b89f3e5c828d15721689", "sha256": "57b9d002c0831ee7b4b016de7bca734cf3ba4b7d59a6fa93784f30c389b849f2" }, "downloads": -1, "filename": "ddtrace_asgi-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "af966750a269b89f3e5c828d15721689", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 5640, "upload_time": "2019-11-03T15:56:20", "upload_time_iso_8601": "2019-11-03T15:56:20.162644Z", "url": "https://files.pythonhosted.org/packages/89/27/0e600a1e75167774121c59b93ccc6d997f0de26b4ca1847bad58fea9ee5f/ddtrace_asgi-0.2.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "db504b1021c7851694927667ed3521bd", "sha256": "f9c8d9be37d11d4992f8cf86bc0d1d15faf7bf5bd090677450b09649c1b88dc4" }, "downloads": -1, "filename": "ddtrace-asgi-0.2.2.tar.gz", "has_sig": false, "md5_digest": "db504b1021c7851694927667ed3521bd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 6730, "upload_time": "2019-11-03T15:56:21", "upload_time_iso_8601": "2019-11-03T15:56:21.985602Z", "url": "https://files.pythonhosted.org/packages/39/42/1914b6f99f9a38849d18b82f49dbdc0ce66326676317061a7b0f3c91c9f0/ddtrace-asgi-0.2.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "0974f54cfc133191638e12213f0e3071", "sha256": "1628c8e3bcdbfba2cbfb879c2eae7710b147a22c913f9c7f7e634b7ae0aba71a" }, "downloads": -1, "filename": "ddtrace_asgi-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0974f54cfc133191638e12213f0e3071", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 5993, "upload_time": "2019-11-15T20:16:30", "upload_time_iso_8601": "2019-11-15T20:16:30.096906Z", "url": "https://files.pythonhosted.org/packages/79/39/03f23cf30c24ed410f3d6e746b5b5800fb2d0948aaaf2e5d0690993a7eba/ddtrace_asgi-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b982059b4d1b98b31437cbf57c615bd7", "sha256": "424f3847eb4ad57897ad2c92c737365d0c5157bb9b6f21fafc74f975c235ff21" }, "downloads": -1, "filename": "ddtrace-asgi-0.3.0.tar.gz", "has_sig": false, "md5_digest": "b982059b4d1b98b31437cbf57c615bd7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7201, "upload_time": "2019-11-15T20:16:31", "upload_time_iso_8601": "2019-11-15T20:16:31.539075Z", "url": "https://files.pythonhosted.org/packages/ff/c1/646ebf480dc528000cf432d4f3598eb07503684cc495eddce16b755b9223/ddtrace-asgi-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0974f54cfc133191638e12213f0e3071", "sha256": "1628c8e3bcdbfba2cbfb879c2eae7710b147a22c913f9c7f7e634b7ae0aba71a" }, "downloads": -1, "filename": "ddtrace_asgi-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0974f54cfc133191638e12213f0e3071", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 5993, "upload_time": "2019-11-15T20:16:30", "upload_time_iso_8601": "2019-11-15T20:16:30.096906Z", "url": "https://files.pythonhosted.org/packages/79/39/03f23cf30c24ed410f3d6e746b5b5800fb2d0948aaaf2e5d0690993a7eba/ddtrace_asgi-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b982059b4d1b98b31437cbf57c615bd7", "sha256": "424f3847eb4ad57897ad2c92c737365d0c5157bb9b6f21fafc74f975c235ff21" }, "downloads": -1, "filename": "ddtrace-asgi-0.3.0.tar.gz", "has_sig": false, "md5_digest": "b982059b4d1b98b31437cbf57c615bd7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 7201, "upload_time": "2019-11-15T20:16:31", "upload_time_iso_8601": "2019-11-15T20:16:31.539075Z", "url": "https://files.pythonhosted.org/packages/ff/c1/646ebf480dc528000cf432d4f3598eb07503684cc495eddce16b755b9223/ddtrace-asgi-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }