From 7b52ff33a7aad9ff9a508aa533bb13bfddb21173 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Mon, 16 Oct 2023 11:01:49 +0200 Subject: [PATCH 1/6] Do not read response because we do not care about it anyways. --- sentry_sdk/transport.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sentry_sdk/transport.py b/sentry_sdk/transport.py index 12343fed0b..5d406805ef 100644 --- a/sentry_sdk/transport.py +++ b/sentry_sdk/transport.py @@ -244,7 +244,9 @@ def record_loss(reason): str(self._auth.get_api_url(endpoint_type)), body=body, headers=headers, + preload_content=False, ) + response.release_conn() except Exception: self.on_dropped_event("network") record_loss("network_error") @@ -263,9 +265,8 @@ def record_loss(reason): elif response.status >= 300 or response.status < 200: logger.error( - "Unexpected status code: %s (body: %s)", + "Unexpected status code: %s", response.status, - response.data, ) self.on_dropped_event("status_{}".format(response.status)) record_loss("network_error") From e7cb1128db7ef71325346ac179f68e00debf11c8 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Mon, 16 Oct 2023 11:02:18 +0200 Subject: [PATCH 2/6] Increase http pool size --- sentry_sdk/transport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry_sdk/transport.py b/sentry_sdk/transport.py index 5d406805ef..27edc85a1c 100644 --- a/sentry_sdk/transport.py +++ b/sentry_sdk/transport.py @@ -440,7 +440,7 @@ def _send_envelope( def _get_pool_options(self, ca_certs): # type: (Optional[Any]) -> Dict[str, Any] return { - "num_pools": 2, + "num_pools": 10, "cert_reqs": "CERT_REQUIRED", "ca_certs": ca_certs or certifi.where(), } From bd3ea8c74fe652e19e97c9dfcce5f7885259efdd Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Tue, 17 Oct 2023 11:24:06 +0200 Subject: [PATCH 3/6] Reverted because creates new tcp connection for each envelope sent. --- sentry_sdk/transport.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sentry_sdk/transport.py b/sentry_sdk/transport.py index 27edc85a1c..b55916a7ba 100644 --- a/sentry_sdk/transport.py +++ b/sentry_sdk/transport.py @@ -244,9 +244,7 @@ def record_loss(reason): str(self._auth.get_api_url(endpoint_type)), body=body, headers=headers, - preload_content=False, ) - response.release_conn() except Exception: self.on_dropped_event("network") record_loss("network_error") From fa5c2af58406b405e4986950c6a199e52d9116c9 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Tue, 17 Oct 2023 11:25:37 +0200 Subject: [PATCH 4/6] Reverted error log to previous state --- sentry_sdk/transport.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/transport.py b/sentry_sdk/transport.py index b55916a7ba..5ae10ecc2f 100644 --- a/sentry_sdk/transport.py +++ b/sentry_sdk/transport.py @@ -263,8 +263,9 @@ def record_loss(reason): elif response.status >= 300 or response.status < 200: logger.error( - "Unexpected status code: %s", + "Unexpected status code: %s (body: %s)", response.status, + response.data, ) self.on_dropped_event("status_{}".format(response.status)) record_loss("network_error") From 9b0b1f509e1435e1555420e5da11c90ab5cba826 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Tue, 17 Oct 2023 11:29:25 +0200 Subject: [PATCH 5/6] Made num_pools configurable --- sentry_sdk/consts.py | 1 + sentry_sdk/transport.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/consts.py b/sentry_sdk/consts.py index e1e6abe8f8..5500fae254 100644 --- a/sentry_sdk/consts.py +++ b/sentry_sdk/consts.py @@ -43,6 +43,7 @@ "profiler_mode": Optional[ProfilerMode], "otel_powered_performance": Optional[bool], "transport_zlib_compression_level": Optional[int], + "transport_num_pools": Optional[int], "enable_metrics": Optional[bool], "before_emit_metric": Optional[Callable[[str, MetricTags], bool]], }, diff --git a/sentry_sdk/transport.py b/sentry_sdk/transport.py index 5ae10ecc2f..f97917e1ea 100644 --- a/sentry_sdk/transport.py +++ b/sentry_sdk/transport.py @@ -170,6 +170,9 @@ def __init__( ) self._compresslevel = 9 if compresslevel is None else int(compresslevel) + num_pools = options.get("_experiments", {}).get("transport_num_pools") + self._num_pools = 2 if num_pools is None else int(num_pools) + from sentry_sdk import Hub self.hub_cls = Hub @@ -439,7 +442,7 @@ def _send_envelope( def _get_pool_options(self, ca_certs): # type: (Optional[Any]) -> Dict[str, Any] return { - "num_pools": 10, + "num_pools": self._num_pools, "cert_reqs": "CERT_REQUIRED", "ca_certs": ca_certs or certifi.where(), } From 811b4d42ac76c10567b72f0ab56edbc713769e1c Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Tue, 17 Oct 2023 11:44:12 +0200 Subject: [PATCH 6/6] Added tests --- sentry_sdk/transport.py | 16 ++++++++-------- tests/test_transport.py | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/sentry_sdk/transport.py b/sentry_sdk/transport.py index f97917e1ea..4b12287ec9 100644 --- a/sentry_sdk/transport.py +++ b/sentry_sdk/transport.py @@ -157,14 +157,6 @@ def __init__( ) # type: DefaultDict[Tuple[str, str], int] self._last_client_report_sent = time.time() - self._pool = self._make_pool( - self.parsed_dsn, - http_proxy=options["http_proxy"], - https_proxy=options["https_proxy"], - ca_certs=options["ca_certs"], - proxy_headers=options["proxy_headers"], - ) - compresslevel = options.get("_experiments", {}).get( "transport_zlib_compression_level" ) @@ -173,6 +165,14 @@ def __init__( num_pools = options.get("_experiments", {}).get("transport_num_pools") self._num_pools = 2 if num_pools is None else int(num_pools) + self._pool = self._make_pool( + self.parsed_dsn, + http_proxy=options["http_proxy"], + https_proxy=options["https_proxy"], + ca_certs=options["ca_certs"], + proxy_headers=options["proxy_headers"], + ) + from sentry_sdk import Hub self.hub_cls = Hub diff --git a/tests/test_transport.py b/tests/test_transport.py index befba3c905..602f78437c 100644 --- a/tests/test_transport.py +++ b/tests/test_transport.py @@ -132,6 +132,25 @@ def test_transport_works( assert any("Sending event" in record.msg for record in caplog.records) == debug +@pytest.mark.parametrize( + "num_pools,expected_num_pools", + ( + (None, 2), + (2, 2), + (10, 10), + ), +) +def test_transport_num_pools(make_client, num_pools, expected_num_pools): + _experiments = {} + if num_pools is not None: + _experiments["transport_num_pools"] = num_pools + + client = make_client(_experiments=_experiments) + + options = client.transport._get_pool_options([]) + assert options["num_pools"] == expected_num_pools + + def test_transport_infinite_loop(capturing_server, request, make_client): client = make_client( debug=True,