sentry-sdk 0.7.5__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 -30
  2. sentry_sdk/_compat.py +74 -61
  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 +289 -0
  8. sentry_sdk/_types.py +338 -0
  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 +496 -80
  14. sentry_sdk/attachments.py +75 -0
  15. sentry_sdk/client.py +1023 -103
  16. sentry_sdk/consts.py +1438 -66
  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 +15 -14
  22. sentry_sdk/envelope.py +369 -0
  23. sentry_sdk/feature_flags.py +71 -0
  24. sentry_sdk/hub.py +611 -280
  25. sentry_sdk/integrations/__init__.py +276 -49
  26. sentry_sdk/integrations/_asgi_common.py +108 -0
  27. sentry_sdk/integrations/_wsgi_common.py +180 -44
  28. sentry_sdk/integrations/aiohttp.py +291 -42
  29. sentry_sdk/integrations/anthropic.py +439 -0
  30. sentry_sdk/integrations/argv.py +9 -8
  31. sentry_sdk/integrations/ariadne.py +161 -0
  32. sentry_sdk/integrations/arq.py +247 -0
  33. sentry_sdk/integrations/asgi.py +341 -0
  34. sentry_sdk/integrations/asyncio.py +144 -0
  35. sentry_sdk/integrations/asyncpg.py +208 -0
  36. sentry_sdk/integrations/atexit.py +17 -10
  37. sentry_sdk/integrations/aws_lambda.py +377 -62
  38. sentry_sdk/integrations/beam.py +176 -0
  39. sentry_sdk/integrations/boto3.py +137 -0
  40. sentry_sdk/integrations/bottle.py +221 -0
  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 +134 -0
  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 +48 -14
  49. sentry_sdk/integrations/django/__init__.py +584 -191
  50. sentry_sdk/integrations/django/asgi.py +245 -0
  51. sentry_sdk/integrations/django/caching.py +204 -0
  52. sentry_sdk/integrations/django/middleware.py +187 -0
  53. sentry_sdk/integrations/django/signals_handlers.py +91 -0
  54. sentry_sdk/integrations/django/templates.py +79 -5
  55. sentry_sdk/integrations/django/transactions.py +49 -22
  56. sentry_sdk/integrations/django/views.py +96 -0
  57. sentry_sdk/integrations/dramatiq.py +226 -0
  58. sentry_sdk/integrations/excepthook.py +50 -13
  59. sentry_sdk/integrations/executing.py +67 -0
  60. sentry_sdk/integrations/falcon.py +272 -0
  61. sentry_sdk/integrations/fastapi.py +141 -0
  62. sentry_sdk/integrations/flask.py +142 -88
  63. sentry_sdk/integrations/gcp.py +239 -0
  64. sentry_sdk/integrations/gnu_backtrace.py +99 -0
  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 +307 -96
  87. sentry_sdk/integrations/loguru.py +213 -0
  88. sentry_sdk/integrations/mcp.py +566 -0
  89. sentry_sdk/integrations/modules.py +14 -31
  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 +141 -0
  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 +112 -68
  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 +95 -37
  143. sentry_sdk/integrations/rust_tracing.py +284 -0
  144. sentry_sdk/integrations/sanic.py +294 -123
  145. sentry_sdk/integrations/serverless.py +48 -19
  146. sentry_sdk/integrations/socket.py +96 -0
  147. sentry_sdk/integrations/spark/__init__.py +4 -0
  148. sentry_sdk/integrations/spark/spark_driver.py +316 -0
  149. sentry_sdk/integrations/spark/spark_worker.py +116 -0
  150. sentry_sdk/integrations/sqlalchemy.py +142 -0
  151. sentry_sdk/integrations/starlette.py +737 -0
  152. sentry_sdk/integrations/starlite.py +292 -0
  153. sentry_sdk/integrations/statsig.py +37 -0
  154. sentry_sdk/integrations/stdlib.py +235 -29
  155. sentry_sdk/integrations/strawberry.py +394 -0
  156. sentry_sdk/integrations/sys_exit.py +70 -0
  157. sentry_sdk/integrations/threading.py +158 -28
  158. sentry_sdk/integrations/tornado.py +84 -52
  159. sentry_sdk/integrations/trytond.py +50 -0
  160. sentry_sdk/integrations/typer.py +60 -0
  161. sentry_sdk/integrations/unleash.py +33 -0
  162. sentry_sdk/integrations/unraisablehook.py +53 -0
  163. sentry_sdk/integrations/wsgi.py +201 -119
  164. sentry_sdk/logger.py +96 -0
  165. sentry_sdk/metrics.py +81 -0
  166. sentry_sdk/monitor.py +120 -0
  167. sentry_sdk/profiler/__init__.py +49 -0
  168. sentry_sdk/profiler/continuous_profiler.py +730 -0
  169. sentry_sdk/profiler/transaction_profiler.py +839 -0
  170. sentry_sdk/profiler/utils.py +195 -0
  171. sentry_sdk/py.typed +0 -0
  172. sentry_sdk/scope.py +1713 -85
  173. sentry_sdk/scrubber.py +177 -0
  174. sentry_sdk/serializer.py +405 -0
  175. sentry_sdk/session.py +177 -0
  176. sentry_sdk/sessions.py +275 -0
  177. sentry_sdk/spotlight.py +242 -0
  178. sentry_sdk/tracing.py +1486 -0
  179. sentry_sdk/tracing_utils.py +1236 -0
  180. sentry_sdk/transport.py +806 -134
  181. sentry_sdk/types.py +52 -0
  182. sentry_sdk/utils.py +1625 -465
  183. sentry_sdk/worker.py +54 -25
  184. sentry_sdk-2.46.0.dist-info/METADATA +268 -0
  185. sentry_sdk-2.46.0.dist-info/RECORD +189 -0
  186. {sentry_sdk-0.7.5.dist-info → sentry_sdk-2.46.0.dist-info}/WHEEL +1 -1
  187. sentry_sdk-2.46.0.dist-info/entry_points.txt +2 -0
  188. sentry_sdk-2.46.0.dist-info/licenses/LICENSE +21 -0
  189. sentry_sdk/integrations/celery.py +0 -119
  190. sentry_sdk-0.7.5.dist-info/LICENSE +0 -9
  191. sentry_sdk-0.7.5.dist-info/METADATA +0 -36
  192. sentry_sdk-0.7.5.dist-info/RECORD +0 -39
  193. {sentry_sdk-0.7.5.dist-info → sentry_sdk-2.46.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,213 @@
1
+ import enum
2
+
3
+ import sentry_sdk
4
+ from sentry_sdk.integrations import Integration, DidNotEnable
5
+ from sentry_sdk.integrations.logging import (
6
+ BreadcrumbHandler,
7
+ EventHandler,
8
+ _BaseHandler,
9
+ )
10
+ from sentry_sdk.logger import _log_level_to_otel
11
+ from sentry_sdk.utils import has_logs_enabled, safe_repr
12
+
13
+ from typing import TYPE_CHECKING
14
+
15
+ if TYPE_CHECKING:
16
+ from logging import LogRecord
17
+ from typing import Any, Optional
18
+
19
+ try:
20
+ import loguru
21
+ from loguru import logger
22
+ from loguru._defaults import LOGURU_FORMAT as DEFAULT_FORMAT
23
+
24
+ if TYPE_CHECKING:
25
+ from loguru import Message
26
+ except ImportError:
27
+ raise DidNotEnable("LOGURU is not installed")
28
+
29
+
30
+ class LoggingLevels(enum.IntEnum):
31
+ TRACE = 5
32
+ DEBUG = 10
33
+ INFO = 20
34
+ SUCCESS = 25
35
+ WARNING = 30
36
+ ERROR = 40
37
+ CRITICAL = 50
38
+
39
+
40
+ DEFAULT_LEVEL = LoggingLevels.INFO.value
41
+ DEFAULT_EVENT_LEVEL = LoggingLevels.ERROR.value
42
+
43
+
44
+ SENTRY_LEVEL_FROM_LOGURU_LEVEL = {
45
+ "TRACE": "DEBUG",
46
+ "DEBUG": "DEBUG",
47
+ "INFO": "INFO",
48
+ "SUCCESS": "INFO",
49
+ "WARNING": "WARNING",
50
+ "ERROR": "ERROR",
51
+ "CRITICAL": "CRITICAL",
52
+ }
53
+
54
+ # Map Loguru level numbers to corresponding OTel level numbers
55
+ SEVERITY_TO_OTEL_SEVERITY = {
56
+ LoggingLevels.CRITICAL: 21, # fatal
57
+ LoggingLevels.ERROR: 17, # error
58
+ LoggingLevels.WARNING: 13, # warn
59
+ LoggingLevels.SUCCESS: 11, # info
60
+ LoggingLevels.INFO: 9, # info
61
+ LoggingLevels.DEBUG: 5, # debug
62
+ LoggingLevels.TRACE: 1, # trace
63
+ }
64
+
65
+
66
+ class LoguruIntegration(Integration):
67
+ identifier = "loguru"
68
+
69
+ level = DEFAULT_LEVEL # type: Optional[int]
70
+ event_level = DEFAULT_EVENT_LEVEL # type: Optional[int]
71
+ breadcrumb_format = DEFAULT_FORMAT
72
+ event_format = DEFAULT_FORMAT
73
+ sentry_logs_level = DEFAULT_LEVEL # type: Optional[int]
74
+
75
+ def __init__(
76
+ self,
77
+ level=DEFAULT_LEVEL,
78
+ event_level=DEFAULT_EVENT_LEVEL,
79
+ breadcrumb_format=DEFAULT_FORMAT,
80
+ event_format=DEFAULT_FORMAT,
81
+ sentry_logs_level=DEFAULT_LEVEL,
82
+ ):
83
+ # type: (Optional[int], Optional[int], str | loguru.FormatFunction, str | loguru.FormatFunction, Optional[int]) -> None
84
+ LoguruIntegration.level = level
85
+ LoguruIntegration.event_level = event_level
86
+ LoguruIntegration.breadcrumb_format = breadcrumb_format
87
+ LoguruIntegration.event_format = event_format
88
+ LoguruIntegration.sentry_logs_level = sentry_logs_level
89
+
90
+ @staticmethod
91
+ def setup_once():
92
+ # type: () -> None
93
+ if LoguruIntegration.level is not None:
94
+ logger.add(
95
+ LoguruBreadcrumbHandler(level=LoguruIntegration.level),
96
+ level=LoguruIntegration.level,
97
+ format=LoguruIntegration.breadcrumb_format,
98
+ )
99
+
100
+ if LoguruIntegration.event_level is not None:
101
+ logger.add(
102
+ LoguruEventHandler(level=LoguruIntegration.event_level),
103
+ level=LoguruIntegration.event_level,
104
+ format=LoguruIntegration.event_format,
105
+ )
106
+
107
+ if LoguruIntegration.sentry_logs_level is not None:
108
+ logger.add(
109
+ loguru_sentry_logs_handler,
110
+ level=LoguruIntegration.sentry_logs_level,
111
+ )
112
+
113
+
114
+ class _LoguruBaseHandler(_BaseHandler):
115
+ def __init__(self, *args, **kwargs):
116
+ # type: (*Any, **Any) -> None
117
+ if kwargs.get("level"):
118
+ kwargs["level"] = SENTRY_LEVEL_FROM_LOGURU_LEVEL.get(
119
+ kwargs.get("level", ""), DEFAULT_LEVEL
120
+ )
121
+
122
+ super().__init__(*args, **kwargs)
123
+
124
+ def _logging_to_event_level(self, record):
125
+ # type: (LogRecord) -> str
126
+ try:
127
+ return SENTRY_LEVEL_FROM_LOGURU_LEVEL[
128
+ LoggingLevels(record.levelno).name
129
+ ].lower()
130
+ except (ValueError, KeyError):
131
+ return record.levelname.lower() if record.levelname else ""
132
+
133
+
134
+ class LoguruEventHandler(_LoguruBaseHandler, EventHandler):
135
+ """Modified version of :class:`sentry_sdk.integrations.logging.EventHandler` to use loguru's level names."""
136
+
137
+ pass
138
+
139
+
140
+ class LoguruBreadcrumbHandler(_LoguruBaseHandler, BreadcrumbHandler):
141
+ """Modified version of :class:`sentry_sdk.integrations.logging.BreadcrumbHandler` to use loguru's level names."""
142
+
143
+ pass
144
+
145
+
146
+ def loguru_sentry_logs_handler(message):
147
+ # type: (Message) -> None
148
+ # This is intentionally a callable sink instead of a standard logging handler
149
+ # since otherwise we wouldn't get direct access to message.record
150
+ client = sentry_sdk.get_client()
151
+
152
+ if not client.is_active():
153
+ return
154
+
155
+ if not has_logs_enabled(client.options):
156
+ return
157
+
158
+ record = message.record
159
+
160
+ if (
161
+ LoguruIntegration.sentry_logs_level is None
162
+ or record["level"].no < LoguruIntegration.sentry_logs_level
163
+ ):
164
+ return
165
+
166
+ otel_severity_number, otel_severity_text = _log_level_to_otel(
167
+ record["level"].no, SEVERITY_TO_OTEL_SEVERITY
168
+ )
169
+
170
+ attrs = {"sentry.origin": "auto.log.loguru"} # type: dict[str, Any]
171
+
172
+ project_root = client.options["project_root"]
173
+ if record.get("file"):
174
+ if project_root is not None and record["file"].path.startswith(project_root):
175
+ attrs["code.file.path"] = record["file"].path[len(project_root) + 1 :]
176
+ else:
177
+ attrs["code.file.path"] = record["file"].path
178
+
179
+ if record.get("line") is not None:
180
+ attrs["code.line.number"] = record["line"]
181
+
182
+ if record.get("function"):
183
+ attrs["code.function.name"] = record["function"]
184
+
185
+ if record.get("thread"):
186
+ attrs["thread.name"] = record["thread"].name
187
+ attrs["thread.id"] = record["thread"].id
188
+
189
+ if record.get("process"):
190
+ attrs["process.pid"] = record["process"].id
191
+ attrs["process.executable.name"] = record["process"].name
192
+
193
+ if record.get("name"):
194
+ attrs["logger.name"] = record["name"]
195
+
196
+ extra = record.get("extra")
197
+ if isinstance(extra, dict):
198
+ for key, value in extra.items():
199
+ if isinstance(value, (str, int, float, bool)):
200
+ attrs[f"sentry.message.parameter.{key}"] = value
201
+ else:
202
+ attrs[f"sentry.message.parameter.{key}"] = safe_repr(value)
203
+
204
+ client._capture_log(
205
+ {
206
+ "severity_text": otel_severity_text,
207
+ "severity_number": otel_severity_number,
208
+ "body": record["message"],
209
+ "attributes": attrs,
210
+ "time_unix_nano": int(record["time"].timestamp() * 1e9),
211
+ "trace_id": None,
212
+ }
213
+ )