sentry-sdk 0.18.0__py2.py3-none-any.whl → 2.46.0__py2.py3-none-any.whl

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 (193) hide show
  1. sentry_sdk/__init__.py +48 -6
  2. sentry_sdk/_compat.py +64 -56
  3. sentry_sdk/_init_implementation.py +84 -0
  4. sentry_sdk/_log_batcher.py +172 -0
  5. sentry_sdk/_lru_cache.py +47 -0
  6. sentry_sdk/_metrics_batcher.py +167 -0
  7. sentry_sdk/_queue.py +81 -19
  8. sentry_sdk/_types.py +311 -11
  9. sentry_sdk/_werkzeug.py +98 -0
  10. sentry_sdk/ai/__init__.py +7 -0
  11. sentry_sdk/ai/monitoring.py +137 -0
  12. sentry_sdk/ai/utils.py +144 -0
  13. sentry_sdk/api.py +409 -67
  14. sentry_sdk/attachments.py +75 -0
  15. sentry_sdk/client.py +849 -103
  16. sentry_sdk/consts.py +1389 -34
  17. sentry_sdk/crons/__init__.py +10 -0
  18. sentry_sdk/crons/api.py +62 -0
  19. sentry_sdk/crons/consts.py +4 -0
  20. sentry_sdk/crons/decorator.py +135 -0
  21. sentry_sdk/debug.py +12 -15
  22. sentry_sdk/envelope.py +112 -61
  23. sentry_sdk/feature_flags.py +71 -0
  24. sentry_sdk/hub.py +442 -386
  25. sentry_sdk/integrations/__init__.py +228 -58
  26. sentry_sdk/integrations/_asgi_common.py +108 -0
  27. sentry_sdk/integrations/_wsgi_common.py +131 -40
  28. sentry_sdk/integrations/aiohttp.py +221 -72
  29. sentry_sdk/integrations/anthropic.py +439 -0
  30. sentry_sdk/integrations/argv.py +4 -6
  31. sentry_sdk/integrations/ariadne.py +161 -0
  32. sentry_sdk/integrations/arq.py +247 -0
  33. sentry_sdk/integrations/asgi.py +237 -135
  34. sentry_sdk/integrations/asyncio.py +144 -0
  35. sentry_sdk/integrations/asyncpg.py +208 -0
  36. sentry_sdk/integrations/atexit.py +13 -18
  37. sentry_sdk/integrations/aws_lambda.py +233 -80
  38. sentry_sdk/integrations/beam.py +27 -35
  39. sentry_sdk/integrations/boto3.py +137 -0
  40. sentry_sdk/integrations/bottle.py +91 -69
  41. sentry_sdk/integrations/celery/__init__.py +529 -0
  42. sentry_sdk/integrations/celery/beat.py +293 -0
  43. sentry_sdk/integrations/celery/utils.py +43 -0
  44. sentry_sdk/integrations/chalice.py +35 -28
  45. sentry_sdk/integrations/clickhouse_driver.py +177 -0
  46. sentry_sdk/integrations/cloud_resource_context.py +280 -0
  47. sentry_sdk/integrations/cohere.py +274 -0
  48. sentry_sdk/integrations/dedupe.py +32 -8
  49. sentry_sdk/integrations/django/__init__.py +343 -89
  50. sentry_sdk/integrations/django/asgi.py +201 -22
  51. sentry_sdk/integrations/django/caching.py +204 -0
  52. sentry_sdk/integrations/django/middleware.py +80 -32
  53. sentry_sdk/integrations/django/signals_handlers.py +91 -0
  54. sentry_sdk/integrations/django/templates.py +69 -2
  55. sentry_sdk/integrations/django/transactions.py +39 -14
  56. sentry_sdk/integrations/django/views.py +69 -16
  57. sentry_sdk/integrations/dramatiq.py +226 -0
  58. sentry_sdk/integrations/excepthook.py +19 -13
  59. sentry_sdk/integrations/executing.py +5 -6
  60. sentry_sdk/integrations/falcon.py +128 -65
  61. sentry_sdk/integrations/fastapi.py +141 -0
  62. sentry_sdk/integrations/flask.py +114 -75
  63. sentry_sdk/integrations/gcp.py +67 -36
  64. sentry_sdk/integrations/gnu_backtrace.py +14 -22
  65. sentry_sdk/integrations/google_genai/__init__.py +301 -0
  66. sentry_sdk/integrations/google_genai/consts.py +16 -0
  67. sentry_sdk/integrations/google_genai/streaming.py +155 -0
  68. sentry_sdk/integrations/google_genai/utils.py +576 -0
  69. sentry_sdk/integrations/gql.py +162 -0
  70. sentry_sdk/integrations/graphene.py +151 -0
  71. sentry_sdk/integrations/grpc/__init__.py +168 -0
  72. sentry_sdk/integrations/grpc/aio/__init__.py +7 -0
  73. sentry_sdk/integrations/grpc/aio/client.py +95 -0
  74. sentry_sdk/integrations/grpc/aio/server.py +100 -0
  75. sentry_sdk/integrations/grpc/client.py +91 -0
  76. sentry_sdk/integrations/grpc/consts.py +1 -0
  77. sentry_sdk/integrations/grpc/server.py +66 -0
  78. sentry_sdk/integrations/httpx.py +178 -0
  79. sentry_sdk/integrations/huey.py +174 -0
  80. sentry_sdk/integrations/huggingface_hub.py +378 -0
  81. sentry_sdk/integrations/langchain.py +1132 -0
  82. sentry_sdk/integrations/langgraph.py +337 -0
  83. sentry_sdk/integrations/launchdarkly.py +61 -0
  84. sentry_sdk/integrations/litellm.py +287 -0
  85. sentry_sdk/integrations/litestar.py +315 -0
  86. sentry_sdk/integrations/logging.py +261 -85
  87. sentry_sdk/integrations/loguru.py +213 -0
  88. sentry_sdk/integrations/mcp.py +566 -0
  89. sentry_sdk/integrations/modules.py +6 -33
  90. sentry_sdk/integrations/openai.py +725 -0
  91. sentry_sdk/integrations/openai_agents/__init__.py +61 -0
  92. sentry_sdk/integrations/openai_agents/consts.py +1 -0
  93. sentry_sdk/integrations/openai_agents/patches/__init__.py +5 -0
  94. sentry_sdk/integrations/openai_agents/patches/agent_run.py +140 -0
  95. sentry_sdk/integrations/openai_agents/patches/error_tracing.py +77 -0
  96. sentry_sdk/integrations/openai_agents/patches/models.py +50 -0
  97. sentry_sdk/integrations/openai_agents/patches/runner.py +45 -0
  98. sentry_sdk/integrations/openai_agents/patches/tools.py +77 -0
  99. sentry_sdk/integrations/openai_agents/spans/__init__.py +5 -0
  100. sentry_sdk/integrations/openai_agents/spans/agent_workflow.py +21 -0
  101. sentry_sdk/integrations/openai_agents/spans/ai_client.py +42 -0
  102. sentry_sdk/integrations/openai_agents/spans/execute_tool.py +48 -0
  103. sentry_sdk/integrations/openai_agents/spans/handoff.py +19 -0
  104. sentry_sdk/integrations/openai_agents/spans/invoke_agent.py +86 -0
  105. sentry_sdk/integrations/openai_agents/utils.py +199 -0
  106. sentry_sdk/integrations/openfeature.py +35 -0
  107. sentry_sdk/integrations/opentelemetry/__init__.py +7 -0
  108. sentry_sdk/integrations/opentelemetry/consts.py +5 -0
  109. sentry_sdk/integrations/opentelemetry/integration.py +58 -0
  110. sentry_sdk/integrations/opentelemetry/propagator.py +117 -0
  111. sentry_sdk/integrations/opentelemetry/span_processor.py +391 -0
  112. sentry_sdk/integrations/otlp.py +82 -0
  113. sentry_sdk/integrations/pure_eval.py +20 -11
  114. sentry_sdk/integrations/pydantic_ai/__init__.py +47 -0
  115. sentry_sdk/integrations/pydantic_ai/consts.py +1 -0
  116. sentry_sdk/integrations/pydantic_ai/patches/__init__.py +4 -0
  117. sentry_sdk/integrations/pydantic_ai/patches/agent_run.py +215 -0
  118. sentry_sdk/integrations/pydantic_ai/patches/graph_nodes.py +110 -0
  119. sentry_sdk/integrations/pydantic_ai/patches/model_request.py +40 -0
  120. sentry_sdk/integrations/pydantic_ai/patches/tools.py +98 -0
  121. sentry_sdk/integrations/pydantic_ai/spans/__init__.py +3 -0
  122. sentry_sdk/integrations/pydantic_ai/spans/ai_client.py +246 -0
  123. sentry_sdk/integrations/pydantic_ai/spans/execute_tool.py +49 -0
  124. sentry_sdk/integrations/pydantic_ai/spans/invoke_agent.py +112 -0
  125. sentry_sdk/integrations/pydantic_ai/utils.py +223 -0
  126. sentry_sdk/integrations/pymongo.py +214 -0
  127. sentry_sdk/integrations/pyramid.py +71 -60
  128. sentry_sdk/integrations/quart.py +237 -0
  129. sentry_sdk/integrations/ray.py +165 -0
  130. sentry_sdk/integrations/redis/__init__.py +48 -0
  131. sentry_sdk/integrations/redis/_async_common.py +116 -0
  132. sentry_sdk/integrations/redis/_sync_common.py +119 -0
  133. sentry_sdk/integrations/redis/consts.py +19 -0
  134. sentry_sdk/integrations/redis/modules/__init__.py +0 -0
  135. sentry_sdk/integrations/redis/modules/caches.py +118 -0
  136. sentry_sdk/integrations/redis/modules/queries.py +65 -0
  137. sentry_sdk/integrations/redis/rb.py +32 -0
  138. sentry_sdk/integrations/redis/redis.py +69 -0
  139. sentry_sdk/integrations/redis/redis_cluster.py +107 -0
  140. sentry_sdk/integrations/redis/redis_py_cluster_legacy.py +50 -0
  141. sentry_sdk/integrations/redis/utils.py +148 -0
  142. sentry_sdk/integrations/rq.py +62 -52
  143. sentry_sdk/integrations/rust_tracing.py +284 -0
  144. sentry_sdk/integrations/sanic.py +248 -114
  145. sentry_sdk/integrations/serverless.py +13 -22
  146. sentry_sdk/integrations/socket.py +96 -0
  147. sentry_sdk/integrations/spark/spark_driver.py +115 -62
  148. sentry_sdk/integrations/spark/spark_worker.py +42 -50
  149. sentry_sdk/integrations/sqlalchemy.py +82 -37
  150. sentry_sdk/integrations/starlette.py +737 -0
  151. sentry_sdk/integrations/starlite.py +292 -0
  152. sentry_sdk/integrations/statsig.py +37 -0
  153. sentry_sdk/integrations/stdlib.py +100 -58
  154. sentry_sdk/integrations/strawberry.py +394 -0
  155. sentry_sdk/integrations/sys_exit.py +70 -0
  156. sentry_sdk/integrations/threading.py +142 -38
  157. sentry_sdk/integrations/tornado.py +68 -53
  158. sentry_sdk/integrations/trytond.py +15 -20
  159. sentry_sdk/integrations/typer.py +60 -0
  160. sentry_sdk/integrations/unleash.py +33 -0
  161. sentry_sdk/integrations/unraisablehook.py +53 -0
  162. sentry_sdk/integrations/wsgi.py +126 -125
  163. sentry_sdk/logger.py +96 -0
  164. sentry_sdk/metrics.py +81 -0
  165. sentry_sdk/monitor.py +120 -0
  166. sentry_sdk/profiler/__init__.py +49 -0
  167. sentry_sdk/profiler/continuous_profiler.py +730 -0
  168. sentry_sdk/profiler/transaction_profiler.py +839 -0
  169. sentry_sdk/profiler/utils.py +195 -0
  170. sentry_sdk/scope.py +1542 -112
  171. sentry_sdk/scrubber.py +177 -0
  172. sentry_sdk/serializer.py +152 -210
  173. sentry_sdk/session.py +177 -0
  174. sentry_sdk/sessions.py +202 -179
  175. sentry_sdk/spotlight.py +242 -0
  176. sentry_sdk/tracing.py +1202 -294
  177. sentry_sdk/tracing_utils.py +1236 -0
  178. sentry_sdk/transport.py +693 -189
  179. sentry_sdk/types.py +52 -0
  180. sentry_sdk/utils.py +1395 -228
  181. sentry_sdk/worker.py +30 -17
  182. sentry_sdk-2.46.0.dist-info/METADATA +268 -0
  183. sentry_sdk-2.46.0.dist-info/RECORD +189 -0
  184. {sentry_sdk-0.18.0.dist-info → sentry_sdk-2.46.0.dist-info}/WHEEL +1 -1
  185. sentry_sdk-2.46.0.dist-info/entry_points.txt +2 -0
  186. sentry_sdk-2.46.0.dist-info/licenses/LICENSE +21 -0
  187. sentry_sdk/_functools.py +0 -66
  188. sentry_sdk/integrations/celery.py +0 -275
  189. sentry_sdk/integrations/redis.py +0 -103
  190. sentry_sdk-0.18.0.dist-info/LICENSE +0 -9
  191. sentry_sdk-0.18.0.dist-info/METADATA +0 -66
  192. sentry_sdk-0.18.0.dist-info/RECORD +0 -65
  193. {sentry_sdk-0.18.0.dist-info → sentry_sdk-2.46.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,208 @@
1
+ from __future__ import annotations
2
+ import contextlib
3
+ from typing import Any, TypeVar, Callable, Awaitable, Iterator
4
+
5
+ import sentry_sdk
6
+ from sentry_sdk.consts import OP, SPANDATA
7
+ from sentry_sdk.integrations import _check_minimum_version, Integration, DidNotEnable
8
+ from sentry_sdk.tracing import Span
9
+ from sentry_sdk.tracing_utils import add_query_source, record_sql_queries
10
+ from sentry_sdk.utils import (
11
+ ensure_integration_enabled,
12
+ parse_version,
13
+ capture_internal_exceptions,
14
+ )
15
+
16
+ try:
17
+ import asyncpg # type: ignore[import-not-found]
18
+ from asyncpg.cursor import BaseCursor # type: ignore
19
+
20
+ except ImportError:
21
+ raise DidNotEnable("asyncpg not installed.")
22
+
23
+
24
+ class AsyncPGIntegration(Integration):
25
+ identifier = "asyncpg"
26
+ origin = f"auto.db.{identifier}"
27
+ _record_params = False
28
+
29
+ def __init__(self, *, record_params: bool = False):
30
+ AsyncPGIntegration._record_params = record_params
31
+
32
+ @staticmethod
33
+ def setup_once() -> None:
34
+ # asyncpg.__version__ is a string containing the semantic version in the form of "<major>.<minor>.<patch>"
35
+ asyncpg_version = parse_version(asyncpg.__version__)
36
+ _check_minimum_version(AsyncPGIntegration, asyncpg_version)
37
+
38
+ asyncpg.Connection.execute = _wrap_execute(
39
+ asyncpg.Connection.execute,
40
+ )
41
+
42
+ asyncpg.Connection._execute = _wrap_connection_method(
43
+ asyncpg.Connection._execute
44
+ )
45
+ asyncpg.Connection._executemany = _wrap_connection_method(
46
+ asyncpg.Connection._executemany, executemany=True
47
+ )
48
+ asyncpg.Connection.cursor = _wrap_cursor_creation(asyncpg.Connection.cursor)
49
+ asyncpg.Connection.prepare = _wrap_connection_method(asyncpg.Connection.prepare)
50
+ asyncpg.connect_utils._connect_addr = _wrap_connect_addr(
51
+ asyncpg.connect_utils._connect_addr
52
+ )
53
+
54
+
55
+ T = TypeVar("T")
56
+
57
+
58
+ def _wrap_execute(f: Callable[..., Awaitable[T]]) -> Callable[..., Awaitable[T]]:
59
+ async def _inner(*args: Any, **kwargs: Any) -> T:
60
+ if sentry_sdk.get_client().get_integration(AsyncPGIntegration) is None:
61
+ return await f(*args, **kwargs)
62
+
63
+ # Avoid recording calls to _execute twice.
64
+ # Calls to Connection.execute with args also call
65
+ # Connection._execute, which is recorded separately
66
+ # args[0] = the connection object, args[1] is the query
67
+ if len(args) > 2:
68
+ return await f(*args, **kwargs)
69
+
70
+ query = args[1]
71
+ with record_sql_queries(
72
+ cursor=None,
73
+ query=query,
74
+ params_list=None,
75
+ paramstyle=None,
76
+ executemany=False,
77
+ span_origin=AsyncPGIntegration.origin,
78
+ ) as span:
79
+ res = await f(*args, **kwargs)
80
+
81
+ with capture_internal_exceptions():
82
+ add_query_source(span)
83
+
84
+ return res
85
+
86
+ return _inner
87
+
88
+
89
+ SubCursor = TypeVar("SubCursor", bound=BaseCursor)
90
+
91
+
92
+ @contextlib.contextmanager
93
+ def _record(
94
+ cursor: SubCursor | None,
95
+ query: str,
96
+ params_list: tuple[Any, ...] | None,
97
+ *,
98
+ executemany: bool = False,
99
+ ) -> Iterator[Span]:
100
+ integration = sentry_sdk.get_client().get_integration(AsyncPGIntegration)
101
+ if integration is not None and not integration._record_params:
102
+ params_list = None
103
+
104
+ param_style = "pyformat" if params_list else None
105
+
106
+ with record_sql_queries(
107
+ cursor=cursor,
108
+ query=query,
109
+ params_list=params_list,
110
+ paramstyle=param_style,
111
+ executemany=executemany,
112
+ record_cursor_repr=cursor is not None,
113
+ span_origin=AsyncPGIntegration.origin,
114
+ ) as span:
115
+ yield span
116
+
117
+
118
+ def _wrap_connection_method(
119
+ f: Callable[..., Awaitable[T]], *, executemany: bool = False
120
+ ) -> Callable[..., Awaitable[T]]:
121
+ async def _inner(*args: Any, **kwargs: Any) -> T:
122
+ if sentry_sdk.get_client().get_integration(AsyncPGIntegration) is None:
123
+ return await f(*args, **kwargs)
124
+ query = args[1]
125
+ params_list = args[2] if len(args) > 2 else None
126
+ with _record(None, query, params_list, executemany=executemany) as span:
127
+ _set_db_data(span, args[0])
128
+ res = await f(*args, **kwargs)
129
+
130
+ return res
131
+
132
+ return _inner
133
+
134
+
135
+ def _wrap_cursor_creation(f: Callable[..., T]) -> Callable[..., T]:
136
+ @ensure_integration_enabled(AsyncPGIntegration, f)
137
+ def _inner(*args: Any, **kwargs: Any) -> T: # noqa: N807
138
+ query = args[1]
139
+ params_list = args[2] if len(args) > 2 else None
140
+
141
+ with _record(
142
+ None,
143
+ query,
144
+ params_list,
145
+ executemany=False,
146
+ ) as span:
147
+ _set_db_data(span, args[0])
148
+ res = f(*args, **kwargs)
149
+ span.set_data("db.cursor", res)
150
+
151
+ return res
152
+
153
+ return _inner
154
+
155
+
156
+ def _wrap_connect_addr(f: Callable[..., Awaitable[T]]) -> Callable[..., Awaitable[T]]:
157
+ async def _inner(*args: Any, **kwargs: Any) -> T:
158
+ if sentry_sdk.get_client().get_integration(AsyncPGIntegration) is None:
159
+ return await f(*args, **kwargs)
160
+
161
+ user = kwargs["params"].user
162
+ database = kwargs["params"].database
163
+
164
+ with sentry_sdk.start_span(
165
+ op=OP.DB,
166
+ name="connect",
167
+ origin=AsyncPGIntegration.origin,
168
+ ) as span:
169
+ span.set_data(SPANDATA.DB_SYSTEM, "postgresql")
170
+ addr = kwargs.get("addr")
171
+ if addr:
172
+ try:
173
+ span.set_data(SPANDATA.SERVER_ADDRESS, addr[0])
174
+ span.set_data(SPANDATA.SERVER_PORT, addr[1])
175
+ except IndexError:
176
+ pass
177
+ span.set_data(SPANDATA.DB_NAME, database)
178
+ span.set_data(SPANDATA.DB_USER, user)
179
+
180
+ with capture_internal_exceptions():
181
+ sentry_sdk.add_breadcrumb(
182
+ message="connect", category="query", data=span._data
183
+ )
184
+ res = await f(*args, **kwargs)
185
+
186
+ return res
187
+
188
+ return _inner
189
+
190
+
191
+ def _set_db_data(span: Span, conn: Any) -> None:
192
+ span.set_data(SPANDATA.DB_SYSTEM, "postgresql")
193
+
194
+ addr = conn._addr
195
+ if addr:
196
+ try:
197
+ span.set_data(SPANDATA.SERVER_ADDRESS, addr[0])
198
+ span.set_data(SPANDATA.SERVER_PORT, addr[1])
199
+ except IndexError:
200
+ pass
201
+
202
+ database = conn._params.database
203
+ if database:
204
+ span.set_data(SPANDATA.DB_NAME, database)
205
+
206
+ user = conn._params.user
207
+ if user:
208
+ span.set_data(SPANDATA.DB_USER, user)
@@ -1,17 +1,13 @@
1
- from __future__ import absolute_import
2
-
3
1
  import os
4
2
  import sys
5
3
  import atexit
6
4
 
7
- from sentry_sdk.hub import Hub
5
+ import sentry_sdk
8
6
  from sentry_sdk.utils import logger
9
7
  from sentry_sdk.integrations import Integration
8
+ from typing import TYPE_CHECKING
10
9
 
11
- from sentry_sdk._types import MYPY
12
-
13
- if MYPY:
14
-
10
+ if TYPE_CHECKING:
15
11
  from typing import Any
16
12
  from typing import Optional
17
13
 
@@ -27,7 +23,7 @@ def default_callback(pending, timeout):
27
23
  # type: (str) -> None
28
24
  sys.stderr.write(msg + "\n")
29
25
 
30
- echo("Sentry is attempting to send %i pending error messages" % pending)
26
+ echo("Sentry is attempting to send %i pending events" % pending)
31
27
  echo("Waiting up to %s seconds" % timeout)
32
28
  echo("Press Ctrl-%s to quit" % (os.name == "nt" and "Break" or "C"))
33
29
  sys.stderr.flush()
@@ -48,15 +44,14 @@ class AtexitIntegration(Integration):
48
44
  @atexit.register
49
45
  def _shutdown():
50
46
  # type: () -> None
51
- logger.debug("atexit: got shutdown signal")
52
- hub = Hub.main
53
- integration = hub.get_integration(AtexitIntegration)
54
- if integration is not None:
55
- logger.debug("atexit: shutting down client")
47
+ client = sentry_sdk.get_client()
48
+ integration = client.get_integration(AtexitIntegration)
49
+
50
+ if integration is None:
51
+ return
56
52
 
57
- # If there is a session on the hub, close it now.
58
- hub.end_session()
53
+ logger.debug("atexit: got shutdown signal")
54
+ logger.debug("atexit: shutting down client")
55
+ sentry_sdk.get_isolation_scope().end_session()
59
56
 
60
- # If an integration is there, a client has to be there.
61
- client = hub.client # type: Any
62
- client.close(callback=integration.callback)
57
+ client.close(callback=integration.callback)