wrapture-instrumentation 1.0.0.dev7__tar.gz → 1.0.0.dev9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. wrapture_instrumentation-1.0.0.dev9/CHANGES.md +399 -0
  2. {wrapture_instrumentation-1.0.0.dev7/src/wrapture_instrumentation.egg-info → wrapture_instrumentation-1.0.0.dev9}/PKG-INFO +44 -14
  3. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/README.md +42 -12
  4. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/TESTING.md +7 -3
  5. wrapture_instrumentation-1.0.0.dev9/demo/database_sqlalchemy.py +183 -0
  6. wrapture_instrumentation-1.0.0.dev9/demo/external_aiohttp.py +142 -0
  7. wrapture_instrumentation-1.0.0.dev9/demo/external_httpx.py +136 -0
  8. wrapture_instrumentation-1.0.0.dev9/demo/external_requests.py +121 -0
  9. wrapture_instrumentation-1.0.0.dev9/demo/external_urllib3.py +145 -0
  10. wrapture_instrumentation-1.0.0.dev9/demo/framework_django.py +188 -0
  11. wrapture_instrumentation-1.0.0.dev9/demo/framework_fastapi.py +151 -0
  12. wrapture_instrumentation-1.0.0.dev9/demo/framework_starlette.py +136 -0
  13. wrapture_instrumentation-1.0.0.dev9/demo/rpc_grpc.py +127 -0
  14. wrapture_instrumentation-1.0.0.dev9/demo/server_aiohttp.py +171 -0
  15. wrapture_instrumentation-1.0.0.dev9/demo/server_uvicorn.py +182 -0
  16. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/server_werkzeug.py +6 -2
  17. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/pyproject.toml +65 -5
  18. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/__init__.py +1 -1
  19. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/database/sqlalchemy/README.md +114 -0
  20. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/database/sqlalchemy/__init__.py +95 -0
  21. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/database/sqlalchemy/dialects.py +42 -0
  22. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/database/sqlalchemy/engine_base.py +73 -0
  23. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/database/sqlalchemy/engine_default.py +181 -0
  24. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/aiohttp_client/README.md +97 -0
  25. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/aiohttp_client/__init__.py +56 -0
  26. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/aiohttp_client/client.py +192 -0
  27. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/httpx/README.md +118 -0
  28. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/httpx/__init__.py +56 -0
  29. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/httpx/_client.py +222 -0
  30. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/requests/README.md +106 -0
  31. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/requests/__init__.py +54 -0
  32. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/requests/sessions.py +215 -0
  33. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/urllib3/README.md +98 -0
  34. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/urllib3/__init__.py +69 -0
  35. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/external/urllib3/pools.py +213 -0
  36. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/django/README.md +137 -0
  37. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/django/__init__.py +135 -0
  38. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/django/common.py +59 -0
  39. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/django/db.py +171 -0
  40. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/django/dispatch.py +83 -0
  41. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/django/exceptions.py +56 -0
  42. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/django/handlers.py +130 -0
  43. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/django/resolvers.py +111 -0
  44. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/django/templates.py +76 -0
  45. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/fastapi/README.md +97 -0
  46. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/fastapi/__init__.py +54 -0
  47. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/fastapi/applications.py +99 -0
  48. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/fastapi/routing.py +111 -0
  49. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/framework/flask/templating.py +3 -1
  50. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/starlette/README.md +93 -0
  51. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/starlette/__init__.py +55 -0
  52. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/starlette/applications.py +105 -0
  53. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/framework/starlette/routing.py +106 -0
  54. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/rpc/__init__.py +2 -0
  55. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/rpc/grpc/README.md +102 -0
  56. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/rpc/grpc/__init__.py +65 -0
  57. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/rpc/grpc/interceptors.py +416 -0
  58. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/server/aiohttp_web/README.md +89 -0
  59. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/server/aiohttp_web/__init__.py +62 -0
  60. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/server/aiohttp_web/web_app.py +192 -0
  61. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/server/aiohttp_web/web_urldispatcher.py +78 -0
  62. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/server/uvicorn/README.md +86 -0
  63. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/server/uvicorn/__init__.py +51 -0
  64. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation/server/uvicorn/config.py +135 -0
  65. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/template/jinja2/environment.py +8 -5
  66. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation.egg-info}/PKG-INFO +44 -14
  67. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation.egg-info/SOURCES.txt +291 -0
  68. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation.egg-info/entry_points.txt +21 -0
  69. wrapture_instrumentation-1.0.0.dev9/src/wrapture_instrumentation.egg-info/requires.txt +1 -0
  70. wrapture_instrumentation-1.0.0.dev9/tests/asgi.py +168 -0
  71. wrapture_instrumentation-1.0.0.dev9/tests/database/sqlalchemy/conftest.py +23 -0
  72. wrapture_instrumentation-1.0.0.dev9/tests/database/sqlalchemy/test_apply_remove.py +83 -0
  73. wrapture_instrumentation-1.0.0.dev9/tests/database/sqlalchemy/test_class.py +79 -0
  74. wrapture_instrumentation-1.0.0.dev9/tests/database/sqlalchemy/test_composition.py +107 -0
  75. wrapture_instrumentation-1.0.0.dev9/tests/database/sqlalchemy/test_recording.py +261 -0
  76. wrapture_instrumentation-1.0.0.dev9/tests/database/sqlalchemy/test_registration.py +95 -0
  77. wrapture_instrumentation-1.0.0.dev9/tests/external/aiohttp_client/conftest.py +48 -0
  78. wrapture_instrumentation-1.0.0.dev9/tests/external/aiohttp_client/test_apply_remove.py +47 -0
  79. wrapture_instrumentation-1.0.0.dev9/tests/external/aiohttp_client/test_class.py +75 -0
  80. wrapture_instrumentation-1.0.0.dev9/tests/external/aiohttp_client/test_composition.py +69 -0
  81. wrapture_instrumentation-1.0.0.dev9/tests/external/aiohttp_client/test_propagation.py +116 -0
  82. wrapture_instrumentation-1.0.0.dev9/tests/external/aiohttp_client/test_recording.py +264 -0
  83. wrapture_instrumentation-1.0.0.dev9/tests/external/aiohttp_client/test_registration.py +84 -0
  84. wrapture_instrumentation-1.0.0.dev9/tests/external/httpx/conftest.py +23 -0
  85. wrapture_instrumentation-1.0.0.dev9/tests/external/httpx/test_apply_remove.py +47 -0
  86. wrapture_instrumentation-1.0.0.dev9/tests/external/httpx/test_async.py +126 -0
  87. wrapture_instrumentation-1.0.0.dev9/tests/external/httpx/test_class.py +69 -0
  88. wrapture_instrumentation-1.0.0.dev9/tests/external/httpx/test_propagation.py +103 -0
  89. wrapture_instrumentation-1.0.0.dev9/tests/external/httpx/test_recording.py +254 -0
  90. wrapture_instrumentation-1.0.0.dev9/tests/external/httpx/test_registration.py +81 -0
  91. wrapture_instrumentation-1.0.0.dev9/tests/external/requests/conftest.py +23 -0
  92. wrapture_instrumentation-1.0.0.dev9/tests/external/requests/test_apply_remove.py +45 -0
  93. wrapture_instrumentation-1.0.0.dev9/tests/external/requests/test_class.py +70 -0
  94. wrapture_instrumentation-1.0.0.dev9/tests/external/requests/test_propagation.py +103 -0
  95. wrapture_instrumentation-1.0.0.dev9/tests/external/requests/test_recording.py +249 -0
  96. wrapture_instrumentation-1.0.0.dev9/tests/external/requests/test_registration.py +82 -0
  97. wrapture_instrumentation-1.0.0.dev9/tests/external/urllib3/conftest.py +23 -0
  98. wrapture_instrumentation-1.0.0.dev9/tests/external/urllib3/test_apply_remove.py +52 -0
  99. wrapture_instrumentation-1.0.0.dev9/tests/external/urllib3/test_class.py +63 -0
  100. wrapture_instrumentation-1.0.0.dev9/tests/external/urllib3/test_composition.py +74 -0
  101. wrapture_instrumentation-1.0.0.dev9/tests/external/urllib3/test_propagation.py +63 -0
  102. wrapture_instrumentation-1.0.0.dev9/tests/external/urllib3/test_recording.py +174 -0
  103. wrapture_instrumentation-1.0.0.dev9/tests/external/urllib3/test_registration.py +76 -0
  104. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/conftest.py +81 -0
  105. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/shop/__init__.py +23 -0
  106. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/shop/models.py +12 -0
  107. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/shop/urls.py +23 -0
  108. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/shop/views.py +80 -0
  109. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/templates/page.html +1 -0
  110. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/test_apply_remove.py +101 -0
  111. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/test_class.py +99 -0
  112. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/test_database.py +163 -0
  113. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/test_registration.py +76 -0
  114. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/test_request_options.py +41 -0
  115. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/test_templating.py +54 -0
  116. wrapture_instrumentation-1.0.0.dev9/tests/framework/django/test_tracing.py +232 -0
  117. wrapture_instrumentation-1.0.0.dev9/tests/framework/fastapi/conftest.py +18 -0
  118. wrapture_instrumentation-1.0.0.dev9/tests/framework/fastapi/shop.py +56 -0
  119. wrapture_instrumentation-1.0.0.dev9/tests/framework/fastapi/test_apply_remove.py +46 -0
  120. wrapture_instrumentation-1.0.0.dev9/tests/framework/fastapi/test_class.py +63 -0
  121. wrapture_instrumentation-1.0.0.dev9/tests/framework/fastapi/test_composition.py +72 -0
  122. wrapture_instrumentation-1.0.0.dev9/tests/framework/fastapi/test_registration.py +74 -0
  123. wrapture_instrumentation-1.0.0.dev9/tests/framework/fastapi/test_request_options.py +43 -0
  124. wrapture_instrumentation-1.0.0.dev9/tests/framework/fastapi/test_tracing.py +166 -0
  125. wrapture_instrumentation-1.0.0.dev9/tests/framework/flask/__init__.py +0 -0
  126. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/framework/flask/test_templating.py +2 -0
  127. wrapture_instrumentation-1.0.0.dev9/tests/framework/starlette/__init__.py +0 -0
  128. wrapture_instrumentation-1.0.0.dev9/tests/framework/starlette/conftest.py +18 -0
  129. wrapture_instrumentation-1.0.0.dev9/tests/framework/starlette/shop.py +50 -0
  130. wrapture_instrumentation-1.0.0.dev9/tests/framework/starlette/test_apply_remove.py +46 -0
  131. wrapture_instrumentation-1.0.0.dev9/tests/framework/starlette/test_class.py +64 -0
  132. wrapture_instrumentation-1.0.0.dev9/tests/framework/starlette/test_composition.py +52 -0
  133. wrapture_instrumentation-1.0.0.dev9/tests/framework/starlette/test_registration.py +74 -0
  134. wrapture_instrumentation-1.0.0.dev9/tests/framework/starlette/test_request_options.py +43 -0
  135. wrapture_instrumentation-1.0.0.dev9/tests/framework/starlette/test_tracing.py +141 -0
  136. wrapture_instrumentation-1.0.0.dev9/tests/rpc/__init__.py +0 -0
  137. wrapture_instrumentation-1.0.0.dev9/tests/rpc/grpc/__init__.py +0 -0
  138. wrapture_instrumentation-1.0.0.dev9/tests/rpc/grpc/conftest.py +69 -0
  139. wrapture_instrumentation-1.0.0.dev9/tests/rpc/grpc/service.py +109 -0
  140. wrapture_instrumentation-1.0.0.dev9/tests/rpc/grpc/test_apply_remove.py +71 -0
  141. wrapture_instrumentation-1.0.0.dev9/tests/rpc/grpc/test_class.py +69 -0
  142. wrapture_instrumentation-1.0.0.dev9/tests/rpc/grpc/test_propagation.py +62 -0
  143. wrapture_instrumentation-1.0.0.dev9/tests/rpc/grpc/test_recording.py +157 -0
  144. wrapture_instrumentation-1.0.0.dev9/tests/rpc/grpc/test_registration.py +103 -0
  145. wrapture_instrumentation-1.0.0.dev9/tests/rpc/grpc/test_server.py +118 -0
  146. wrapture_instrumentation-1.0.0.dev9/tests/server/__init__.py +0 -0
  147. wrapture_instrumentation-1.0.0.dev9/tests/server/aiohttp_web/__init__.py +0 -0
  148. wrapture_instrumentation-1.0.0.dev9/tests/server/aiohttp_web/conftest.py +75 -0
  149. wrapture_instrumentation-1.0.0.dev9/tests/server/aiohttp_web/shop.py +49 -0
  150. wrapture_instrumentation-1.0.0.dev9/tests/server/aiohttp_web/test_apply_remove.py +105 -0
  151. wrapture_instrumentation-1.0.0.dev9/tests/server/aiohttp_web/test_class.py +68 -0
  152. wrapture_instrumentation-1.0.0.dev9/tests/server/aiohttp_web/test_composition.py +55 -0
  153. wrapture_instrumentation-1.0.0.dev9/tests/server/aiohttp_web/test_join.py +49 -0
  154. wrapture_instrumentation-1.0.0.dev9/tests/server/aiohttp_web/test_recording.py +180 -0
  155. wrapture_instrumentation-1.0.0.dev9/tests/server/aiohttp_web/test_registration.py +92 -0
  156. wrapture_instrumentation-1.0.0.dev9/tests/server/uvicorn/__init__.py +0 -0
  157. wrapture_instrumentation-1.0.0.dev9/tests/server/uvicorn/conftest.py +117 -0
  158. wrapture_instrumentation-1.0.0.dev9/tests/server/uvicorn/test_apply_remove.py +86 -0
  159. wrapture_instrumentation-1.0.0.dev9/tests/server/uvicorn/test_class.py +64 -0
  160. wrapture_instrumentation-1.0.0.dev9/tests/server/uvicorn/test_composition.py +101 -0
  161. wrapture_instrumentation-1.0.0.dev9/tests/server/uvicorn/test_recording.py +88 -0
  162. wrapture_instrumentation-1.0.0.dev9/tests/server/uvicorn/test_registration.py +98 -0
  163. wrapture_instrumentation-1.0.0.dev9/tests/server/werkzeug_serving/__init__.py +0 -0
  164. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/werkzeug_serving/conftest.py +5 -1
  165. wrapture_instrumentation-1.0.0.dev9/tests/server/wsgiref_simple_server/__init__.py +0 -0
  166. wrapture_instrumentation-1.0.0.dev9/tests/server/xmlrpc_server/__init__.py +0 -0
  167. wrapture_instrumentation-1.0.0.dev9/tests/template/__init__.py +0 -0
  168. wrapture_instrumentation-1.0.0.dev9/tests/template/jinja2/__init__.py +0 -0
  169. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/template/jinja2/test_rendering.py +8 -0
  170. wrapture_instrumentation-1.0.0.dev9/tests/test_asgi.py +75 -0
  171. wrapture_instrumentation-1.0.0.dev7/CHANGES.md +0 -164
  172. wrapture_instrumentation-1.0.0.dev7/src/wrapture_instrumentation.egg-info/SOURCES.txt +0 -137
  173. wrapture_instrumentation-1.0.0.dev7/src/wrapture_instrumentation.egg-info/entry_points.txt +0 -10
  174. wrapture_instrumentation-1.0.0.dev7/src/wrapture_instrumentation.egg-info/requires.txt +0 -1
  175. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/LICENSE +0 -0
  176. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/MANIFEST.in +0 -0
  177. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/__init__.py +0 -0
  178. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/database_sqlite3.py +0 -0
  179. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/external_http_client.py +0 -0
  180. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/external_urllib_request.py +0 -0
  181. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/external_xmlrpc_client.py +0 -0
  182. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/framework_flask.py +0 -0
  183. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/server_wsgiref.py +0 -0
  184. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/server_xmlrpc.py +0 -0
  185. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/demo/template_jinja2.py +0 -0
  186. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/setup.cfg +0 -0
  187. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/database/__init__.py +0 -0
  188. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/database/sqlite3/README.md +0 -0
  189. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/database/sqlite3/__init__.py +0 -0
  190. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/database/sqlite3/dbapi2.py +0 -0
  191. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/__init__.py +0 -0
  192. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/http_client/README.md +0 -0
  193. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/http_client/__init__.py +0 -0
  194. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/http_client/client.py +0 -0
  195. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/urllib_request/README.md +0 -0
  196. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/urllib_request/__init__.py +0 -0
  197. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/urllib_request/request.py +0 -0
  198. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/xmlrpc_client/README.md +0 -0
  199. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/xmlrpc_client/__init__.py +0 -0
  200. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/external/xmlrpc_client/client.py +0 -0
  201. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/framework/__init__.py +0 -0
  202. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/framework/flask/README.md +0 -0
  203. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/framework/flask/__init__.py +0 -0
  204. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/framework/flask/app.py +0 -0
  205. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/framework/flask/blueprints.py +0 -0
  206. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/framework/flask/common.py +0 -0
  207. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/framework/flask/scaffold.py +0 -0
  208. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/py.typed +0 -0
  209. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/__init__.py +0 -0
  210. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/werkzeug_serving/README.md +0 -0
  211. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/werkzeug_serving/__init__.py +0 -0
  212. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/werkzeug_serving/serving.py +0 -0
  213. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/wsgiref_simple_server/README.md +0 -0
  214. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/wsgiref_simple_server/__init__.py +0 -0
  215. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/wsgiref_simple_server/simple_server.py +0 -0
  216. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/xmlrpc_server/README.md +0 -0
  217. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/xmlrpc_server/__init__.py +0 -0
  218. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/server/xmlrpc_server/server.py +0 -0
  219. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/template/__init__.py +0 -0
  220. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/template/jinja2/README.md +0 -0
  221. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation/template/jinja2/__init__.py +0 -0
  222. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation.egg-info/dependency_links.txt +0 -0
  223. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation.egg-info/not-zip-safe +0 -0
  224. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/src/wrapture_instrumentation.egg-info/top_level.txt +0 -0
  225. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/__init__.py +0 -0
  226. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/conftest.py +0 -0
  227. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/database/__init__.py +0 -0
  228. {wrapture_instrumentation-1.0.0.dev7/tests/database/sqlite3 → wrapture_instrumentation-1.0.0.dev9/tests/database/sqlalchemy}/__init__.py +0 -0
  229. {wrapture_instrumentation-1.0.0.dev7/tests/external → wrapture_instrumentation-1.0.0.dev9/tests/database/sqlite3}/__init__.py +0 -0
  230. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/database/sqlite3/conftest.py +0 -0
  231. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/database/sqlite3/test_apply_remove.py +0 -0
  232. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/database/sqlite3/test_class.py +0 -0
  233. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/database/sqlite3/test_recording.py +0 -0
  234. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/database/sqlite3/test_registration.py +0 -0
  235. {wrapture_instrumentation-1.0.0.dev7/tests/external/http_client → wrapture_instrumentation-1.0.0.dev9/tests/external}/__init__.py +0 -0
  236. {wrapture_instrumentation-1.0.0.dev7/tests/external/urllib_request → wrapture_instrumentation-1.0.0.dev9/tests/external/aiohttp_client}/__init__.py +0 -0
  237. {wrapture_instrumentation-1.0.0.dev7/tests/external/xmlrpc_client → wrapture_instrumentation-1.0.0.dev9/tests/external/http_client}/__init__.py +0 -0
  238. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/http_client/conftest.py +0 -0
  239. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/http_client/test_apply_remove.py +0 -0
  240. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/http_client/test_class.py +0 -0
  241. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/http_client/test_layering.py +0 -0
  242. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/http_client/test_recording.py +0 -0
  243. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/http_client/test_registration.py +0 -0
  244. {wrapture_instrumentation-1.0.0.dev7/tests/framework → wrapture_instrumentation-1.0.0.dev9/tests/external/httpx}/__init__.py +0 -0
  245. {wrapture_instrumentation-1.0.0.dev7/tests/framework/flask → wrapture_instrumentation-1.0.0.dev9/tests/external/requests}/__init__.py +0 -0
  246. {wrapture_instrumentation-1.0.0.dev7/tests/server → wrapture_instrumentation-1.0.0.dev9/tests/external/urllib3}/__init__.py +0 -0
  247. {wrapture_instrumentation-1.0.0.dev7/tests/server/werkzeug_serving → wrapture_instrumentation-1.0.0.dev9/tests/external/urllib_request}/__init__.py +0 -0
  248. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/urllib_request/conftest.py +0 -0
  249. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/urllib_request/test_apply_remove.py +0 -0
  250. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/urllib_request/test_class.py +0 -0
  251. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/urllib_request/test_propagation.py +0 -0
  252. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/urllib_request/test_registration.py +0 -0
  253. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/urllib_request/test_requests.py +0 -0
  254. {wrapture_instrumentation-1.0.0.dev7/tests/server/wsgiref_simple_server → wrapture_instrumentation-1.0.0.dev9/tests/external/xmlrpc_client}/__init__.py +0 -0
  255. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/xmlrpc_client/conftest.py +0 -0
  256. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/xmlrpc_client/test_apply_remove.py +0 -0
  257. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/xmlrpc_client/test_class.py +0 -0
  258. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/xmlrpc_client/test_propagation.py +0 -0
  259. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/xmlrpc_client/test_recording.py +0 -0
  260. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/external/xmlrpc_client/test_registration.py +0 -0
  261. {wrapture_instrumentation-1.0.0.dev7/tests/server/xmlrpc_server → wrapture_instrumentation-1.0.0.dev9/tests/framework}/__init__.py +0 -0
  262. {wrapture_instrumentation-1.0.0.dev7/tests/template → wrapture_instrumentation-1.0.0.dev9/tests/framework/django}/__init__.py +0 -0
  263. {wrapture_instrumentation-1.0.0.dev7/tests/template/jinja2 → wrapture_instrumentation-1.0.0.dev9/tests/framework/fastapi}/__init__.py +0 -0
  264. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/framework/flask/portal.py +0 -0
  265. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/framework/flask/shop.py +0 -0
  266. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/framework/flask/test_apply_remove.py +0 -0
  267. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/framework/flask/test_class.py +0 -0
  268. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/framework/flask/test_lifecycle.py +0 -0
  269. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/framework/flask/test_registration.py +0 -0
  270. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/framework/flask/test_request_options.py +0 -0
  271. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/framework/flask/test_tracing.py +0 -0
  272. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/httpserver.py +0 -0
  273. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/werkzeug_serving/test_apply_remove.py +0 -0
  274. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/werkzeug_serving/test_class.py +0 -0
  275. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/werkzeug_serving/test_composition.py +0 -0
  276. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/werkzeug_serving/test_recording.py +0 -0
  277. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/werkzeug_serving/test_registration.py +0 -0
  278. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/wsgiref_simple_server/conftest.py +0 -0
  279. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/wsgiref_simple_server/test_apply_remove.py +0 -0
  280. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/wsgiref_simple_server/test_class.py +0 -0
  281. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/wsgiref_simple_server/test_composition.py +0 -0
  282. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/wsgiref_simple_server/test_recording.py +0 -0
  283. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/wsgiref_simple_server/test_registration.py +0 -0
  284. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/xmlrpc_server/conftest.py +0 -0
  285. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/xmlrpc_server/test_apply_remove.py +0 -0
  286. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/xmlrpc_server/test_class.py +0 -0
  287. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/xmlrpc_server/test_join.py +0 -0
  288. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/xmlrpc_server/test_recording.py +0 -0
  289. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/server/xmlrpc_server/test_registration.py +0 -0
  290. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/template/jinja2/test_apply_remove.py +0 -0
  291. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/template/jinja2/test_class.py +0 -0
  292. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/template/jinja2/test_registration.py +0 -0
  293. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/template/jinja2/test_with_flask.py +0 -0
  294. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/test_package.py +0 -0
  295. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/test_wsgi.py +0 -0
  296. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/wsgi.py +0 -0
  297. {wrapture_instrumentation-1.0.0.dev7 → wrapture_instrumentation-1.0.0.dev9}/tests/xmlrpcserver.py +0 -0
@@ -0,0 +1,399 @@
1
+ # Changes
2
+
3
+ ## Version 1.0.0
4
+
5
+ In development.
6
+
7
+ - Package layout: the targets are grouped in role directories named
8
+ for their categories (`framework/flask`, `external/urllib_request`,
9
+ `server/xmlrpc_server`), the collection form of the naming
10
+ guidance, a single-target package keeping the flat
11
+ `<category>_<target>` name. Entry point names are unchanged, so
12
+ nothing a config says is affected.
13
+
14
+ - urllib (`urllib.request`, standard library): every request made
15
+ through `urllib.request`, by `urlopen`, `urlretrieve`, a custom opener or
16
+ another standard library module, records as one external leaf on
17
+ `OpenerDirector.open`, carrying the external category's contract
18
+ keys (method, URL without its query string, host, port, path, the
19
+ query with secrets masked, and the status whether returned or
20
+ raised as an `HTTPError`); a redirect is one event named by the
21
+ URL asked for. The trace identity from `wrapture.trace_headers()`
22
+ is added to every request's headers, hop by hop, leaving a header
23
+ the application set alone. The query is recorded through
24
+ `wrapture.capture_query()`, so the built-in sensitive names are
25
+ always masked, the body reduces to its size and the response to
26
+ its type. Three settings: `leaf` (off to see the nested opens and
27
+ anything instrumented beneath) and `propagate`, both on by
28
+ default, and `redact` (query parameters masked by name on top of
29
+ the built-in set). Supports Python 3.12 and later, the standard
30
+ library's version being the interpreter's.
31
+
32
+ - http.client (`http.client`, standard library): the wire layer
33
+ beneath urllib, urllib3 and xmlrpc.client, recorded phase by phase
34
+ as plain events: `connect` nested inside the phase that first
35
+ touched the socket, `putrequest` with the query string masked,
36
+ `endheaders` with the body by size, `getresponse` annotated with
37
+ the status. A debugging aid rather than default instrumentation:
38
+ beneath a higher-level client's leaf event nothing records, so it
39
+ pairs with switching that client to `leaf = false`; standalone
40
+ http.client use records with no switch. One setting: `redact`
41
+ (query parameters masked by name on top of the built-in set). No
42
+ trace propagation at this layer; that belongs to the client above.
43
+ Supports Python 3.12 and later.
44
+
45
+ - xmlrpc.client (`xmlrpc.client`, standard library): every remote
46
+ call through a `ServerProxy` records as one external leaf on the
47
+ proxy's private `ServerProxy.__request` method, the one door they
48
+ all pass through, carrying the external
49
+ contract keys (method `POST`, url, host, port, path, and status:
50
+ 200 for any parsed response, a `Fault` included, or the code a
51
+ `ProtocolError` carries) plus the RPC pair `system` (always
52
+ `xmlrpc`) and the method name as `operation`, which the
53
+ OpenTelemetry export maps to `rpc.system` and `rpc.method`, naming
54
+ the span by the operation.
55
+ The trace identity from `wrapture.trace_headers()` is added to
56
+ every request's headers, leaving one the application supplied
57
+ alone. Hosts and URLs are stripped of basic-auth userinfo,
58
+ arguments reduce to a count, results to a type and bodies to a
59
+ size. Two settings, both on by default: `leaf` (off to see the
60
+ transport event beneath each call, and the `http.client` wire
61
+ phases under that when enabled) and `propagate`. Supports Python
62
+ 3.12 and later.
63
+
64
+ - xmlrpc.server (`xmlrpc.server`, standard library): every XML-RPC
65
+ POST a `SimpleXMLRPCServer` handles records as one request
66
+ boundary, a block labelled `xmlrpc.server` and categorised
67
+ `server` opened around the handler's `do_POST`, carrying `system`
68
+ (`xmlrpc`), the request method, path and client address and the
69
+ response status (200 with a marshalled response, a `Fault`
70
+ included; 404 for a path outside the handler's `rpc_paths`), and
71
+ joining the distributed trace an arriving `traceparent` header
72
+ carries, so both sides of a call between instrumented processes
73
+ share one trace id; the OpenTelemetry export reads the category as
74
+ a SERVER span named access-log style. Every dispatched
75
+ procedure records beneath it on
76
+ `SimpleXMLRPCDispatcher._dispatch`, annotated with the method name
77
+ as `operation`, a `system.multicall` nesting its sub-calls inside
78
+ the batch's own dispatch. Params reduce to a count and results to
79
+ a type; the headers only ever feed the join and are never
80
+ recorded. One setting: `join`, on by default. Supports Python 3.12
81
+ and later.
82
+
83
+ - wsgiref (`wsgiref.simple_server`, standard library): every
84
+ application the server is handed, through `make_server`,
85
+ `set_app` or a subclass, is wrapped in wrapture's recording WSGI
86
+ middleware at the server's own seam, `WSGIServer.get_app`, without
87
+ the application changing at all: one request tree per request,
88
+ named by the application's own module and qualname, carrying
89
+ method, path, the query with secrets masked, scheme, peer and the
90
+ status line, and joining the distributed trace an arriving
91
+ `traceparent` header carries. One boundary per request however
92
+ many layers record: an application already carrying its own
93
+ recording middleware (a Flask application the flask
94
+ instrumentation wrapped) passes the inner one through, and
95
+ framework annotations land on the one event. Removal restores
96
+ `get_app`, un-wrapping servers already running. Two settings:
97
+ `ignore_paths` (path globs whose requests record nothing at all)
98
+ and `redact` (query parameters masked by name on top of the
99
+ built-in set). Supports Python 3.12 and later.
100
+
101
+ - werkzeug (`werkzeug.serving`, werkzeug 3.x): every application
102
+ handed to werkzeug's development server, through `run_simple`,
103
+ `make_server`, a server class directly or Flask's `app.run()`, is
104
+ wrapped in wrapture's recording WSGI middleware as the server is
105
+ built (`BaseWSGIServer.__init__`, the one place the application is
106
+ handed over, werkzeug having no accessor on the request path):
107
+ one request tree per request, named by the application's own
108
+ module and qualname, carrying method, path, the query with
109
+ secrets masked, scheme, peer and the status line, and joining the
110
+ distributed trace an arriving `traceparent` header carries. One
111
+ boundary per request however many layers record, so it composes
112
+ with the flask instrumentation. Removal stops the wrapping for
113
+ servers built afterwards; a server built while instrumented keeps
114
+ its wrapper for its own lifetime. Two settings: `ignore_paths`
115
+ and `redact`, as on the wsgiref target. Supports werkzeug 3.x.
116
+
117
+ - uvicorn (`uvicorn`, uvicorn 0.30+): every application the server
118
+ loads, through `uvicorn.run()`, a `Server` built by hand or
119
+ gunicorn's `UvicornWorker`, is wrapped in wrapture's recording
120
+ ASGI middleware at the server's own seam, `Config.load`, without
121
+ the application changing at all: one request tree per request,
122
+ named by the application's own module and qualname, carrying
123
+ method, path, the query with secrets masked, scheme, peer, the
124
+ status line and the response's streaming shape, and joining the
125
+ distributed trace an arriving `traceparent` header carries. The
126
+ wrap lands inside uvicorn's own middlewares, around the
127
+ application itself, so the event is named by the application and
128
+ the recorded scope is the one the application sees (with proxy
129
+ headers on, uvicorn's default, the client and scheme are the
130
+ forwarded values). One boundary per request however many layers
131
+ record; websocket and lifespan traffic passes through untouched.
132
+ Removal restores `Config.load` for configs loaded afterwards; a
133
+ server already running keeps its wrapper for its own lifetime,
134
+ the werkzeug trade-off at the same kind of seam. Two settings:
135
+ `ignore_paths` and `redact`, as on the WSGI server targets.
136
+ Supports uvicorn 0.30 and later, below 1.0.
137
+
138
+ - sqlite3 (`sqlite3`, standard library): every query and transaction
139
+ boundary records as one database leaf. The connection and cursor
140
+ types are C types no patch can touch, so the `connect` factories
141
+ (both the `sqlite3` and `sqlite3.dbapi2` spellings) are bound and
142
+ each connection comes back wrapped in a recording proxy, cursors
143
+ included, every event labelled with the sqlite3 name it stands
144
+ for. Recorded: the connect, the execute family on cursors and the
145
+ connection's shortcut forms, `commit`, `rollback`, and the
146
+ connection's commit-or-rollback context manager, its exit saying
147
+ which it performed. Every event carries `system` (`sqlite`) and
148
+ `operation` (the SQL's leading keyword, or CONNECT, COMMIT,
149
+ ROLLBACK), the database contract the OpenTelemetry export maps to
150
+ `db.*` attributes. Bound parameters are never recorded; the SQL
151
+ text is recorded only behind the `statement` setting, off by
152
+ default, and reduces to its length otherwise. Fetching is not
153
+ recorded. Supports Python 3.12 and later.
154
+
155
+ - requests (`requests`, requests 2.31+): every request made through
156
+ the module-level helpers, `Session.request` or a `Session.send`
157
+ the application calls itself records as one external leaf on
158
+ `Session.send`, carrying the external category's contract keys
159
+ (method, URL without its query string or userinfo, host, port,
160
+ path, the query with secrets masked, and the status of whatever
161
+ came back: requests answers a 4xx or 5xx with a response, so an
162
+ error status is a status, and an exception is recorded only when
163
+ the exchange really failed). A redirect is one event named by the
164
+ URL asked for, and unless the caller streams, the event covers the
165
+ body download too. The trace identity from
166
+ `wrapture.trace_headers()` is added to every request's headers, a
167
+ redirect hop's copied headers carrying it onward and a header the
168
+ application set itself left alone. The request body is never
169
+ recorded and the response reduces to its type. Three settings, as
170
+ on the urllib target: `leaf`, `propagate` and `redact`. Supports
171
+ requests 2.31 and later in the 2.x line.
172
+
173
+ - FastAPI (`fastapi`, fastapi 0.110+): every request records as one
174
+ tree through wrapture's recording ASGI middleware, installed by
175
+ decorating `FastAPI.__call__`, the starlette target's seam one
176
+ class down, with a per-instance cache of this target's own so the
177
+ two boundaries stack rather than loop when both are applied, the
178
+ outer one recording. `APIRoute.handle` annotates the request event
179
+ with the route's path pattern (an including router's prefix folded
180
+ in) and name, needed in its own right because `APIRoute` builds
181
+ and can dispatch without touching the `Route` seams the starlette
182
+ target patches; `APIRoute.__init__` substitutes observed endpoint
183
+ functions labelled by the route's name, with dependency
184
+ injection, response models and OpenAPI generation reading the
185
+ proxy as the function it wraps, and `include_router()` re-handing
186
+ an observed endpoint back without stacking a second observation.
187
+ A validation failure records as its 422 and an unhandled
188
+ exception lands on the request event beside the 500. Two
189
+ settings: `ignore_paths` and `redact`, as on the starlette
190
+ target. Supports fastapi 0.110 and later, below 1.0.
191
+
192
+ - Starlette (`starlette`, starlette 0.47+): every request records
193
+ as one tree through wrapture's recording ASGI middleware,
194
+ installed by decorating `Starlette.__call__`, the application as a
195
+ server calls it, one cached wrapper per application instance. Once
196
+ routing matches, the request event is annotated with the route's
197
+ path pattern and name (`Route.handle` being the moment both are
198
+ known), the pattern being what the OpenTelemetry export maps to
199
+ `http.route`; a 404 gains no route keys, and a route inside a
200
+ `Mount` annotates the pattern it owns. Every endpoint function is
201
+ observed as its `Route` is built, labelled by the route's name,
202
+ sync and async endpoints alike; class-based endpoints, mounted
203
+ ASGI applications and `functools.partial` endpoints pass through
204
+ untouched. Unhandled exceptions need no extra machinery: starlette
205
+ answers 500 and re-raises, so the request event carries status and
206
+ exception together, while an `HTTPException` records as nothing
207
+ but its status. One boundary per request under an instrumented
208
+ server, the route annotation landing on it. Two settings:
209
+ `ignore_paths` and `redact`, as on the server targets. Supports
210
+ starlette 0.47 and later, below 2.0. The suites drive ASGI
211
+ applications in process through a new tests/asgi.py driver, the
212
+ ASGI counterpart of the WSGI one.
213
+
214
+ - httpx (`httpx`, httpx 0.27+): every request made through the
215
+ module-level helpers, a `Client` or an `AsyncClient` records as
216
+ one external leaf, on `Client.send` or its mirror
217
+ `AsyncClient.send` (the async event recording around the await),
218
+ carrying the same external contract keys as the requests target,
219
+ with the same statuses-not-exceptions rule and the same capture
220
+ policy (query masked, URL userinfo stripped, body never recorded,
221
+ response by type). httpx follows redirects only when asked:
222
+ unasked, the event carries the 3xx the caller saw; followed, the
223
+ hops resolve in a loop inside the one send, so a redirect is one
224
+ event whatever the leaf setting says, and the copied headers carry
225
+ the propagated trace identity on every hop. Unless the caller
226
+ streams, the event covers the body download too. Three settings,
227
+ as on the requests target: `leaf`, `propagate` and `redact`.
228
+ Supports httpx 0.27 and later, below 1.0.
229
+
230
+ - Jinja2 (`jinja2`, Jinja2 3.x): every render traced in all its
231
+ forms, sync, streamed and async, each carrying the template
232
+ category and annotated with the template's own name; the loading
233
+ pipeline
234
+ (`Environment._load_template` on every get_template,
235
+ `Environment.compile` inside a cold load) beneath it, behind a
236
+ `loading` switch; every event named by its patched location as
237
+ `module:qualname`; and the render context, output and template
238
+ source kept out of capture or truncated.
239
+
240
+ - Flask (`flask`, Flask 3.x): every request records as one tree
241
+ through the recording WSGI middleware installed at construction,
242
+ annotated with the matched route pattern and endpoint (the route
243
+ is what wrapture's OpenTelemetry export names the span by, as
244
+ `http.route`); every view
245
+ function is observed as it registers and labelled by its endpoint
246
+ (blueprints and `MethodView`s included); lifecycle callbacks and
247
+ error handlers are observed however they register; and failures
248
+ are noted against the request, whether Flask answered 500 or a
249
+ registered handler absorbed a real exception (an `HTTPException`
250
+ is control flow and is not noted); and template rendering records
251
+ beneath the view that asked for it, carrying the template category,
252
+ named by the spelling the call took (`flask:render_template` or
253
+ `flask.templating:render_template`), capturing the template name
254
+ while the render context and output stay out of capture. Three
255
+ settings switch the optional layers, all on by default:
256
+ `lifecycle`, `handled_errors` and `templates`; two more shape what
257
+ a recorded request carries: `ignore_paths` (path globs whose
258
+ requests record nothing at all, request and everything beneath it
259
+ alike) and `redact`
260
+ (query parameters masked by name on top of the built-in sensitive
261
+ set).
262
+
263
+ - aiohttp client (`aiohttp.client`, aiohttp 3.10+): every outbound
264
+ request made through a `ClientSession`, by the verb helpers,
265
+ `session.request` or a streamed `async with`, records as one
266
+ external leaf on `ClientSession._request`, the one coroutine they
267
+ all pass through, carrying the external category's contract keys
268
+ (method, URL without its query string or userinfo, host, port,
269
+ path, the query with secrets masked, and the status whether
270
+ returned or, for a real connection failure, absent). A followed
271
+ redirect is one event named by the URL asked for: aiohttp resolves
272
+ the hops in a loop inside the one call. The coroutine returns when
273
+ the response headers are in, so the event covers the exchange to
274
+ the response's start, not the body read afterwards. The trace
275
+ identity from `wrapture.trace_headers()` is added to each request's
276
+ headers, leaving a header the application set alone, and aiohttp
277
+ carries them onto every redirect hop, so both sides of a call
278
+ between instrumented processes share one trace id. The request body
279
+ is never recorded and the call's arguments are not captured (the
280
+ signature is wide, and the method and URL are already the event's
281
+ contract keys); query supplied through `params=` rather than in the
282
+ URL is not folded into the recording. Three settings, `leaf` and
283
+ `propagate` on by default and `redact`, as on the other external
284
+ clients. Supports aiohttp 3.10 and later, below 4.
285
+
286
+ - aiohttp (`aiohttp.web`, aiohttp 3.10+): every request an aiohttp
287
+ server handles records as one `server`-categorised request
288
+ boundary opened around the application's own dispatch
289
+ (`Application._handle`, so a sub-application's requests land in
290
+ the one boundary too), carrying method, path, scheme, peer and the
291
+ query with secrets masked, annotated once dispatch has run with
292
+ the matched route's canonical pattern and name (the pattern is
293
+ what the OpenTelemetry export names the SERVER span by, and maps
294
+ to `http.route`) and with the response's status: an
295
+ `HTTPException` is control flow and records as the status it
296
+ answers, while a real failure records as the exception, the
297
+ protocol answering its 500 on its own. The boundary joins the
298
+ distributed trace an arriving `traceparent` header carries, and
299
+ every handler function is observed as its route registers, so each
300
+ dispatch records the handler's call beneath the boundary, labelled
301
+ by the route's name when one was given; class-based views register
302
+ untouched and are named on the boundary only. Three settings:
303
+ `ignore_paths` (path globs whose requests record nothing at all,
304
+ the handler included, the filter evaluated by hand at the block
305
+ boundary through `RequestFilter.matches()`), `join` (on by
306
+ default) and `redact` (query parameters masked by name on top of
307
+ the built-in set). Supports aiohttp 3.10 and later, below 4.
308
+
309
+ - SQLAlchemy (`sqlalchemy`, SQLAlchemy 1.4+): every statement an
310
+ engine executes records as one database leaf at the dialect seam
311
+ every driver sits behind (`DefaultDialect.do_execute` and its
312
+ executemany and no-params siblings, which Core and ORM, sync and
313
+ async engine alike all funnel into; the driver dialects that
314
+ override `do_executemany` with a fast path, psycopg2's and its
315
+ kin, are bound in their own right as their modules load). Each
316
+ event carries the database contract keys `system` (the dialect's
317
+ name) and `operation` (the SQL's leading keyword), plus the
318
+ database, host and port from the engine's URL. The connections
319
+ the pool really opens record as `CONNECT` events with none of
320
+ their arguments captured (they are the driver's credentials), and
321
+ the transaction boundaries record on `Connection`'s commit and
322
+ rollback implementations, the one door every real transaction end
323
+ passes through, which the pool's reset-on-return rollbacks do not
324
+ use. Bound parameters are never recorded; the SQL text reduces to
325
+ its length unless the `statement` setting is on. With an
326
+ instrumented driver beneath (sqlite3), the default `leaf = true`
327
+ keeps the driver's events out of the tree and `leaf = false`
328
+ nests them beneath each statement. Supports SQLAlchemy 1.4 and
329
+ later, below 3.
330
+
331
+ - gRPC (`grpc`, grpcio 1.76+): one instrumentation covers both
332
+ halves, riding gRPC's own interceptor machinery injected at the
333
+ public factories: `insecure_channel` and `secure_channel` hand
334
+ their channel back wrapped with a client interceptor covering all
335
+ four call shapes, and `server()` gets a server interceptor
336
+ prepended. Every RPC a channel makes records as one external leaf
337
+ carrying `system`, `service` and `operation` split from the
338
+ method path (mapped to `rpc.system`, `rpc.service` and
339
+ `rpc.method` by the OpenTelemetry export) plus the channel's host
340
+ and port; an error code is a status, not an exception, and a
341
+ streamed response records the call rather than its consumption,
342
+ the database targets' model. Every RPC a server handles records
343
+ as one `server` boundary spanning the handler's run, a streaming
344
+ handler's whole generator body included, joining the distributed
345
+ trace the metadata carries; an `abort()` is control flow recorded
346
+ as its code with the boundary clean, an escaped exception the
347
+ failure it is, beside the UNKNOWN gRPC answers. The trace
348
+ identity is added to each outgoing call's metadata, one the
349
+ application set left alone. Payloads and metadata values are
350
+ never recorded. Four settings, all on by default: `client`,
351
+ `server`, `propagate` and `join`. grpc.aio is not yet covered.
352
+ Supports grpcio 1.76 and later, below 2.
353
+
354
+ - urllib3 (`urllib3`, urllib3 1.26+): every request made through a
355
+ pool manager, a connection pool or the module-level `urllib3.request`
356
+ records as one external leaf on `urlopen`. The two doors a request
357
+ can enter by (`PoolManager.urlopen`, the redirect-following entry,
358
+ and `HTTPConnectionPool.urlopen` beneath it, the binding on it
359
+ covering `HTTPSConnectionPool`) share one depth count, so a
360
+ request is one event whichever door it entered by, with the
361
+ manager's delegation to a pool, a followed redirect and a retry
362
+ folded in. It carries the external contract keys read from the
363
+ pool instance and the URL together (method, URL without its query
364
+ or userinfo, host, port, path, and the query with secrets masked),
365
+ and the status whether returned or, for a real failure, absent
366
+ with the exception recorded instead. The trace identity from
367
+ `wrapture.trace_headers()` is added to each request's headers,
368
+ hop by hop, leaving a header the application set alone; the body
369
+ is never recorded and the response reduces to its type. Beneath
370
+ the requests leaf urllib3 stays silent (requests does its wire
371
+ work through it); standalone, or with the requests leaf off, it
372
+ records its own. Three settings: `leaf` and `propagate`, both on
373
+ by default, and `redact`. Supports urllib3 1.26 and later, below
374
+ 3.
375
+
376
+ - Django (`django`, Django 4.2+): one instrumentation whose events
377
+ span three categories. Every request records as one tree through
378
+ the recording WSGI or ASGI middleware wrapped around the handler's
379
+ own `__call__` (both transports covered from the shared
380
+ `BaseHandler` dispatch), carrying method, path, redacted query and
381
+ status, joining the trace a `traceparent` header carries, and
382
+ annotated with the matched route pattern (`archive/<int:year>/`,
383
+ exported as `http.route`) and view name, an unmatched 404 left
384
+ unannotated. Every view is observed at URL resolution
385
+ (`ResolverMatch` construction), labelled by its URL pattern name,
386
+ function, class-based and async views alike, one call event per
387
+ view. An unhandled exception is noted on the request beside its
388
+ 500 at Django's own catch-all; `Http404` and friends are their
389
+ statuses, not failures. ORM queries record as database leaves at
390
+ the `CursorWrapper` seam every backend funnels through, carrying
391
+ system, operation, database and, for a server database, host and
392
+ port; commit and rollback record beside them; bound parameters are
393
+ never recorded and the SQL text only behind the `statement`
394
+ setting; `leaf` folds an instrumented driver (sqlite3) beneath a
395
+ query. DTL renders record as template events beneath their views,
396
+ named templates annotated, contexts never captured; Django's
397
+ Jinja2 backend composes with the jinja2 target instead. Six
398
+ settings: `ignore_paths`, `redact`, `queries`, `statement`, `leaf`
399
+ and `templates`. Supports Django 4.2 and later, below 7.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wrapture-instrumentation
3
- Version: 1.0.0.dev7
3
+ Version: 1.0.0.dev9
4
4
  Summary: Instrumentation for common Python packages, applied through wrapture.
5
5
  Author-email: Graham Dumpleton <Graham.Dumpleton@gmail.com>
6
6
  License-Expression: BSD-2-Clause
@@ -17,7 +17,7 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: wrapture>=1.0.0a18
20
+ Requires-Dist: wrapture>=1.0.0a19
21
21
  Dynamic: license-file
22
22
 
23
23
  # wrapture-instrumentation
@@ -29,14 +29,16 @@ wrapture attaches bindings to arbitrary Python call sites without
29
29
  modifying the code being observed, and its config layer can switch on
30
30
  packaged instrumentation for a third-party package by name. This
31
31
  project is the collection of that packaged instrumentation: one
32
- `wrapture.Instrumentation` class per target package (Flask first,
33
- more to follow), each registered under the bare target name, so that
34
- tracing a framework is one config entry and no code.
32
+ `wrapture.Instrumentation` class per target package, each registered
33
+ under the bare target name, so that tracing a framework is one config
34
+ entry and no code.
35
35
 
36
36
  > **Status: pre-alpha.** The package is being built target by target
37
37
  > against wrapture's alpha series, with development releases published
38
- > to [PyPI](https://pypi.org/project/wrapture-instrumentation/). Flask
39
- > is the first target and covers its basics; see the table below.
38
+ > to [PyPI](https://pypi.org/project/wrapture-instrumentation/). The
39
+ > table below lists what is covered so far, from web frameworks and
40
+ > the servers that carry them to HTTP clients, databases and template
41
+ > engines.
40
42
 
41
43
  ## Installation
42
44
 
@@ -70,8 +72,12 @@ $ python -m wrapture -m myapp
70
72
 
71
73
  The same config works through
72
74
  [autowrapt](https://github.com/GrahamDumpleton/autowrapt) injection
73
- (`AUTOWRAPT_BOOTSTRAP=wrapture python myapp.py`) and, in a test,
74
- through `wrapture.instrumentation("flask")` scoping the
75
+ (`AUTOWRAPT_BOOTSTRAP=wrapture python myapp.py`); through
76
+ [manual setup](https://wrapture.readthedocs.io/en/latest/manual-setup.html),
77
+ a few lines in the application's own startup applying the config
78
+ where wrapping the launch from outside is awkward (an embedded
79
+ interpreter, gunicorn and other multi-process managers); and, in a
80
+ test, through `wrapture.instrumentation("flask")` scoping the
75
81
  instrumentation to a block. The
76
82
  [ad-hoc tracing guide](https://wrapture.readthedocs.io/en/latest/ad-hoc-tracing.html)
77
83
  covers the config file itself.
@@ -94,15 +100,26 @@ $ python -m wrapture.tools instrumentation --toml
94
100
 
95
101
  | Target | Supported versions | Records | Settings |
96
102
  | ------ | ------------------ | ------- | -------- |
103
+ | [`aiohttp.client`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/external/aiohttp_client/README.md) | aiohttp 3.10+ (3.x) | Every outbound request through a `ClientSession` (the verb helpers, `session.request`, a streamed `async with`) as one external leaf on `_request` carrying method, URL, host, port, path, query and status (an error status is a status, not an exception); a followed redirect one event resolved inside it; the trace identity propagated hop by hop; the query and any URL credentials masked, the body never recorded. | `leaf`, `propagate`, `redact` |
104
+ | [`aiohttp.web`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/server/aiohttp_web/README.md) | aiohttp 3.10+ (3.x) | Every request an aiohttp server handles as one `server`-categorised request boundary carrying method, path, scheme, peer and redacted query, annotated with the matched route pattern (a sub-application's prefix folded in, exported as `http.route`) and status (an `HTTPException` is its status, not a failure), joining the trace a `traceparent` header carries; every registered handler function observed as its route is built and recorded beneath the boundary, labelled by the route's name. | `ignore_paths`, `join`, `redact` |
105
+ | [`django`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/framework/django/README.md) | Django 4.2+ (below 7.0) | Every request as one tree through the recording WSGI or ASGI middleware on the handler's own `__call__`, annotated with the matched route pattern and view name (the pattern exported as `http.route`); every view observed at URL resolution and labelled by its URL name, function, class-based and async views alike; ORM queries and transaction ends as database leaves at the cursor seam carrying system, operation and database, bound parameters never recorded and the SQL text only behind a setting; DTL renders as template events beneath their views, contexts never captured; unhandled failures noted on the request beside the 500 (an `Http404` is its status, not a failure). | `ignore_paths`, `redact`, `queries`, `statement`, `leaf`, `templates` |
106
+ | [`fastapi`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/framework/fastapi/README.md) | fastapi 0.110+ (below 1.0) | Every request as one tree through the recording ASGI middleware on the application's own `__call__`, annotated with the matched route pattern (router prefixes folded in) and name, the pattern exported as `http.route`; every endpoint function observed as its `APIRoute` is built, labelled by the route's name, dependency injection and response models undisturbed; validation failures record as their 422, unhandled failures on the request event beside the 500. | `ignore_paths`, `redact` |
97
107
  | [`flask`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/framework/flask/README.md) | Flask 3.x | Every request as one tree, annotated with route and endpoint; every view observed and labelled by endpoint; template renders beneath their views; handled and unhandled failures noted on the request. | `ignore_paths`, `redact`, `lifecycle`, `handled_errors`, `templates` |
108
+ | [`grpc`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/rpc/grpc/README.md) | grpcio 1.76+ (1.x) | Every RPC a channel makes, all four call shapes, as one external leaf through an injected client interceptor, carrying the rpc system, service and method, host, port and status code (an error code is a status, not an exception; a streamed response records the call, its consumption deliberately not tracked); every RPC a server handles as one `server` boundary through an injected server interceptor spanning the handler's run (a streaming handler's whole body), joining the trace the metadata carries; an abort is its code with the boundary clean, an escaped exception the failure it is; payloads and metadata never recorded. | `client`, `server`, `propagate`, `join` |
109
+ | [`http.client`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/external/http_client/README.md) | Python 3.12+ (standard library) | The wire phases of each exchange (connect where the socket really opens, the request line with its query masked, headers and body out by size, the response wait with its status) as plain events. A debugging aid: beneath an instrumented higher-level client nothing records until that client is switched to `leaf = false`. | `redact` |
110
+ | [`httpx`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/external/httpx/README.md) | httpx 0.27+ (below 1.0) | Every request through the module-level helpers, a `Client` or an `AsyncClient`, sync and async alike, as one external leaf on `send` carrying method, URL, host, port, path, query and status (an error status is a status, not an exception); a followed redirect one event resolved inside it; the trace identity propagated hop by hop; the query and any URL credentials masked, the body never recorded. | `leaf`, `propagate`, `redact` |
98
111
  | [`jinja2`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/template/jinja2/README.md) | Jinja2 3.x | Every render traced in all its forms (sync, async, streamed), annotated with the template name; the loading and compile pipeline beneath it; context and output kept out of capture. | `loading` |
112
+ | [`requests`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/external/requests/README.md) | requests 2.31+ (2.x) | Every request through the module-level helpers, `Session.request` or `Session.send` itself as one external leaf carrying method, URL, host, port, path, query and status (an error status is a status, not an exception); a redirect one leaf named by the URL asked for; the trace identity propagated hop by hop; the query and any URL credentials masked, the body never recorded. | `leaf`, `propagate`, `redact` |
113
+ | [`sqlalchemy`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/database/sqlalchemy/README.md) | SQLAlchemy 1.4+ (below 3.0) | Every statement an engine executes, Core and ORM, sync and async alike, as one database leaf at the dialect seam every driver sits behind, carrying the system, the SQL's leading keyword as the operation and the database; the connections the pool really opens and the transaction boundaries recorded the same way, the pool's own reset rollbacks excluded; bound parameters and credentials never recorded, the SQL text only behind a setting. | `leaf`, `statement` |
114
+ | [`sqlite3`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/database/sqlite3/README.md) | Python 3.12+ (standard library) | Every query and transaction boundary as one database leaf, through recording proxies around the connections `connect` hands out, carrying the system and the SQL's leading keyword as the operation; bound parameters never recorded, the SQL text only behind a setting. | `statement` |
115
+ | [`starlette`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/framework/starlette/README.md) | starlette 0.47+ (below 2.0) | Every request as one tree through the recording ASGI middleware on the application's own `__call__`, annotated with the matched route pattern and name (the pattern is what the OpenTelemetry export names the span by, as `http.route`); every endpoint function observed as its route is built, labelled by the route's name, sync and async alike; unhandled failures on the request event beside the 500. | `ignore_paths`, `redact` |
99
116
  | [`urllib.request`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/external/urllib_request/README.md) | Python 3.12+ (standard library) | Every request through `urllib.request` as one external leaf carrying method, URL, host, port, path, query and status; the trace identity propagated in its headers; the query recorded with secrets masked, the body and response kept out of capture. | `leaf`, `propagate`, `redact` |
100
- | [`http.client`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/external/http_client/README.md) | Python 3.12+ (standard library) | The wire phases of each exchange (connect where the socket really opens, the request line with its query masked, headers and body out by size, the response wait with its status) as plain events. A debugging aid: beneath an instrumented higher-level client nothing records until that client is switched to `leaf = false`. | `redact` |
117
+ | [`urllib3`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/external/urllib3/README.md) | urllib3 1.26+ (below 3.0) | Every request through a pool manager, a connection pool or the module-level helper as one external leaf on `urlopen` (both doors sharing one depth count, so a redirect, a retry and the manager's delegation to a pool fold into it) carrying method, URL, host, port, path, query and status (an error status is a status, not an exception); the trace identity propagated in the headers; the query and any URL credentials masked, the body never recorded. Beneath the requests leaf it stays silent; standalone it records its own. | `leaf`, `propagate`, `redact` |
118
+ | [`uvicorn`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/server/uvicorn/README.md) | uvicorn 0.30+ (below 1.0) | Every application the server loads wrapped in the recording ASGI middleware at uvicorn's own seam, inside its proxy-headers middleware: one request tree per request, named by the application, with method, path, redacted query, status and streaming shape, joining the trace a `traceparent` header carries; an application's own recording middleware still records one boundary per request. | `ignore_paths`, `redact` |
119
+ | [`werkzeug.serving`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/server/werkzeug_serving/README.md) | werkzeug 3.x | Every application handed to werkzeug's development server (Flask's `app.run()` included) wrapped in the recording WSGI middleware as the server is built: one request tree per request with method, path, redacted query and status, joining the trace a `traceparent` header carries; a framework's own recording middleware still records one boundary per request. | `ignore_paths`, `redact` |
120
+ | [`wsgiref.simple_server`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/server/wsgiref_simple_server/README.md) | Python 3.12+ (standard library) | Every application the server is handed wrapped in the recording WSGI middleware at the server's own seam: one request tree per request with method, path, redacted query and status, joining the trace a `traceparent` header carries; an application already recording (a framework's own middleware) still records one boundary per request. | `ignore_paths`, `redact` |
101
121
  | [`xmlrpc.client`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/external/xmlrpc_client/README.md) | Python 3.12+ (standard library) | Every remote call through a `ServerProxy` as one external leaf carrying the RPC system and method name, URL, host, port, path and status (a `Fault` is a 200, a `ProtocolError` its code); the trace identity propagated in its headers; credentials, arguments, results and bodies kept out of capture. | `leaf`, `propagate` |
102
122
  | [`xmlrpc.server`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/server/xmlrpc_server/README.md) | Python 3.12+ (standard library) | Every XML-RPC POST a `SimpleXMLRPCServer` handles as one `server`-categorised request boundary carrying method, path, client and status, joining the distributed trace an arriving `traceparent` header carries; each dispatched procedure beneath it with the method name as `operation`, multicall sub-calls nested; params and results reduced to counts and types. | `join` |
103
- | [`wsgiref.simple_server`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/server/wsgiref_simple_server/README.md) | Python 3.12+ (standard library) | Every application the server is handed wrapped in the recording WSGI middleware at the server's own seam: one request tree per request with method, path, redacted query and status, joining the trace a `traceparent` header carries; an application already recording (a framework's own middleware) still records one boundary per request. | `ignore_paths`, `redact` |
104
- | [`werkzeug.serving`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/server/werkzeug_serving/README.md) | werkzeug 3.x | Every application handed to werkzeug's development server (Flask's `app.run()` included) wrapped in the recording WSGI middleware as the server is built: one request tree per request with method, path, redacted query and status, joining the trace a `traceparent` header carries; a framework's own recording middleware still records one boundary per request. | `ignore_paths`, `redact` |
105
- | [`sqlite3`](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/src/wrapture_instrumentation/database/sqlite3/README.md) | Python 3.12+ (standard library) | Every query and transaction boundary as one database leaf, through recording proxies around the connections `connect` hands out, carrying the system and the SQL's leading keyword as the operation; bound parameters never recorded, the SQL text only behind a setting. | `statement` |
106
123
 
107
124
  The entry point name is the config's `name`; the table summarizes
108
125
  each instrumentation, and the linked per-target README is its full
@@ -111,6 +128,15 @@ settings, and what is deliberately not traced. Settings, further
111
128
  choke points and wider version ranges are being added target by
112
129
  target.
113
130
 
131
+ This package deliberately covers only the standard library and
132
+ third-party packages that can be exercised in-process, with no
133
+ separate backend product or service needed to test against.
134
+ Instrumentation for targets that do need one (a real PostgreSQL,
135
+ MySQL or Redis to speak to, and their driver packages) will be
136
+ provided as separate self-contained packages, one per
137
+ product/service, each carrying its own test arrangements and release
138
+ cadence. No such packages exist yet; they are coming.
139
+
114
140
  ## Adding a target
115
141
 
116
142
  Each target lives under `src/wrapture_instrumentation/` in a role
@@ -133,6 +159,9 @@ wrapture the instrumentation mostly uses:
133
159
 
134
160
  - `task/`: task queues. `messaging/`: brokers and their clients.
135
161
 
162
+ - `rpc/`: RPC frameworks whose one package covers both the client
163
+ and the server side.
164
+
136
165
  - `server/`: servers handling inbound requests, WSGI and ASGI
137
166
  servers included.
138
167
 
@@ -164,4 +193,5 @@ here covers the tests.
164
193
 
165
194
  ## License
166
195
 
167
- BSD-2-Clause, as wrapture.
196
+ BSD 2-Clause. See
197
+ [LICENSE](https://github.com/GrahamDumpleton/wrapture-instrumentation/blob/develop/LICENSE).