Skip to content

Commit c8f068d

Browse files
committed
opentelemetry-exporter-otlp-proto-grpc: permit to override default exporter headers
1 parent 70477b6 commit c8f068d

File tree

4 files changed

+83
-11
lines changed

4 files changed

+83
-11
lines changed

exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,17 @@ def __init__(
225225
self._headers = headers or environ.get(OTEL_EXPORTER_OTLP_HEADERS)
226226
if isinstance(self._headers, str):
227227
temp_headers = parse_env_headers(self._headers, liberal=True)
228-
self._headers = tuple(temp_headers.items())
229-
elif isinstance(self._headers, dict):
230-
self._headers = tuple(self._headers.items())
228+
self._headers = temp_headers
229+
elif isinstance(self._headers, tuple):
230+
self._headers = dict(self._headers)
231+
231232
if self._headers is None:
232233
self._headers = tuple(_OTLP_GRPC_HEADERS)
233234
else:
234-
self._headers = tuple(self._headers) + tuple(_OTLP_GRPC_HEADERS)
235+
# let users override our defaults
236+
self._headers = tuple(
237+
{**dict(_OTLP_GRPC_HEADERS), **self._headers}.items()
238+
)
235239

236240
self._timeout = timeout or int(
237241
environ.get(OTEL_EXPORTER_OTLP_TIMEOUT, 10)

exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import (
2828
OTLPLogExporter,
2929
)
30+
from opentelemetry.exporter.otlp.proto.grpc.version import __version__
3031
from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import (
3132
ExportLogsServiceRequest,
3233
)
@@ -460,3 +461,37 @@ def test_translate_multiple_logs(self):
460461
[self.log_data_1, self.log_data_2, self.log_data_3]
461462
),
462463
)
464+
465+
@patch(
466+
"opentelemetry.exporter.otlp.proto.grpc.exporter.ssl_channel_credentials"
467+
)
468+
@patch("opentelemetry.exporter.otlp.proto.grpc.exporter.secure_channel")
469+
# pylint: disable=unused-argument
470+
def test_otlp_headers_overrides_from_env(
471+
self, mock_ssl_channel, mock_secure
472+
):
473+
exporter = OTLPLogExporter()
474+
# pylint: disable=protected-access
475+
self.assertEqual(
476+
exporter._headers,
477+
(("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),),
478+
)
479+
480+
with patch.dict(
481+
"os.environ",
482+
{OTEL_EXPORTER_OTLP_LOGS_HEADERS: "User-agent=GrpcLogExporter"},
483+
):
484+
exporter = OTLPLogExporter()
485+
# pylint: disable=protected-access
486+
self.assertEqual(
487+
exporter._headers,
488+
(("user-agent", "GrpcLogExporter"),),
489+
)
490+
exporter = OTLPLogExporter(
491+
headers=(("user-agent", "ParamExporter"),)
492+
)
493+
# pylint: disable=protected-access
494+
self.assertEqual(
495+
exporter._headers,
496+
(("user-agent", "ParamExporter"),),
497+
)

exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_metrics_exporter.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,9 +254,9 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure):
254254
self.assertEqual(
255255
exporter._headers,
256256
(
257+
("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),
257258
("key1", "value1"),
258259
("key2", "VALUE=2"),
259-
("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),
260260
),
261261
)
262262
exporter = OTLPMetricExporter(
@@ -266,12 +266,39 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure):
266266
self.assertEqual(
267267
exporter._headers,
268268
(
269+
("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),
269270
("key3", "value3"),
270271
("key4", "value4"),
271-
("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),
272272
),
273273
)
274274

275+
@patch.dict(
276+
"os.environ",
277+
{OTEL_EXPORTER_OTLP_METRICS_HEADERS: "User-agent=GrpcMetricsExporter"},
278+
)
279+
@patch(
280+
"opentelemetry.exporter.otlp.proto.grpc.exporter.ssl_channel_credentials"
281+
)
282+
@patch("opentelemetry.exporter.otlp.proto.grpc.exporter.secure_channel")
283+
# pylint: disable=unused-argument
284+
def test_otlp_headers_overrides_from_env(
285+
self, mock_ssl_channel, mock_secure
286+
):
287+
exporter = OTLPMetricExporter()
288+
# pylint: disable=protected-access
289+
self.assertEqual(
290+
exporter._headers,
291+
(("user-agent", "GrpcMetricsExporter"),),
292+
)
293+
exporter = OTLPMetricExporter(
294+
headers=(("user-agent", "ParamExporter"),)
295+
)
296+
# pylint: disable=protected-access
297+
self.assertEqual(
298+
exporter._headers,
299+
(("user-agent", "ParamExporter"),),
300+
)
301+
275302
@patch.dict(
276303
"os.environ",
277304
{OTEL_EXPORTER_OTLP_METRICS_INSECURE: "True"},

exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_trace_exporter.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,9 @@ def test_no_credentials_error(
267267

268268
@patch.dict(
269269
"os.environ",
270-
{OTEL_EXPORTER_OTLP_TRACES_HEADERS: " key1=value1,KEY2 = VALUE=2 "},
270+
{
271+
OTEL_EXPORTER_OTLP_TRACES_HEADERS: " key1=value1,KEY2 = VALUE=2 ,User-agent=GrpcTraceExporter"
272+
},
271273
)
272274
@patch(
273275
"opentelemetry.exporter.otlp.proto.grpc.exporter.ssl_channel_credentials"
@@ -280,9 +282,9 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure):
280282
self.assertEqual(
281283
exporter._headers,
282284
(
285+
("user-agent", "GrpcTraceExporter"),
283286
("key1", "value1"),
284287
("key2", "VALUE=2"),
285-
("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),
286288
),
287289
)
288290
exporter = OTLPSpanExporter(
@@ -292,21 +294,25 @@ def test_otlp_headers_from_env(self, mock_ssl_channel, mock_secure):
292294
self.assertEqual(
293295
exporter._headers,
294296
(
297+
("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),
295298
("key3", "value3"),
296299
("key4", "value4"),
297-
("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),
298300
),
299301
)
300302
exporter = OTLPSpanExporter(
301-
headers={"key5": "value5", "key6": "value6"}
303+
headers={
304+
"key5": "value5",
305+
"key6": "value6",
306+
"user-agent": "ParameterExporter",
307+
}
302308
)
303309
# pylint: disable=protected-access
304310
self.assertEqual(
305311
exporter._headers,
306312
(
313+
("user-agent", "ParameterExporter"),
307314
("key5", "value5"),
308315
("key6", "value6"),
309-
("user-agent", "OTel-OTLP-Exporter-Python/" + __version__),
310316
),
311317
)
312318

0 commit comments

Comments
 (0)