|
10 | 10 | get_type_name, |
11 | 11 | capture_internal_exceptions, |
12 | 12 | current_stacktrace, |
| 13 | + disable_capture_event, |
13 | 14 | logger, |
14 | 15 | ) |
15 | | -from sentry_sdk.serializer import Serializer |
| 16 | +from sentry_sdk.serializer import serialize, partial_serialize |
16 | 17 | from sentry_sdk.transport import make_transport |
17 | 18 | from sentry_sdk.consts import DEFAULT_OPTIONS, SDK_INFO, ClientConstructor |
18 | 19 | from sentry_sdk.integrations import setup_integrations |
|
31 | 32 |
|
32 | 33 |
|
33 | 34 | _client_init_debug = ContextVar("client_init_debug") |
34 | | -_client_in_capture_event = ContextVar("client_in_capture_event") |
35 | 35 |
|
36 | 36 |
|
37 | 37 | def _get_options(*args, **kwargs): |
@@ -123,8 +123,13 @@ def _prepare_event( |
123 | 123 | scope, # type: Optional[Scope] |
124 | 124 | ): |
125 | 125 | # type: (...) -> Optional[Event] |
| 126 | + |
| 127 | + client = self # type: Client # type: ignore |
| 128 | + |
126 | 129 | if event.get("timestamp") is None: |
127 | | - event["timestamp"] = datetime.utcnow() |
| 130 | + event["timestamp"] = partial_serialize( |
| 131 | + client, datetime.utcnow(), is_databag=False, should_repr_strings=False |
| 132 | + ) |
128 | 133 |
|
129 | 134 | hint = dict(hint or ()) # type: Hint |
130 | 135 |
|
@@ -170,8 +175,10 @@ def _prepare_event( |
170 | 175 |
|
171 | 176 | # Postprocess the event here so that annotated types do |
172 | 177 | # generally not surface in before_send |
173 | | - if event is not None: |
174 | | - event = Serializer().serialize_event(event) |
| 178 | + if event is not None and not self.options["_experiments"].get( |
| 179 | + "fast_serialize", False |
| 180 | + ): |
| 181 | + event = serialize(event) |
175 | 182 |
|
176 | 183 | before_send = self.options["before_send"] |
177 | 184 | if before_send is not None: |
@@ -241,29 +248,23 @@ def capture_event( |
241 | 248 |
|
242 | 249 | :returns: An event ID. May be `None` if there is no DSN set or of if the SDK decided to discard the event for other reasons. In such situations setting `debug=True` on `init()` may help. |
243 | 250 | """ |
244 | | - is_recursive = _client_in_capture_event.get(False) |
245 | | - if is_recursive: |
| 251 | + if disable_capture_event.get(False): |
246 | 252 | return None |
247 | 253 |
|
248 | | - _client_in_capture_event.set(True) |
249 | | - |
250 | | - try: |
251 | | - if self.transport is None: |
252 | | - return None |
253 | | - if hint is None: |
254 | | - hint = {} |
255 | | - event_id = event.get("event_id") |
256 | | - if event_id is None: |
257 | | - event["event_id"] = event_id = uuid.uuid4().hex |
258 | | - if not self._should_capture(event, hint, scope): |
259 | | - return None |
260 | | - event_opt = self._prepare_event(event, hint, scope) |
261 | | - if event_opt is None: |
262 | | - return None |
263 | | - self.transport.capture_event(event_opt) |
264 | | - return event_id |
265 | | - finally: |
266 | | - _client_in_capture_event.set(False) |
| 254 | + if self.transport is None: |
| 255 | + return None |
| 256 | + if hint is None: |
| 257 | + hint = {} |
| 258 | + event_id = event.get("event_id") |
| 259 | + if event_id is None: |
| 260 | + event["event_id"] = event_id = uuid.uuid4().hex |
| 261 | + if not self._should_capture(event, hint, scope): |
| 262 | + return None |
| 263 | + event_opt = self._prepare_event(event, hint, scope) |
| 264 | + if event_opt is None: |
| 265 | + return None |
| 266 | + self.transport.capture_event(event_opt) |
| 267 | + return event_id |
267 | 268 |
|
268 | 269 | def close( |
269 | 270 | self, |
|
0 commit comments