Skip to content

Commit d8634d0

Browse files
authored
Mitigate CPU spikes when sending lots of events with lots of data (#2449)
Increasing the HTTP pool size to better handle the requests. This does not fix all CPU spikes, but instead of spikes happening every 1 in 3-4 times it only happens 1 in 7-8 times with my test script.
1 parent fee865c commit d8634d0

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

sentry_sdk/consts.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"profiler_mode": Optional[ProfilerMode],
4444
"otel_powered_performance": Optional[bool],
4545
"transport_zlib_compression_level": Optional[int],
46+
"transport_num_pools": Optional[int],
4647
"enable_metrics": Optional[bool],
4748
"before_emit_metric": Optional[Callable[[str, MetricTags], bool]],
4849
},

sentry_sdk/transport.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@ def __init__(
157157
) # type: DefaultDict[Tuple[str, str], int]
158158
self._last_client_report_sent = time.time()
159159

160+
compresslevel = options.get("_experiments", {}).get(
161+
"transport_zlib_compression_level"
162+
)
163+
self._compresslevel = 9 if compresslevel is None else int(compresslevel)
164+
165+
num_pools = options.get("_experiments", {}).get("transport_num_pools")
166+
self._num_pools = 2 if num_pools is None else int(num_pools)
167+
160168
self._pool = self._make_pool(
161169
self.parsed_dsn,
162170
http_proxy=options["http_proxy"],
@@ -165,11 +173,6 @@ def __init__(
165173
proxy_headers=options["proxy_headers"],
166174
)
167175

168-
compresslevel = options.get("_experiments", {}).get(
169-
"transport_zlib_compression_level"
170-
)
171-
self._compresslevel = 9 if compresslevel is None else int(compresslevel)
172-
173176
from sentry_sdk import Hub
174177

175178
self.hub_cls = Hub
@@ -439,7 +442,7 @@ def _send_envelope(
439442
def _get_pool_options(self, ca_certs):
440443
# type: (Optional[Any]) -> Dict[str, Any]
441444
return {
442-
"num_pools": 2,
445+
"num_pools": self._num_pools,
443446
"cert_reqs": "CERT_REQUIRED",
444447
"ca_certs": ca_certs or certifi.where(),
445448
}

tests/test_transport.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,25 @@ def test_transport_works(
132132
assert any("Sending event" in record.msg for record in caplog.records) == debug
133133

134134

135+
@pytest.mark.parametrize(
136+
"num_pools,expected_num_pools",
137+
(
138+
(None, 2),
139+
(2, 2),
140+
(10, 10),
141+
),
142+
)
143+
def test_transport_num_pools(make_client, num_pools, expected_num_pools):
144+
_experiments = {}
145+
if num_pools is not None:
146+
_experiments["transport_num_pools"] = num_pools
147+
148+
client = make_client(_experiments=_experiments)
149+
150+
options = client.transport._get_pool_options([])
151+
assert options["num_pools"] == expected_num_pools
152+
153+
135154
def test_transport_infinite_loop(capturing_server, request, make_client):
136155
client = make_client(
137156
debug=True,

0 commit comments

Comments
 (0)