Skip to content

Commit 63ad286

Browse files
fix(config): cover OTLP HTTP deflate for logs
Signed-off-by: Asish Kumar <officialasishkumar@gmail.com>
1 parent f74b5c7 commit 63ad286

File tree

4 files changed

+44
-28
lines changed

4 files changed

+44
-28
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2121
- Drop Python 3.9 support
2222
([#5076](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/5076))
2323
- `opentelemetry-sdk`: Allow declarative OTLP HTTP exporters to map `compression: deflate` instead of rejecting it as unsupported
24+
([#5075](https://github.com/open-telemetry/opentelemetry-python/pull/5075))
2425

2526
## Version 1.41.0/0.62b0 (2026-04-09)
2627

opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,25 +52,27 @@ def _parse_headers(
5252

5353

5454
def _map_compression(
55-
value: Optional[str],
55+
value: str | None,
5656
compression_enum: type,
5757
*,
5858
allow_deflate: bool = False,
59-
) -> Optional[object]:
59+
) -> object | None:
6060
"""Map a compression string to the given Compression enum value."""
61-
if value is None or value.lower() == "none":
61+
if value is None:
6262
return None
63-
if value.lower() == "gzip":
63+
64+
value_lower = value.lower()
65+
supports_deflate = allow_deflate and hasattr(compression_enum, "Deflate")
66+
67+
if value_lower == "none":
68+
return None
69+
if value_lower == "gzip":
6470
return compression_enum.Gzip # type: ignore[attr-defined]
65-
if (
66-
value.lower() == "deflate"
67-
and allow_deflate
68-
and hasattr(compression_enum, "Deflate")
69-
):
71+
if value_lower == "deflate" and supports_deflate:
7072
return compression_enum.Deflate # type: ignore[attr-defined]
7173

7274
supported_values = ["'gzip'", "'none'"]
73-
if allow_deflate and hasattr(compression_enum, "Deflate"):
75+
if supports_deflate:
7476
supported_values.insert(1, "'deflate'")
7577

7678
raise ConfigurationError(

opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
from __future__ import annotations
1616

1717
import logging
18-
from typing import Optional
19-
2018
from opentelemetry._logs import set_logger_provider
21-
from opentelemetry.sdk._configuration._common import _parse_headers
19+
from opentelemetry.sdk._configuration._common import (
20+
_map_compression,
21+
_parse_headers,
22+
)
2223
from opentelemetry.sdk._configuration._exceptions import ConfigurationError
2324
from opentelemetry.sdk._configuration.models import (
2425
BatchLogRecordProcessor as BatchLogRecordProcessorConfig,
@@ -58,20 +59,6 @@
5859
_DEFAULT_MAX_QUEUE_SIZE = 2048
5960
_DEFAULT_MAX_EXPORT_BATCH_SIZE = 512
6061

61-
62-
def _map_compression(
63-
value: Optional[str], compression_enum: type
64-
) -> Optional[object]:
65-
"""Map a compression string to the given Compression enum value."""
66-
if value is None or value.lower() == "none":
67-
return None
68-
if value.lower() == "gzip":
69-
return compression_enum.Gzip # type: ignore[attr-defined]
70-
raise ConfigurationError(
71-
f"Unsupported compression value '{value}'. Supported values: 'gzip', 'none'."
72-
)
73-
74-
7562
def _create_console_log_exporter() -> ConsoleLogRecordExporter:
7663
"""Create a ConsoleLogRecordExporter."""
7764
return ConsoleLogRecordExporter()
@@ -95,7 +82,9 @@ def _create_otlp_http_log_exporter(
9582
"Install it with: pip install opentelemetry-exporter-otlp-proto-http"
9683
) from exc
9784

98-
compression = _map_compression(config.compression, Compression)
85+
compression = _map_compression(
86+
config.compression, Compression, allow_deflate=True
87+
)
9988
headers = _parse_headers(config.headers, config.headers_list)
10089
timeout = (config.timeout / 1000.0) if config.timeout is not None else None
10190

opentelemetry-sdk/tests/_configuration/test_logger_provider.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,30 @@ def test_otlp_http_exporter_headers(self):
323323
call_kwargs = mock_exporter_cls.call_args.kwargs
324324
self.assertEqual(call_kwargs["headers"], {"x-api-key": "secret"})
325325

326+
def test_otlp_http_exporter_deflate_compression(self):
327+
mock_exporter_cls = MagicMock()
328+
mock_compression_cls = MagicMock()
329+
mock_compression_cls.Deflate = "deflate"
330+
mock_module = MagicMock()
331+
mock_module.Compression = mock_compression_cls
332+
mock_log_module = MagicMock()
333+
mock_log_module.OTLPLogExporter = mock_exporter_cls
334+
335+
with patch.dict(
336+
sys.modules,
337+
{
338+
"opentelemetry.exporter.otlp.proto.http": mock_module,
339+
"opentelemetry.exporter.otlp.proto.http._log_exporter": mock_log_module,
340+
},
341+
):
342+
config = LogRecordExporterConfig(
343+
otlp_http=OtlpHttpExporterConfig(compression="deflate")
344+
)
345+
_create_log_record_exporter(config)
346+
347+
call_kwargs = mock_exporter_cls.call_args.kwargs
348+
self.assertEqual(call_kwargs["compression"], "deflate")
349+
326350
def test_otlp_grpc_exporter_endpoint(self):
327351
mock_exporter_cls = MagicMock()
328352
mock_grpc = MagicMock()

0 commit comments

Comments
 (0)