Skip to content

Commit 3c1c5a9

Browse files
committed
fix(grpc): aio grpc client interceptor incorrect metadata handling
1 parent 70d9b3d commit 3c1c5a9

File tree

4 files changed

+25
-20
lines changed

4 files changed

+25
-20
lines changed

instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_aio_client.py

+5-7
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@
1414

1515
import functools
1616
import logging
17-
from collections import OrderedDict
1817

1918
import grpc
20-
from grpc.aio import ClientCallDetails
19+
from grpc.aio import ClientCallDetails, Metadata
2120

2221
from opentelemetry.instrumentation.grpc._client import (
2322
OpenTelemetryClientInterceptor,
@@ -55,20 +54,19 @@ def callback(call):
5554

5655
class _BaseAioClientInterceptor(OpenTelemetryClientInterceptor):
5756
@staticmethod
58-
def propagate_trace_in_details(client_call_details):
57+
def propagate_trace_in_details(client_call_details: ClientCallDetails):
5958
metadata = client_call_details.metadata
6059
if not metadata:
61-
mutable_metadata = OrderedDict()
60+
mutable_metadata = Metadata()
6261
else:
63-
mutable_metadata = OrderedDict(metadata)
62+
mutable_metadata = Metadata(*tuple(metadata))
6463

6564
inject(mutable_metadata, setter=_carrier_setter)
66-
metadata = tuple(mutable_metadata.items())
6765

6866
return ClientCallDetails(
6967
client_call_details.method,
7068
client_call_details.timeout,
71-
metadata,
69+
mutable_metadata,
7270
client_call_details.credentials,
7371
client_call_details.wait_for_ready,
7472
)

instrumentation/opentelemetry-instrumentation-grpc/tests/_aio_client.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ async def simple_method(stub, error=False):
2121
request = Request(
2222
client_id=CLIENT_ID, request_data="error" if error else "data"
2323
)
24-
return await stub.SimpleMethod(request)
24+
return await stub.SimpleMethod(request, metadata=(("key", "value"),))
2525

2626

2727
async def client_streaming_method(stub, error=False):
@@ -41,7 +41,7 @@ def server_streaming_method(stub, error=False):
4141
client_id=CLIENT_ID, request_data="error" if error else "data"
4242
)
4343

44-
return stub.ServerStreamingMethod(request)
44+
return stub.ServerStreamingMethod(request, metadata=(("key", "value"),))
4545

4646

4747
def bidirectional_streaming_method(stub, error=False):
@@ -53,4 +53,6 @@ def request_messages():
5353
)
5454
yield request
5555

56-
return stub.BidirectionalStreamingMethod(request_messages())
56+
return stub.BidirectionalStreamingMethod(
57+
request_messages(), metadata=(("key", "value"),)
58+
)

instrumentation/opentelemetry-instrumentation-grpc/tests/_client.py

+11-5
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ def simple_method(stub, error=False):
2121
request = Request(
2222
client_id=CLIENT_ID, request_data="error" if error else "data"
2323
)
24-
stub.SimpleMethod(request)
24+
stub.SimpleMethod(request, metadata=(("key", "value"),))
2525

2626

2727
def simple_method_future(stub, error=False):
2828
request = Request(
2929
client_id=CLIENT_ID, request_data="error" if error else "data"
3030
)
31-
return stub.SimpleMethod.future(request)
31+
return stub.SimpleMethod.future(request, metadata=(("key", "value"),))
3232

3333

3434
def client_streaming_method(stub, error=False):
@@ -40,14 +40,18 @@ def request_messages():
4040
)
4141
yield request
4242

43-
stub.ClientStreamingMethod(request_messages())
43+
stub.ClientStreamingMethod(
44+
request_messages(), metadata=(("key", "value"),)
45+
)
4446

4547

4648
def server_streaming_method(stub, error=False):
4749
request = Request(
4850
client_id=CLIENT_ID, request_data="error" if error else "data"
4951
)
50-
response_iterator = stub.ServerStreamingMethod(request)
52+
response_iterator = stub.ServerStreamingMethod(
53+
request, metadata=(("key", "value"),)
54+
)
5155
list(response_iterator)
5256

5357

@@ -59,6 +63,8 @@ def request_messages():
5963
)
6064
yield request
6165

62-
response_iterator = stub.BidirectionalStreamingMethod(request_messages())
66+
response_iterator = stub.BidirectionalStreamingMethod(
67+
request_messages(), metadata=(("key", "value"),)
68+
)
6369

6470
list(response_iterator)

instrumentation/opentelemetry-instrumentation-grpc/tests/test_aio_client_interceptor.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -305,11 +305,10 @@ async def test_client_interceptor_trace_context_propagation(self):
305305
await simple_method(stub)
306306

307307
metadata = recording_interceptor.recorded_details.metadata
308-
assert len(metadata) == 2
309-
assert metadata[0][0] == "mock-traceid"
310-
assert metadata[0][1] == "0"
311-
assert metadata[1][0] == "mock-spanid"
312-
assert metadata[1][1] == "0"
308+
assert len(metadata) == 3
309+
assert metadata.get_all("key") == ["value"]
310+
assert metadata.get_all("mock-traceid") == ["0"]
311+
assert metadata.get_all("mock-spanid") == ["0"]
313312
finally:
314313
set_global_textmap(previous_propagator)
315314

0 commit comments

Comments
 (0)