Skip to content
This repository was archived by the owner on Sep 17, 2025. It is now read-only.

Commit 1007659

Browse files
wkiserliyanhui1228
authored andcommitted
Update gRPC span names to match spec (#152)
1 parent de32d2d commit 1007659

4 files changed

Lines changed: 32 additions & 8 deletions

File tree

opencensus/trace/ext/grpc/client_interceptor.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
ATTRIBUTE_ERROR_MESSAGE = 'ERROR_MESSAGE'
3030
GRPC_HOST_PORT = 'GRPC_HOST_PORT'
3131
GRPC_METHOD = 'GRPC_METHOD'
32+
SENT_PREFIX = 'Sent'
3233

3334
TIMEOUT = 3
3435

@@ -57,9 +58,10 @@ def __init__(self, tracer=None, host_port=None):
5758
self.host_port = host_port
5859
self._propagator = binary_format.BinaryFormatPropagator()
5960

60-
def _start_client_span(self, method, grpc_type):
61+
def _start_client_span(self, client_call_details):
6162
span = self._tracer.start_span(
62-
name='[gRPC_client][{}]{}'.format(grpc_type, str(method)))
63+
name=_get_span_name(client_call_details)
64+
)
6365

6466
# Add the component grpc to span attribute
6567
self._tracer.add_attribute_to_current_span(
@@ -76,7 +78,7 @@ def _start_client_span(self, method, grpc_type):
7678
# Add the method to span attribute
7779
self._tracer.add_attribute_to_current_span(
7880
attribute_key=attributes_helper.GRPC_ATTRIBUTES.get(GRPC_METHOD),
79-
attribute_value=str(method))
81+
attribute_value=str(client_call_details.method))
8082

8183
return span
8284

@@ -91,9 +93,7 @@ def _intercept_call(
9193
metadata = client_call_details.metadata
9294

9395
# Start a span
94-
current_span = self._start_client_span(
95-
client_call_details.method,
96-
grpc_type)
96+
current_span = self._start_client_span(client_call_details)
9797

9898
span_context = self._tracer.span_context
9999
header = self._propagator.to_header(span_context)
@@ -211,3 +211,9 @@ def intercept_stream_stream(self, continuation, client_call_details,
211211
self._end_span_between_context(current_span)
212212

213213
return response_it
214+
215+
216+
def _get_span_name(client_call_details):
217+
"""Generates a span name based off of the gRPC client call details"""
218+
method_name = client_call_details.method[1:].replace('/', '.')
219+
return '{}.{}'.format(SENT_PREFIX, method_name)

opencensus/trace/ext/grpc/server_interceptor.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
ATTRIBUTE_COMPONENT = 'COMPONENT'
3030
ATTRIBUTE_ERROR_NAME = 'ERROR_NAME'
3131
ATTRIBUTE_ERROR_MESSAGE = 'ERROR_MESSAGE'
32+
RECV_PREFIX = 'Recv'
3233

3334
RpcRequestInfo = collections.namedtuple(
3435
'RPCRequestInfo', ('request', 'context')
@@ -113,7 +114,7 @@ def _start_server_span(self, rpc_request_info):
113114
sampler=self.sampler,
114115
exporter=self.exporter)
115116

116-
span = tracer.start_span(name='grpc_server')
117+
span = tracer.start_span(name=_get_span_name(rpc_request_info))
117118
tracer.add_attribute_to_current_span(
118119
attribute_key=attributes_helper.COMMON_ATTRIBUTES.get(
119120
ATTRIBUTE_COMPONENT),
@@ -151,3 +152,12 @@ def intercept_handler(self, continuation, handler_call_details):
151152

152153
def intercept_service(self, continuation, handler_call_details):
153154
return self.intercept_handler(continuation, handler_call_details)
155+
156+
157+
def _get_span_name(rpc_request_info):
158+
"""Generates a span name based off of the gRPC server rpc_request_info"""
159+
method_name = rpc_request_info.context._rpc_event.call_details.method[1:]
160+
if isinstance(method_name, bytes):
161+
method_name = method_name.decode('utf-8')
162+
method_name = method_name.replace('/', '.')
163+
return '{}.{}'.format(RECV_PREFIX, method_name)

tests/unit/trace/ext/grpc/test_client_interceptor.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ def test__start_client_span(self):
5555
tracer = mock.Mock()
5656
interceptor = client_interceptor.OpenCensusClientInterceptor(
5757
tracer=tracer, host_port='test')
58-
interceptor._start_client_span('test_method', 'unary_unary')
58+
mock_client_call_details = mock.Mock()
59+
mock_client_call_details.method = '/hello'
60+
interceptor._start_client_span(mock_client_call_details)
5961

6062
self.assertTrue(tracer.start_span.called)
6163
self.assertTrue(tracer.add_attribute_to_current_span.called)
@@ -86,6 +88,7 @@ def test__intercept_call_metadata_none(self):
8688
interceptor._propagator = mock_propagator
8789
mock_client_call_details = mock.Mock()
8890
mock_client_call_details.metadata = None
91+
mock_client_call_details.method = '/hello'
8992

9093
client_call_details, request_iterator, current_span = interceptor._intercept_call(
9194
mock_client_call_details,
@@ -108,6 +111,7 @@ def test__intercept_call_metadata_list(self):
108111
interceptor._propagator = mock_propagator
109112
mock_client_call_details = mock.Mock()
110113
mock_client_call_details.metadata = [('test_key', 'test_value'),]
114+
mock_client_call_details.method = '/hello'
111115

112116
client_call_details, request_iterator, current_span = interceptor._intercept_call(
113117
mock_client_call_details,
@@ -130,6 +134,7 @@ def test__intercept_call_metadata_tuple(self):
130134
interceptor._propagator = mock_propagator
131135
mock_client_call_details = mock.Mock()
132136
mock_client_call_details.metadata = (('test_key', 'test_value'),)
137+
mock_client_call_details.method = '/hello'
133138

134139
client_call_details, request_iterator, current_span = interceptor._intercept_call(
135140
mock_client_call_details,

tests/unit/trace/ext/grpc/test_server_interceptor.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def test_intercept_handler_no_metadata(self):
4444
MockTracer)
4545
mock_context = mock.Mock()
4646
mock_context.invocation_metadata = mock.Mock(return_value=None)
47+
mock_context._rpc_event.call_details.method = 'hello'
4748
interceptor = server_interceptor.OpenCensusServerInterceptor(
4849
None, None)
4950

@@ -68,6 +69,7 @@ def test_intercept_handler(self):
6869
mock_context.invocation_metadata = mock.Mock(
6970
return_value=(('test_key', b'test_value'),)
7071
)
72+
mock_context._rpc_event.call_details.method = 'hello'
7173
interceptor = server_interceptor.OpenCensusServerInterceptor(
7274
None, None)
7375

@@ -100,6 +102,7 @@ def test_intercept_handler_exception(self):
100102
None, None)
101103
mock_context = mock.Mock()
102104
mock_context.invocation_metadata = mock.Mock(return_value=None)
105+
mock_context._rpc_event.call_details.method = 'hello'
103106
mock_continuation = mock.Mock()
104107
mock_continuation.unary_unary = mock.Mock(side_effect=Exception('Test'))
105108
with patch:

0 commit comments

Comments
 (0)