diff --git a/CHANGELOG.md b/CHANGELOG.md index 4541f191293..6bb6b0c7016 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([3124](https://github.com/open-telemetry/opentelemetry-python/pull/3124)) - Add db metric name to semantic conventions ([#3115](https://github.com/open-telemetry/opentelemetry-python/pull/3115)) - +- Fix User-Agent header value for OTLP exporters to conform to RFC7231 & RFC7230 + ([#3128](https://github.com/open-telemetry/opentelemetry-python/pull/3128)) - Fix validation of baggage values ([#3058](https://github.com/open-telemetry/opentelemetry-python/pull/3058)) 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 60af18de2e6..07553d69d03 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 @@ -71,5 +71,5 @@ """ from .version import __version__ -_USER_AGENT_HEADER_VALUE = "OTel OTLP Exporter Python/" + __version__ +_USER_AGENT_HEADER_VALUE = "OTel-OTLP-Exporter-Python/" + __version__ _OTLP_GRPC_HEADERS = [("user-agent", _USER_AGENT_HEADER_VALUE)] diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py index c7996b9bf9e..f21ed06678a 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py @@ -289,7 +289,7 @@ def test_otlp_headers_from_env(self): # pylint: disable=protected-access self.assertEqual( self.exporter._headers, - (("user-agent", "OTel OTLP Exporter Python/" + __version__),), + (("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),), ) @patch("opentelemetry.exporter.otlp.proto.grpc.exporter._expo") diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_metrics_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_metrics_exporter.py index 6436661a985..31bb878a5f9 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_metrics_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_metrics_exporter.py @@ -418,7 +418,7 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure): ( ("key1", "value1"), ("key2", "VALUE=2"), - ("user-agent", "OTel OTLP Exporter Python/" + __version__), + ("user-agent", "OTel-OTLP-Exporter-Python/" + __version__), ), ) exporter = OTLPMetricExporter( @@ -430,7 +430,7 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure): ( ("key3", "value3"), ("key4", "value4"), - ("user-agent", "OTel OTLP Exporter Python/" + __version__), + ("user-agent", "OTel-OTLP-Exporter-Python/" + __version__), ), ) 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 5c8f0407254..36ae0a7c11e 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 @@ -281,7 +281,7 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure): ( ("key1", "value1"), ("key2", "VALUE=2"), - ("user-agent", "OTel OTLP Exporter Python/" + __version__), + ("user-agent", "OTel-OTLP-Exporter-Python/" + __version__), ), ) exporter = OTLPSpanExporter( @@ -293,7 +293,7 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure): ( ("key3", "value3"), ("key4", "value4"), - ("user-agent", "OTel OTLP Exporter Python/" + __version__), + ("user-agent", "OTel-OTLP-Exporter-Python/" + __version__), ), ) exporter = OTLPSpanExporter( @@ -305,7 +305,7 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure): ( ("key5", "value5"), ("key6", "value6"), - ("user-agent", "OTel OTLP Exporter Python/" + __version__), + ("user-agent", "OTel-OTLP-Exporter-Python/" + __version__), ), ) @@ -454,7 +454,7 @@ def test_otlp_headers(self, mock_ssl_channel, mock_secure): # This ensures that there is no other header than standard user-agent. self.assertEqual( exporter._headers, - (("user-agent", "OTel OTLP Exporter Python/" + __version__),), + (("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),), ) @patch("opentelemetry.exporter.otlp.proto.grpc.exporter.backoff") diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/__init__.py index a14f0e2992d..2c40b39590b 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/__init__.py @@ -76,7 +76,7 @@ _OTLP_HTTP_HEADERS = { "Content-Type": "application/x-protobuf", - "User-Agent": "OTel OTLP Exporter Python/" + __version__, + "User-Agent": "OTel-OTLP-Exporter-Python/" + __version__, } diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py index f61a4291ed3..05bdfb9af30 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py @@ -38,6 +38,7 @@ _encode_value, _ProtobufEncoder, ) +from opentelemetry.exporter.otlp.proto.http.version import __version__ from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( ExportLogsServiceRequest, ) @@ -96,6 +97,10 @@ def test_constructor_default(self): exporter._session.headers.get("Content-Type"), "application/x-protobuf", ) + self.assertEqual( + exporter._session.headers.get("User-Agent"), + "OTel-OTLP-Exporter-Python/" + __version__, + ) @patch.dict( "os.environ", diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py index 64ca6fbbb86..a1d96f50b44 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py @@ -28,6 +28,7 @@ OTLPSpanExporter, _is_backoff_v2, ) +from opentelemetry.exporter.otlp.proto.http.version import __version__ from opentelemetry.sdk.environment_variables import ( OTEL_EXPORTER_OTLP_CERTIFICATE, OTEL_EXPORTER_OTLP_COMPRESSION, @@ -67,6 +68,10 @@ def test_constructor_default(self): exporter._session.headers.get("Content-Type"), "application/x-protobuf", ) + self.assertEqual( + exporter._session.headers.get("User-Agent"), + "OTel-OTLP-Exporter-Python/" + __version__, + ) @patch.dict( "os.environ",