From 25220c315464fb8798bfa3c73e5c5a287197f521 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Sun, 20 Sep 2020 00:42:34 -0700 Subject: [PATCH 01/27] [Issue #1107] Add gzip compression support for OTLP exporter --- .../opentelemetry/exporter/otlp/exporter.py | 18 ++++++++++++++++-- .../tests/test_otlp_trace_exporter.py | 15 ++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 079557f831..ff3259837d 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -26,6 +26,7 @@ from google.rpc.error_details_pb2 import RetryInfo from grpc import ( ChannelCredentials, + Compression, RpcError, StatusCode, insecure_channel, @@ -123,6 +124,7 @@ class OTLPExporterMixin( endpoint: OpenTelemetry Collector receiver endpoint credentials: ChannelCredentials object for server authentication metadata: Metadata to send when exporting + compression: Compression algorithm to be used in channel """ def __init__( @@ -130,16 +132,28 @@ def __init__( endpoint: str = "localhost:55680", credentials: ChannelCredentials = None, metadata: Optional[Tuple[Any]] = None, + compression: str = None, ): super().__init__() self._metadata = metadata self._collector_span_kwargs = None + if compression is "gzip": + self.compression = Compression.Gzip + else: + self.compression = Compression.NoCompression + if credentials is None: - self._client = self._stub(insecure_channel(endpoint)) + self._client = self._stub( + insecure_channel(endpoint, compression=self.compression) + ) else: - self._client = self._stub(secure_channel(endpoint, credentials)) + self._client = self._stub( + secure_channel( + endpoint, credentials, compression=self.compression + ) + ) @abstractmethod def _translate_data( diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index 06a3877b92..4e806ef3f7 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -19,7 +19,7 @@ from google.protobuf.duration_pb2 import Duration from google.rpc.error_details_pb2 import RetryInfo -from grpc import StatusCode, server +from grpc import Compression, StatusCode, server from opentelemetry.exporter.otlp.trace_exporter import OTLPSpanExporter from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( @@ -158,6 +158,19 @@ def setUp(self): def tearDown(self): self.server.stop(None) + def test_no_compression(self): + """Test default compression passed to constructor""" + exporter = OTLPSpanExporter() + + self.assertEqual(exporter.compression, Compression.NoCompression) + + def test_gzip_compression(self): + """Test the compression argument passed to constructor.""" + compression = "gzip" + exporter = OTLPSpanExporter(compression=compression) + + self.assertEqual(exporter.compression, Compression.Gzip) + @patch("opentelemetry.exporter.otlp.exporter.expo") @patch("opentelemetry.exporter.otlp.exporter.sleep") def test_unavailable(self, mock_sleep, mock_expo): From 67b577e5b02ca7d25ba11f5c7dad7bc975d255f3 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 21 Sep 2020 10:38:11 -0700 Subject: [PATCH 02/27] [Issue #1107] Fix lint error --- .../src/opentelemetry/exporter/otlp/exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index ff3259837d..fab74f5bb9 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -139,7 +139,7 @@ def __init__( self._metadata = metadata self._collector_span_kwargs = None - if compression is "gzip": + if compression == "gzip": self.compression = Compression.Gzip else: self.compression = Compression.NoCompression From a4e78b5066abbce2efec02bc36ea867b8d92b963 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 21 Sep 2020 10:41:14 -0700 Subject: [PATCH 03/27] [Issue #1107] Update changelog for OTLP exporter --- exporter/opentelemetry-exporter-otlp/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md index a3686e1a10..35792082c3 100644 --- a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md +++ b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +- Add Gzip compression for exporter + ([#1107](https://github.com/open-telemetry/opentelemetry-python/pull/1141)) + ## Version 0.13b0 Released 2020-09-17 From e2f5b0784c20238bc69e4e9b7c67da7deb278668 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Wed, 23 Sep 2020 11:13:46 -0700 Subject: [PATCH 04/27] [Issue #1107] Refactor OTLP exporter to pass compression value directly rather than through str --- .../src/opentelemetry/exporter/otlp/exporter.py | 13 +++---------- .../tests/test_otlp_trace_exporter.py | 13 ------------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index fab74f5bb9..d550705a51 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -132,27 +132,20 @@ def __init__( endpoint: str = "localhost:55680", credentials: ChannelCredentials = None, metadata: Optional[Tuple[Any]] = None, - compression: str = None, + compression: Compression = Compression.NoCompression, ): super().__init__() self._metadata = metadata self._collector_span_kwargs = None - if compression == "gzip": - self.compression = Compression.Gzip - else: - self.compression = Compression.NoCompression - if credentials is None: self._client = self._stub( - insecure_channel(endpoint, compression=self.compression) + insecure_channel(endpoint, compression=compression) ) else: self._client = self._stub( - secure_channel( - endpoint, credentials, compression=self.compression - ) + secure_channel(endpoint, credentials, compression=compression) ) @abstractmethod diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index 4e806ef3f7..efc29c6030 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -158,19 +158,6 @@ def setUp(self): def tearDown(self): self.server.stop(None) - def test_no_compression(self): - """Test default compression passed to constructor""" - exporter = OTLPSpanExporter() - - self.assertEqual(exporter.compression, Compression.NoCompression) - - def test_gzip_compression(self): - """Test the compression argument passed to constructor.""" - compression = "gzip" - exporter = OTLPSpanExporter(compression=compression) - - self.assertEqual(exporter.compression, Compression.Gzip) - @patch("opentelemetry.exporter.otlp.exporter.expo") @patch("opentelemetry.exporter.otlp.exporter.sleep") def test_unavailable(self, mock_sleep, mock_expo): From 3cb72fd57dd4c75cef20ad24f5e442a4eabc3f4d Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Wed, 23 Sep 2020 11:22:42 -0700 Subject: [PATCH 05/27] [Issue #1107] Fix unused compression import error for OTLP trace exporter test --- .../tests/test_otlp_trace_exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index efc29c6030..06a3877b92 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -19,7 +19,7 @@ from google.protobuf.duration_pb2 import Duration from google.rpc.error_details_pb2 import RetryInfo -from grpc import Compression, StatusCode, server +from grpc import StatusCode, server from opentelemetry.exporter.otlp.trace_exporter import OTLPSpanExporter from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( From 75a594e5104964ab63e6dbf65943b1cf1f789e77 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Wed, 23 Sep 2020 14:52:44 -0700 Subject: [PATCH 06/27] [Issue #1107] Change compression argument to use enum --- .../opentelemetry/exporter/otlp/exporter.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index d550705a51..9a10c941cb 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -15,13 +15,13 @@ """OTLP Exporter""" import logging +import enum from abc import ABC, abstractmethod from collections.abc import Mapping, Sequence from time import sleep from typing import Any, Callable, Dict, Generic, List, Optional from typing import Sequence as TypingSequence from typing import Text, Tuple, TypeVar - from backoff import expo from google.rpc.error_details_pb2 import RetryInfo from grpc import ( @@ -45,6 +45,11 @@ ExportResultT = TypeVar("ExportResultT") +class GRPCCompression(enum.Enum): + DEFAULT = 0 + GZIP = 1 + + def _translate_key_values(key: Text, value: Any) -> KeyValue: if isinstance(value, bool): @@ -132,20 +137,25 @@ def __init__( endpoint: str = "localhost:55680", credentials: ChannelCredentials = None, metadata: Optional[Tuple[Any]] = None, - compression: Compression = Compression.NoCompression, + compression: enum.Enum = GRPCCompression.DEFAULT, ): super().__init__() self._metadata = metadata self._collector_span_kwargs = None + if compression is GRPCCompression.DEFAULT: + compression_algorithm = Compression.NoCompression + elif compression is GRPCCompression.GZIP: + compression_algorithm = Compression.Gzip + if credentials is None: self._client = self._stub( - insecure_channel(endpoint, compression=compression) + insecure_channel(endpoint, compression=compression_algorithm) ) else: self._client = self._stub( - secure_channel(endpoint, credentials, compression=compression) + secure_channel(endpoint, credentials, compression=compression_algorithm) ) @abstractmethod From 5847ac229598cfd16b49683d2bab81919bef6b85 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Wed, 23 Sep 2020 15:19:49 -0700 Subject: [PATCH 07/27] [Issue #1107] Fix lint error --- .../src/opentelemetry/exporter/otlp/exporter.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 9a10c941cb..2330ef2ebc 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -14,14 +14,15 @@ """OTLP Exporter""" -import logging import enum +import logging from abc import ABC, abstractmethod from collections.abc import Mapping, Sequence from time import sleep from typing import Any, Callable, Dict, Generic, List, Optional from typing import Sequence as TypingSequence from typing import Text, Tuple, TypeVar + from backoff import expo from google.rpc.error_details_pb2 import RetryInfo from grpc import ( @@ -155,7 +156,9 @@ def __init__( ) else: self._client = self._stub( - secure_channel(endpoint, credentials, compression=compression_algorithm) + secure_channel( + endpoint, credentials, compression=compression_algorithm + ) ) @abstractmethod From a88df17a40614968ccfedcbde187aa1277e7b116 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Thu, 24 Sep 2020 13:12:02 -0700 Subject: [PATCH 08/27] [Issue #1107] Change doc-string for compression argument and modify Enum value from DEFAULT to NO_COMPRESSION --- .../src/opentelemetry/exporter/otlp/exporter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 2330ef2ebc..aba5b428fd 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -47,7 +47,7 @@ class GRPCCompression(enum.Enum): - DEFAULT = 0 + NO_COMPRESSION = 0 GZIP = 1 @@ -138,14 +138,14 @@ def __init__( endpoint: str = "localhost:55680", credentials: ChannelCredentials = None, metadata: Optional[Tuple[Any]] = None, - compression: enum.Enum = GRPCCompression.DEFAULT, + compression: GRPCCompression = GRPCCompression.NO_COMPRESSION, ): super().__init__() self._metadata = metadata self._collector_span_kwargs = None - if compression is GRPCCompression.DEFAULT: + if compression is GRPCCompression.NO_COMPRESSION: compression_algorithm = Compression.NoCompression elif compression is GRPCCompression.GZIP: compression_algorithm = Compression.Gzip From 2c358f34e5fb0e0897a5798cab4fa7131e4fb9dd Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Thu, 24 Sep 2020 15:50:40 -0700 Subject: [PATCH 09/27] [Issue #1107] Add environment variable support for gzip compression --- .../src/opentelemetry/exporter/otlp/exporter.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index aba5b428fd..309128c5dd 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -16,6 +16,7 @@ import enum import logging +import os from abc import ABC, abstractmethod from collections.abc import Mapping, Sequence from time import sleep @@ -145,10 +146,17 @@ def __init__( self._metadata = metadata self._collector_span_kwargs = None - if compression is GRPCCompression.NO_COMPRESSION: - compression_algorithm = Compression.NoCompression - elif compression is GRPCCompression.GZIP: + compression_str = os.environ.get( + "OTEL_EXPORTER_OTLP_COMPRESSION", None + ) + + if compression_str == "gzip": compression_algorithm = Compression.Gzip + else: + if compression is GRPCCompression.NO_COMPRESSION: + compression_algorithm = Compression.NoCompression + elif compression is GRPCCompression.GZIP: + compression_algorithm = Compression.Gzip if credentials is None: self._client = self._stub( From 5cc9bf7332d414c1c3e45f630e52a154e105291b Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 28 Sep 2020 09:50:49 -0700 Subject: [PATCH 10/27] Update exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py Co-authored-by: Aaron Abbott --- .../src/opentelemetry/exporter/otlp/exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 309128c5dd..619e0a65a9 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -47,7 +47,7 @@ ExportResultT = TypeVar("ExportResultT") -class GRPCCompression(enum.Enum): +class OTLPCompression(enum.Enum): NO_COMPRESSION = 0 GZIP = 1 From 36141e4335630790098dcf158af77f1e8b5b1c20 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 28 Sep 2020 10:16:32 -0700 Subject: [PATCH 11/27] [Issue #1107] Change Enum from type GRPCCompression to OTLPCompression --- .../src/opentelemetry/exporter/otlp/exporter.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 619e0a65a9..a70e4ef119 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -48,8 +48,8 @@ class OTLPCompression(enum.Enum): - NO_COMPRESSION = 0 - GZIP = 1 + NO_COMPRESSION = "no_compression" + GZIP = "gzip" def _translate_key_values(key: Text, value: Any) -> KeyValue: @@ -139,7 +139,7 @@ def __init__( endpoint: str = "localhost:55680", credentials: ChannelCredentials = None, metadata: Optional[Tuple[Any]] = None, - compression: GRPCCompression = GRPCCompression.NO_COMPRESSION, + compression: OTLPCompression = OTLPCompression.NO_COMPRESSION, ): super().__init__() @@ -153,9 +153,9 @@ def __init__( if compression_str == "gzip": compression_algorithm = Compression.Gzip else: - if compression is GRPCCompression.NO_COMPRESSION: + if compression is OTLPCompression.NO_COMPRESSION: compression_algorithm = Compression.NoCompression - elif compression is GRPCCompression.GZIP: + elif compression is OTLPCompression.GZIP: compression_algorithm = Compression.Gzip if credentials is None: From 004296266e14db848106d37dd3c3243c358f7868 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Thu, 1 Oct 2020 10:01:30 -0700 Subject: [PATCH 12/27] Change priority for compression argument over environment variable --- .../src/opentelemetry/exporter/otlp/exporter.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index a70e4ef119..01e02866c2 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -146,17 +146,16 @@ def __init__( self._metadata = metadata self._collector_span_kwargs = None - compression_str = os.environ.get( - "OTEL_EXPORTER_OTLP_COMPRESSION", None - ) - - if compression_str == "gzip": + if compression == OTLPCompression.GZIP: compression_algorithm = Compression.Gzip else: - if compression is OTLPCompression.NO_COMPRESSION: - compression_algorithm = Compression.NoCompression - elif compression is OTLPCompression.GZIP: + compression_str = os.environ.get( + "OTEL_EXPORTER_OTLP_COMPRESSION", None + ) + if compression_str == "gzip": compression_algorithm = Compression.Gzip + else: + compression_algorithm = Compression.NoCompression if credentials is None: self._client = self._stub( From 7285fd5976a4b5f77046564e94301c4bcbf9676f Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Thu, 1 Oct 2020 13:10:28 -0700 Subject: [PATCH 13/27] Update exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py Co-authored-by: alrex --- .../src/opentelemetry/exporter/otlp/exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 01e02866c2..c000846af7 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -152,7 +152,7 @@ def __init__( compression_str = os.environ.get( "OTEL_EXPORTER_OTLP_COMPRESSION", None ) - if compression_str == "gzip": + if compression_str == OTLPCompression.GZIP: compression_algorithm = Compression.Gzip else: compression_algorithm = Compression.NoCompression From 842bfb7cbe2e996c0ccfc38469ef5362cfb90589 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Thu, 1 Oct 2020 14:24:13 -0700 Subject: [PATCH 14/27] Update exporter/opentelemetry-exporter-otlp/CHANGELOG.md Co-authored-by: Leighton Chen --- exporter/opentelemetry-exporter-otlp/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md index bfadacd2d8..78509e459d 100644 --- a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md +++ b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md @@ -3,7 +3,7 @@ ## Unreleased - Add Gzip compression for exporter - ([#1107](https://github.com/open-telemetry/opentelemetry-python/pull/1141)) + ([#1141](https://github.com/open-telemetry/opentelemetry-python/pull/1141)) - Update OpenTelemetry protos to v0.5.0 ([#1143](https://github.com/open-telemetry/opentelemetry-python/pull/1143)) From fc84520224a9778df2dc69648440d32315f3a33b Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Tue, 6 Oct 2020 01:01:19 -0700 Subject: [PATCH 15/27] [WIP] Add tests for OTLP compression --- .../tests/test_otlp_trace_exporter.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index dcc0239798..acef40c395 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -19,7 +19,7 @@ from google.protobuf.duration_pb2 import Duration from google.rpc.error_details_pb2 import RetryInfo -from grpc import StatusCode, server +from grpc import Compression, StatusCode, server from opentelemetry.exporter.otlp.trace_exporter import OTLPSpanExporter from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( @@ -157,6 +157,19 @@ def setUp(self): def tearDown(self): self.server.stop(None) + def test_gzip_compression(self): + mock_get_compression = mock.Mock() + patch = mock.patch( + "opentelemetry.exporter.otlp.trace_exporter", + side_effect=mock_get_compression, + ) + compression = Compression.Gzip + with patch: + exporter = OTLPSpanExporter(compression="gzip") + + self.assertEqual(exporter.compression, compression) + + @patch("opentelemetry.exporter.otlp.exporter.expo") @patch("opentelemetry.exporter.otlp.exporter.sleep") def test_unavailable(self, mock_sleep, mock_expo): From d300df28d6dc18580c142a603f30d69f02b737e7 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Wed, 7 Oct 2020 10:46:42 -0700 Subject: [PATCH 16/27] [WIP] Add tests for OTLP Exporter compression --- .../tests/test_otlp_trace_exporter.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index acef40c395..4d9ec5e65e 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -16,6 +16,7 @@ from concurrent.futures import ThreadPoolExecutor from unittest import TestCase from unittest.mock import Mock, PropertyMock, patch +from unittest import mock from google.protobuf.duration_pb2 import Duration from google.rpc.error_details_pb2 import RetryInfo @@ -158,17 +159,12 @@ def tearDown(self): self.server.stop(None) def test_gzip_compression(self): - mock_get_compression = mock.Mock() - patch = mock.patch( - "opentelemetry.exporter.otlp.trace_exporter", - side_effect=mock_get_compression, - ) - compression = Compression.Gzip - with patch: + with mock.patch( + 'grpc.insecure_channel' + ) as channel_mock: exporter = OTLPSpanExporter(compression="gzip") - - self.assertEqual(exporter.compression, compression) - + exporter.shutdown() + self.assertTrue(channel_mock.assert_called_with("localhost:55680", Compression.Gzip)) @patch("opentelemetry.exporter.otlp.exporter.expo") @patch("opentelemetry.exporter.otlp.exporter.sleep") From 14f6635ef6905420928bcba7b5886491e95cff55 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Thu, 15 Oct 2020 15:45:10 -0700 Subject: [PATCH 17/27] WIP Add test cases for otlp compression --- .../opentelemetry/exporter/otlp/exporter.py | 10 ++++--- .../tests/test_otlp_trace_exporter.py | 26 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index c000846af7..034643d762 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -139,14 +139,14 @@ def __init__( endpoint: str = "localhost:55680", credentials: ChannelCredentials = None, metadata: Optional[Tuple[Any]] = None, - compression: OTLPCompression = OTLPCompression.NO_COMPRESSION, + compression: str = None, ): super().__init__() self._metadata = metadata self._collector_span_kwargs = None - if compression == OTLPCompression.GZIP: + if compression is OTLPCompression.GZIP: compression_algorithm = Compression.Gzip else: compression_str = os.environ.get( @@ -158,9 +158,13 @@ def __init__( compression_algorithm = Compression.NoCompression if credentials is None: + self.channel = insecure_channel(endpoint, compression=compression_algorithm) self._client = self._stub( - insecure_channel(endpoint, compression=compression_algorithm) + channel=self.channel ) + print("=========") + print(repr(self._client)) + print("=========") else: self._client = self._stub( secure_channel( diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index 4d9ec5e65e..16e4634943 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -20,7 +20,7 @@ from google.protobuf.duration_pb2 import Duration from google.rpc.error_details_pb2 import RetryInfo -from grpc import Compression, StatusCode, server +from grpc import Compression, StatusCode, server, insecure_channel from opentelemetry.exporter.otlp.trace_exporter import OTLPSpanExporter from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( @@ -159,12 +159,24 @@ def tearDown(self): self.server.stop(None) def test_gzip_compression(self): - with mock.patch( - 'grpc.insecure_channel' - ) as channel_mock: - exporter = OTLPSpanExporter(compression="gzip") - exporter.shutdown() - self.assertTrue(channel_mock.assert_called_with("localhost:55680", Compression.Gzip)) + # with mock.patch( + # 'grpc.insecure_channel' + # ) as channel_mock: + # exporter = OTLPSpanExporter(compression="gzip") + # exporter.shutdown() + # self.assertTrue(channel_mock.assert_called_with("localhost:55680", Compression.Gzip)) + mock_get_compression = mock.Mock() + patch = mock.patch( + "grpc.insecure_channel", + side_effect=mock_get_compression, + ) + endpoint = "localhost:55680" + channel = insecure_channel("") + with patch: + exporter = OTLPSpanExporter() + # mock_get_compression.assert_called_with(channel) + self.assertEqual.__self__.maxDiff = None + self.assertEqual(vars(exporter.channel), vars(channel)) @patch("opentelemetry.exporter.otlp.exporter.expo") @patch("opentelemetry.exporter.otlp.exporter.sleep") From 464ded3e15e3e58b985419b87aed57c7bce69ba8 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Sat, 24 Oct 2020 23:46:34 -0700 Subject: [PATCH 18/27] Add environment variable to docs, fix enum parsing for OTLPCompression and removed compression tests --- .../opentelemetry/exporter/otlp/__init__.py | 10 +++++++++ .../opentelemetry/exporter/otlp/exporter.py | 21 +++++++++---------- .../tests/test_otlp_trace_exporter.py | 20 ------------------ 3 files changed, 20 insertions(+), 31 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/__init__.py index a4d8f46d4c..3aca014eda 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/__init__.py @@ -26,6 +26,16 @@ .. _OTLP: https://github.com/open-telemetry/opentelemetry-collector/ .. _OpenTelemetry: https://github.com/open-telemetry/opentelemetry-python/ +.. envvar:: OTEL_EXPORTER_OTLP_COMPRESSION + +The :envvar:`OTEL_EXPORTER_OTLP_COMPRESSION` environment variable allows a +compression algorithm to be passed to the OTLP exporter. The compression +algorithms that are supported include gzip and no compression. The value should +be in the format of a string "gzip" for gzip compression, and no value specified +if no compression is the desired choice. +Additional details are available `in the specification +`_. + .. code:: python from opentelemetry import trace diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 034643d762..679d450bfd 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -48,8 +48,7 @@ class OTLPCompression(enum.Enum): - NO_COMPRESSION = "no_compression" - GZIP = "gzip" + gzip = "gzip" def _translate_key_values(key: Text, value: Any) -> KeyValue: @@ -146,25 +145,25 @@ def __init__( self._metadata = metadata self._collector_span_kwargs = None - if compression is OTLPCompression.GZIP: + if compression is None: + compression_algorithm = Compression.NoCompression + elif compression in OTLPCompression._value2member_map_ and OTLPCompression(compression) is OTLPCompression.gzip: compression_algorithm = Compression.Gzip else: compression_str = os.environ.get( "OTEL_EXPORTER_OTLP_COMPRESSION", None ) - if compression_str == OTLPCompression.GZIP: - compression_algorithm = Compression.Gzip - else: + if compression_str is None: compression_algorithm = Compression.NoCompression + elif compression_str in OTLPCompression._value2member_map_ and OTLPCompression(compression_str) is OTLPCompression.gzip: + compression_algorithm = Compression.Gzip + else: + raise ValueError("OTEL_EXPORTER_OTLP_COMPRESSION environment variable does not match gzip.") if credentials is None: - self.channel = insecure_channel(endpoint, compression=compression_algorithm) self._client = self._stub( - channel=self.channel + channel=insecure_channel(endpoint, compression=compression_algorithm) ) - print("=========") - print(repr(self._client)) - print("=========") else: self._client = self._stub( secure_channel( diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index 16e4634943..bf63831ed9 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -158,26 +158,6 @@ def setUp(self): def tearDown(self): self.server.stop(None) - def test_gzip_compression(self): - # with mock.patch( - # 'grpc.insecure_channel' - # ) as channel_mock: - # exporter = OTLPSpanExporter(compression="gzip") - # exporter.shutdown() - # self.assertTrue(channel_mock.assert_called_with("localhost:55680", Compression.Gzip)) - mock_get_compression = mock.Mock() - patch = mock.patch( - "grpc.insecure_channel", - side_effect=mock_get_compression, - ) - endpoint = "localhost:55680" - channel = insecure_channel("") - with patch: - exporter = OTLPSpanExporter() - # mock_get_compression.assert_called_with(channel) - self.assertEqual.__self__.maxDiff = None - self.assertEqual(vars(exporter.channel), vars(channel)) - @patch("opentelemetry.exporter.otlp.exporter.expo") @patch("opentelemetry.exporter.otlp.exporter.sleep") def test_unavailable(self, mock_sleep, mock_expo): From 48719377f81a963711c34b62b96075e748269b03 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Sun, 25 Oct 2020 00:40:37 -0700 Subject: [PATCH 19/27] Fix lint errors --- .../opentelemetry/exporter/otlp/exporter.py | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 679d450bfd..2ff27cfbdd 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -145,9 +145,12 @@ def __init__( self._metadata = metadata self._collector_span_kwargs = None - if compression is None: + if compression is None: compression_algorithm = Compression.NoCompression - elif compression in OTLPCompression._value2member_map_ and OTLPCompression(compression) is OTLPCompression.gzip: + elif ( + compression in OTLPCompression._value2member_map_ + and OTLPCompression(compression) is OTLPCompression.gzip + ): compression_algorithm = Compression.Gzip else: compression_str = os.environ.get( @@ -155,14 +158,21 @@ def __init__( ) if compression_str is None: compression_algorithm = Compression.NoCompression - elif compression_str in OTLPCompression._value2member_map_ and OTLPCompression(compression_str) is OTLPCompression.gzip: - compression_algorithm = Compression.Gzip + elif ( + compression_str in OTLPCompression._value2member_map_ + and OTLPCompression(compression_str) is OTLPCompression.gzip + ): + compression_algorithm = Compression.Gzip else: - raise ValueError("OTEL_EXPORTER_OTLP_COMPRESSION environment variable does not match gzip.") + raise ValueError( + "OTEL_EXPORTER_OTLP_COMPRESSION environment variable does not match gzip." + ) if credentials is None: self._client = self._stub( - channel=insecure_channel(endpoint, compression=compression_algorithm) + channel=insecure_channel( + endpoint, compression=compression_algorithm + ) ) else: self._client = self._stub( From c411c42824591b1b786c9adfb1bd57c79c3f8048 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Sun, 25 Oct 2020 00:52:12 -0700 Subject: [PATCH 20/27] Fix lint errors for OTLP test file --- .../tests/test_otlp_trace_exporter.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index 51d67da04a..e29afd80e8 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -14,13 +14,12 @@ from collections import OrderedDict from concurrent.futures import ThreadPoolExecutor -from unittest import TestCase +from unittest import TestCase, mock from unittest.mock import Mock, PropertyMock, patch -from unittest import mock from google.protobuf.duration_pb2 import Duration from google.rpc.error_details_pb2 import RetryInfo -from grpc import Compression, StatusCode, server, insecure_channel +from grpc import Compression, StatusCode, insecure_channel, server from opentelemetry.exporter.otlp.trace_exporter import OTLPSpanExporter from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( From 42982f363256b9f7f632871cd14c18608f2ae972 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Sun, 25 Oct 2020 23:13:48 -0700 Subject: [PATCH 21/27] Delete unnecessary imports from OTLP trace exporter test --- .../tests/test_otlp_trace_exporter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index e29afd80e8..e8c449c9df 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -14,12 +14,12 @@ from collections import OrderedDict from concurrent.futures import ThreadPoolExecutor -from unittest import TestCase, mock +from unittest import TestCase from unittest.mock import Mock, PropertyMock, patch from google.protobuf.duration_pb2 import Duration from google.rpc.error_details_pb2 import RetryInfo -from grpc import Compression, StatusCode, insecure_channel, server +from grpc import StatusCode, server from opentelemetry.exporter.otlp.trace_exporter import OTLPSpanExporter from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( From e1fab0b9af172bffd22c9a2ab1a1b75e703ec1da Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 2 Nov 2020 14:21:47 -0800 Subject: [PATCH 22/27] Fix lint errors --- .../src/opentelemetry/exporter/otlp/exporter.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 14faca3f97..db8fb072dd 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -22,7 +22,7 @@ from time import sleep from typing import Any, Callable, Dict, Generic, List, Optional from typing import Sequence as TypingSequence -from typing import Text, Tuple, TypeVar +from typing import Text, TypeVar from backoff import expo from google.rpc.error_details_pb2 import RetryInfo @@ -202,12 +202,20 @@ def __init__( ) if insecure: - self._client = self._stub(insecure_channel(endpoint, endpoint, compression=compression_algorithm)) + self._client = self._stub( + insecure_channel( + endpoint, endpoint, compression=compression_algorithm + ) + ) else: credentials = credentials or _load_credential_from_file( Configuration().EXPORTER_OTLP_CERTIFICATE ) - self._client = self._stub(secure_channel(endpoint, credentials, compression=compression_algorithm)) + self._client = self._stub( + secure_channel( + endpoint, credentials, compression=compression_algorithm + ) + ) @abstractmethod def _translate_data( From 508359106dc6e96ae4736a07e602b2c662bf6bf7 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 2 Nov 2020 14:34:54 -0800 Subject: [PATCH 23/27] Fix arguments for insecure_channel and lint error --- .../src/opentelemetry/exporter/otlp/exporter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index db8fb072dd..e6c0373459 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -177,7 +177,6 @@ def __init__( ) self._collector_span_kwargs = None - if compression is None: compression_algorithm = Compression.NoCompression elif ( @@ -204,7 +203,7 @@ def __init__( if insecure: self._client = self._stub( insecure_channel( - endpoint, endpoint, compression=compression_algorithm + endpoint, compression=compression_algorithm ) ) else: From cf5a5e68baef83b9ba127d34530046d1f67e4c36 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 2 Nov 2020 14:38:51 -0800 Subject: [PATCH 24/27] Change compression environment variable to use Configuration() --- .../src/opentelemetry/exporter/otlp/exporter.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index e6c0373459..4b7b0d2934 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -185,9 +185,7 @@ def __init__( ): compression_algorithm = Compression.Gzip else: - compression_str = os.environ.get( - "OTEL_EXPORTER_OTLP_COMPRESSION", None - ) + compression_str = Configuration().EXPORTER_OTLP_INSECURE or None if compression_str is None: compression_algorithm = Compression.NoCompression elif ( From 6e6a528505379088b6244019de448b9494e5c9a3 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 2 Nov 2020 14:42:30 -0800 Subject: [PATCH 25/27] Fix lint error --- .../src/opentelemetry/exporter/otlp/exporter.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 4b7b0d2934..4f9984a26b 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -200,9 +200,7 @@ def __init__( if insecure: self._client = self._stub( - insecure_channel( - endpoint, compression=compression_algorithm - ) + insecure_channel(endpoint, compression=compression_algorithm) ) else: credentials = credentials or _load_credential_from_file( From 965f0e98c46cdec4a4de9808d1fc15b539dae99d Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 2 Nov 2020 14:51:16 -0800 Subject: [PATCH 26/27] Remove unused os import for OTLP Exporter --- .../src/opentelemetry/exporter/otlp/exporter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 4f9984a26b..8a569e79b1 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -16,7 +16,6 @@ import enum import logging -import os from abc import ABC, abstractmethod from collections.abc import Mapping, Sequence from time import sleep From dba61432f3b909f209d2955745b0a05f20222660 Mon Sep 17 00:00:00 2001 From: Wilbert Guo Date: Mon, 2 Nov 2020 15:46:26 -0800 Subject: [PATCH 27/27] Update exporter/opentelemetry-exporter-otlp/CHANGELOG.md Co-authored-by: Aaron Abbott --- exporter/opentelemetry-exporter-otlp/CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md index 5934811c1d..4233ddded0 100644 --- a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md +++ b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md @@ -2,7 +2,6 @@ ## Unreleased -gzip-compression-feature - Add Gzip compression for exporter ([#1141](https://github.com/open-telemetry/opentelemetry-python/pull/1141)) ## Version 0.15b0