From 53637317c1ac4918798d05c9d92f8911339e916f Mon Sep 17 00:00:00 2001 From: Pridhi Arora Date: Tue, 1 Nov 2022 15:28:28 +0530 Subject: [PATCH] Adds user agent string to grpc headers --- CHANGELOG.md | 2 ++ .../exporter/otlp/proto/grpc/__init__.py | 4 ++++ .../exporter/otlp/proto/grpc/exporter.py | 7 +++++++ .../tests/test_otlp_trace_exporter.py | 11 +++++++---- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 339cdb62460..95a73fb7031 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#2997](https://github.com/open-telemetry/opentelemetry-python/pull/2997)) - Fix a bug with exporter retries for with newer versions of the backoff library ([#2980](https://github.com/open-telemetry/opentelemetry-python/pull/2980)) +- [exporter-otlp-proto-grpc] add user agent string + ([#3009](https://github.com/open-telemetry/opentelemetry-python/pull/3009)) ## Version 1.13.0/0.34b0 (2022-09-26) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/__init__.py index 0a33b6325ad..c00882db726 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/__init__.py @@ -69,3 +69,7 @@ API --- """ +from .version import __version__ + +otel_string = "OTel OTLP Exporter Python/" + __version__ +_OTLP_GRPC_HEADERS = [("user-agent", otel_string)] diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py index aef66b79dec..f9c57d8e67b 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py @@ -54,6 +54,9 @@ from opentelemetry.sdk.resources import Resource as SDKResource from opentelemetry.util.re import parse_headers from opentelemetry.sdk.metrics.export import MetricsData +from opentelemetry.exporter.otlp.proto.grpc import ( + _OTLP_GRPC_HEADERS, +) logger = getLogger(__name__) SDKDataT = TypeVar("SDKDataT") @@ -251,6 +254,10 @@ def __init__( self._headers = tuple(temp_headers.items()) elif isinstance(self._headers, dict): self._headers = tuple(self._headers.items()) + if self._headers is None: + self._headers = tuple(_OTLP_GRPC_HEADERS) + else: + self._headers = self._headers + tuple(_OTLP_GRPC_HEADERS) self._timeout = timeout or int( environ.get(OTEL_EXPORTER_OTLP_TIMEOUT, 10) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_trace_exporter.py index cfb286edee0..9272fe11d40 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_trace_exporter.py @@ -69,6 +69,8 @@ from opentelemetry.test.spantestutil import ( get_span_with_dropped_attributes_events_links, ) +from opentelemetry.exporter.otlp.proto.grpc.version import __version__ + THIS_DIR = os.path.dirname(__file__) @@ -275,21 +277,21 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure): exporter = OTLPSpanExporter() # pylint: disable=protected-access self.assertEqual( - exporter._headers, (("key1", "value1"), ("key2", "VALUE=2")) + exporter._headers, (("key1", "value1"),("key2", "VALUE=2"), ("user-agent", "OTel OTLP Exporter Python/" + __version__)) ) exporter = OTLPSpanExporter( headers=(("key3", "value3"), ("key4", "value4")) ) # pylint: disable=protected-access self.assertEqual( - exporter._headers, (("key3", "value3"), ("key4", "value4")) + exporter._headers, (("key3", "value3"), ("key4", "value4"), ("user-agent", "OTel OTLP Exporter Python/" + __version__)) ) exporter = OTLPSpanExporter( headers={"key5": "value5", "key6": "value6"} ) # pylint: disable=protected-access self.assertEqual( - exporter._headers, (("key5", "value5"), ("key6", "value6")) + exporter._headers, (("key5", "value5"), ("key6", "value6"), ("user-agent", "OTel OTLP Exporter Python/" + __version__)) ) @patch.dict( @@ -434,7 +436,8 @@ def test_otlp_exporter_otlp_compression_precendence( def test_otlp_headers(self, mock_ssl_channel, mock_secure): exporter = OTLPSpanExporter() # pylint: disable=protected-access - self.assertIsNone(exporter._headers, None) + #This ensures that there is no other header than standard user-agent. + self.assertEqual(exporter._headers, (("user-agent", "OTel OTLP Exporter Python/" + __version__),)) @patch("opentelemetry.exporter.otlp.proto.grpc.exporter.backoff") @patch("opentelemetry.exporter.otlp.proto.grpc.exporter.sleep")