8000 ref: Performance improvements when serializing events (#368) · pythonthings/sentry-python@b181dfa · GitHub
[go: up one dir, main page]

Skip to content

Commit b181dfa

Browse files
authored
ref: Performance improvements when serializing events (getsentry#368)
A customer was experiencing performance issues when serializing frames with large local vars. Instead of recursing through very large data that we're going to go trim later anyway, do everything in one go.
1 parent fa5971d commit b181dfa

File tree

18 files changed

+430
-372
lines changed

18 files changed

+430
-372
lines changed

.flake8

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[flake8]
2-
ignore = E203, E266, E501, W503, E402, E731
2+
ignore = E203, E266, E501, W503, E402, E731, C901
33
max-line-length = 80
44
max-complexity = 18
55
select = B,C,E,F,W,T4,B9

pytest.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
[pytest]
22
DJANGO_SETTINGS_MODULE = tests.integrations.django.myapp.settings
33
addopts = --boxed --tb=short
4+
markers = tests_internal_exceptions

sentry_sdk/client.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,15 @@
33
import random
44
from datetime import datetime
55

6-
from sentry_sdk._compat import string_types, text_type
6+
from sentry_sdk._compat import string_types, text_type, iteritems
77
from sentry_sdk.utils import (
8-
strip_event_mut,
9-
flatten_metadata,
10-
convert_types,
118
handle_in_app,
129
get_type_name,
1310
capture_internal_exceptions,
1411
current_stacktrace,
1512
logger,
1613
)
14+
from sentry_sdk.serializer import Serializer
1715
from sentry_sdk.transport import make_transport
1816
from sentry_sdk.consts import DEFAULT_OPTIONS, SDK_INFO
1917
from sentry_sdk.integrations import setup_integrations
@@ -43,7 +41,7 @@ def get_options(*args, **kwargs):
4341
if dsn is not None and options.get("dsn") is None:
4442
options["dsn"] = dsn # type: ignore
4543

46-
for key, value in options.items():
44+
for key, value in iteritems(options):
4745
if key not in rv:
4846
raise TypeError("Unknown option %r" % (key,))
4947
rv[key] = value # type: ignore
@@ -146,9 +144,7 @@ def _prepare_event(
146144
# Postprocess the event here so that annotated types do
147145
# generally not surface in before_send
148146
if event is not None:
149-
event = convert_types(event)
150-
strip_event_mut(event)
151-
event = flatten_metadata(event)
147+
event = Serializer().serialize_event(event)
152148

153149
before_send = self.options["before_send"]
154150
if before_send is not None:

sentry_sdk/integrations/_wsgi_common.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from sentry_sdk.hub import Hub, _should_send_default_pii
44
from sentry_sdk.utils import AnnotatedValue
5-
from sentry_sdk._compat import text_type
5+
from sentry_sdk._compat import text_type, iteritems
66

77
if False:
88
from typing import Any
@@ -75,8 +75,8 @@ def parsed_body(self):
7575
form = self.form()
7676
files = self.files()
7777
if form or files:
78-
data = dict(form.items())
79-
for k, v in files.items():
78+
data = dict(iteritems(form))
79+
for k, v in iteritems(files):
8080
size = self.size_of_file(v)
8181
data[k] = AnnotatedValue(
8282
"", {"len": size, "rem": [["!raw", "x", 0, size]]}
@@ -130,6 +130,6 @@ def _filter_headers(headers):
130130

131131
return {
132132
k: v
133-
for k, v in headers.items()
133+
for k, v in iteritems(headers)
134134
if k.lower().replace("_", "-") not in ("set-cookie", "cookie", "authorization")
135135
}

sentry_sdk/integrations/django/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
from sentry_sdk import Hub
3131
from sentry_sdk.hub import _should_send_default_pii
3232
from sentry_sdk.scope import add_global_event_processor
33+
from sentry_sdk.serializer import add_global_repr_processor
3334
from sentry_sdk.utils import (
34-
add_global_repr_processor,
3535
capture_internal_exceptions,
3636
event_from_exception,
3737
safe_repr,

sentry_sdk/integrations/logging.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
capture_internal_exceptions,
1212
)
1313
from sentry_sdk.integrations import Integration
14+
from sentry_sdk._compat import iteritems
1415

1516
if False:
1617
from logging import LogRecord
@@ -135,7 +136,7 @@ def _extra_from_record(record):
135136
# type: (LogRecord) -> Dict[str, None]
136137
return {
137138
k: v
138-
for k, v in vars(record).items()
139+
for k, v in iteritems(vars(record))
139140
if k not in COMMON_RECORD_ATTRS and not k.startswith("_")
140141
}
141142

sentry_sdk/integrations/pyramid.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from sentry_sdk.hub import Hub, _should_send_default_pii
1111
from sentry_sdk.utils import capture_internal_exceptions, event_from_exception
12-
from sentry_sdk._compat import reraise
12+
from sentry_sdk._compat import reraise, iteritems
1313

1414
from sentry_sdk.integrations import Integration
1515
from sentry_sdk.integrations._wsgi_common import RequestExtractor
@@ -135,15 +135,15 @@ def form(self):
135135
# type: () -> Dict[str, str]
136136
return {
137137
key: value
138-
for key, value in self.request.POST.items()
138+
for key, value in iteritems(self.request.POST)
139139
if not getattr(value, "filename", None)
140140
}
141141

142142
def files(self):
143143
# type: () -> Dict[str, cgi_FieldStorage]
144144
return {
145145
key: value
146-
for key, value in self.request.POST.items()
146+
for key, value in iteritems(self.request.POST)
147147
if getattr(value, "filename", None)
148148
}
149149

sentry_sdk/integrations/tornado.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
_is_json_content_type,
1616
)
1717
from sentry_sdk.integrations.logging import ignore_logger
18+
from sentry_sdk._compat import iteritems
1819

1920
from tornado.web import RequestHandler, HTTPError # type: ignore
2021
from tornado.gen import coroutine # type: ignore
@@ -166,7 +167,7 @@ def content_length(self):
166167

167168
def cookies(self):
168169
# type: () -> Dict
169-
return {k: v.value for k, v in self.request.cookies.items()}
170+
return {k: v.value for k, v in iteritems(self.request.cookies)}
170171

171172
def raw_data(self):
172173
# type: () -> bytes
@@ -176,7 +177,7 @@ def form(self):
176177
# type: () -> Optional[Any]
177178
return {
178179
k: [v.decode("latin1", "replace") for v in vs]
179-
for k, vs in self.request.body_arguments.items()
180+
for k, vs in iteritems(self.request.body_arguments)
180181
}
181182

182183
def is_json(self):
@@ -185,7 +186,7 @@ def is_json(self):
185186

186187
def files(self):
187188
# type: () -> Dict
188-
return {k: v[0] for k, v in self.request.files.items() if v}
189+
return {k: v[0] for k, v in iteritems(self.request.files) if v}
189190

190191
def size_of_file(self, file):
191192
return len(file.body or ())

sentry_sdk/integrations/wsgi.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from sentry_sdk.hub import Hub, _should_send_default_pii
44
from sentry_sdk.utils import capture_internal_exceptions, event_from_exception
5-
from sentry_sdk._compat import PY2, reraise
5+
from sentry_sdk._compat import PY2, reraise, iteritems
66
from sentry_sdk.tracing import SpanContext
77
from sentry_sdk.integrations._wsgi_common import _filter_headers
88

@@ -118,7 +118,7 @@ def _get_headers(environ):
118118
Returns only proper HTTP headers.
119119
120120
"""
121-
for key, value in environ.items():
121+
for key, value in iteritems(environ):
122122
key = str(key)
123123
if key.startswith("HTTP_") and key not in (
124124
"HTTP_CONTENT_TYPE",

sentry_sdk/scope.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from functools import wraps
44
from itertools import chain
55

6-
from sentry_sdk.utils import logger, capture_internal_exceptions, object_to_json
6+
from sentry_sdk.utils import logger, capture_internal_exceptions
77

88
if False:
99
from typing import Any
@@ -192,7 +192,7 @@ def _drop(event, cause, ty):
192192
event["fingerprint"] = self._fingerprint
193193

194194
if self._extras:
195-
event.setdefault("extra", {}).update(object_to_json(self._extras))
195+
event.setdefault("extra", {}).update(self._extras)
196196

197197
if self._tags:
198198
event.setdefault("tags", {}).update(self._tags)

0 commit comments

Comments
 (0)
0