From fce799d75bebf27b6668cdff472288046f8824b6 Mon Sep 17 00:00:00 2001 From: Mika Senghaas Date: Thu, 29 Oct 2026 22:16:28 +0000 Subject: [PATCH] gzip trace uploads at level 1 The upload thread spent ~70 ms of its ~78 ms per 2 MB episode in gzip at the default level 9, so it fell behind a fast producer and the upload queue dropped episodes. Level 1 is ~9x faster for ~13% more bytes on the wire. Co-Authored-By: Claude Opus 5.5 --- .../prime-traces/src/prime_traces/core/async_client.py | 7 ++++--- packages/prime-traces/src/prime_traces/core/client.py | 9 ++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/prime-traces/src/prime_traces/core/async_client.py b/packages/prime-traces/src/prime_traces/core/async_client.py index ec6c88c83..16ce9a91b 100644 --- a/packages/prime-traces/src/prime_traces/core/async_client.py +++ b/packages/prime-traces/src/prime_traces/core/async_client.py @@ -11,6 +11,7 @@ from .client import ( AMBIGUOUS_TRANSPORT_ERRORS, DEFAULT_TIMEOUT, + GZIP_LEVEL, IDEMPOTENT_RETRY_ATTEMPTS, BaseTracesAPIClient, is_ambiguous_delete_failure, @@ -95,9 +96,9 @@ async def upload_batch( self._check_auth() # mtime=0 keeps the compressed bytes reproducible across retries. - compressed = ( - await asyncio.to_thread(gzip_module.compress, body, mtime=0) if compress else None - ) + compressed = None + if compress: + compressed = await asyncio.to_thread(gzip_module.compress, body, GZIP_LEVEL, mtime=0) files = self._multipart_files( body, schema_version=schema_version, context=context, compressed=compressed ) diff --git a/packages/prime-traces/src/prime_traces/core/client.py b/packages/prime-traces/src/prime_traces/core/client.py index a3edffc5b..d76ec80ab 100644 --- a/packages/prime-traces/src/prime_traces/core/client.py +++ b/packages/prime-traces/src/prime_traces/core/client.py @@ -48,6 +48,11 @@ #: budget — see ``TracesClient._send_with_retry``. IDEMPOTENT_RETRY_ATTEMPTS = 3 +#: Gzip level for upload bodies. Level 1 compresses a multi-MB episode about 9x +#: faster than the default 9 for ~13% more bytes; the upload thread is otherwise +#: CPU-bound on compression and falls behind a fast producer. +GZIP_LEVEL = 1 + #: Retryable statuses that leave it unknown whether the request reached the #: service. 502/504 come from a gateway, which may already have forwarded the #: request upstream and then lost or timed out the response. @@ -379,7 +384,9 @@ def upload_batch( self._check_auth() # mtime=0 keeps the compressed bytes reproducible across retries. - compressed = gzip_module.compress(body, mtime=0) if compress else None + compressed = None + if compress: + compressed = gzip_module.compress(body, compresslevel=GZIP_LEVEL, mtime=0) files = self._multipart_files( body, schema_version=schema_version, context=context, compressed=compressed )