Skip to content

Commit a4a8fc5

Browse files
Sovietacedjuandelacruz-calvo
authored andcommitted
Conformity of client intereptor(s) with the official grpc.*ClientInterceptor-interfaces
Signed-off-by: Jason Parraga <[email protected]>
1 parent 34db73e commit a4a8fc5

File tree

7 files changed

+401
-755
lines changed

7 files changed

+401
-755
lines changed

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

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,6 @@ async def serve():
291291
negate,
292292
service_name,
293293
)
294-
from opentelemetry.instrumentation.grpc.grpcext import intercept_channel
295294
from opentelemetry.instrumentation.grpc.package import _instruments
296295
from opentelemetry.instrumentation.grpc.version import __version__
297296
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
@@ -345,7 +344,8 @@ def server(*args, **kwargs):
345344
kwargs["interceptors"].insert(
346345
0,
347346
server_interceptor(
348-
tracer_provider=tracer_provider, filter_=self._filter
347+
tracer_provider=tracer_provider,
348+
filter_=self._filter,
349349
),
350350
)
351351
else:
@@ -484,9 +484,10 @@ def wrapper_fn(self, original_func, instance, args, kwargs):
484484
tracer_provider = kwargs.get("tracer_provider")
485485
request_hook = self._request_hook
486486
response_hook = self._response_hook
487-
return intercept_channel(
487+
488+
return grpc.intercept_channel(
488489
channel,
489-
client_interceptor(
490+
*client_interceptors(
490491
tracer_provider=tracer_provider,
491492
filter_=self._filter,
492493
request_hook=request_hook,
@@ -569,10 +570,10 @@ def _uninstrument(self, **kwargs):
569570
grpc.aio.secure_channel = self._original_secure
570571

571572

572-
def client_interceptor(
573+
def client_interceptors(
573574
tracer_provider=None, filter_=None, request_hook=None, response_hook=None
574575
):
575-
"""Create a gRPC client channel interceptor.
576+
"""Create gRPC client channel interceptors.
576577
577578
Args:
578579
tracer: The tracer to use to create client-side spans.
@@ -582,7 +583,7 @@ def client_interceptor(
582583
all requests.
583584
584585
Returns:
585-
An invocation-side interceptor object.
586+
A list of invocation-side interceptor objects.
586587
"""
587588
from . import _client
588589

@@ -593,12 +594,32 @@ def client_interceptor(
593594
schema_url="https://opentelemetry.io/schemas/1.11.0",
594595
)
595596

596-
return _client.OpenTelemetryClientInterceptor(
597-
tracer,
598-
filter_=filter_,
599-
request_hook=request_hook,
600-
response_hook=response_hook,
601-
)
597+
return [
598+
_client.UnaryUnaryClientInterceptor(
599+
tracer,
600+
filter_=filter_,
601+
request_hook=request_hook,
602+
response_hook=response_hook,
603+
),
604+
_client.UnaryStreamClientInterceptor(
605+
tracer,
606+
filter_=filter_,
607+
request_hook=request_hook,
608+
response_hook=response_hook,
609+
),
610+
_client.StreamUnaryClientInterceptor(
611+
tracer,
612+
filter_=filter_,
613+
request_hook=request_hook,
614+
response_hook=response_hook,
615+
),
616+
_client.StreamStreamClientInterceptor(
617+
tracer,
618+
filter_=filter_,
619+
request_hook=request_hook,
620+
response_hook=response_hook,
621+
),
622+
]
602623

603624

604625
def server_interceptor(tracer_provider=None, filter_=None):

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

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,20 @@
1818
import grpc
1919
from grpc.aio import ClientCallDetails, Metadata
2020

21-
from opentelemetry.instrumentation.grpc._client import (
22-
OpenTelemetryClientInterceptor,
23-
_carrier_setter,
24-
)
21+
from opentelemetry import trace
22+
from opentelemetry.instrumentation.grpc._client import _carrier_setter
2523
from opentelemetry.instrumentation.utils import is_instrumentation_enabled
2624
from opentelemetry.propagate import inject
2725
from opentelemetry.semconv._incubating.attributes.rpc_attributes import (
2826
RPC_GRPC_STATUS_CODE,
27+
RPC_METHOD,
28+
RPC_SERVICE,
29+
RPC_SYSTEM,
2930
)
3031
from opentelemetry.trace.status import Status, StatusCode
3132

33+
from ._client import _safe_invoke
34+
3235
logger = logging.getLogger(__name__)
3336

3437

@@ -54,7 +57,25 @@ def callback(call):
5457
return callback
5558

5659

57-
class _BaseAioClientInterceptor(OpenTelemetryClientInterceptor):
60+
class _BaseAioClientInterceptor:
61+
def __init__(
62+
self, tracer, filter_=None, request_hook=None, response_hook=None
63+
):
64+
self._tracer = tracer
65+
self._filter = filter_
66+
self._request_hook = request_hook
67+
self._response_hook = response_hook
68+
69+
def _call_request_hook(self, span, request):
70+
if not callable(self._request_hook):
71+
return
72+
_safe_invoke(self._request_hook, span, request)
73+
74+
def _call_response_hook(self, span, response):
75+
if not callable(self._response_hook):
76+
return
77+
_safe_invoke(self._response_hook, span, response)
78+
5879
@staticmethod
5980
def propagate_trace_in_details(client_call_details: ClientCallDetails):
6081
metadata = client_call_details.metadata
@@ -103,6 +124,22 @@ def _start_interceptor_span(self, method):
103124
set_status_on_exception=False,
104125
)
105126

127+
def _start_span(self, method, **kwargs):
128+
service, meth = method.lstrip("/").split("/", 1)
129+
attributes = {
130+
RPC_SYSTEM: "grpc",
131+
RPC_SERVICE: service,
132+
RPC_METHOD: meth,
133+
RPC_GRPC_STATUS_CODE: grpc.StatusCode.OK.value[0],
134+
}
135+
136+
return self._tracer.start_as_current_span(
137+
name=method,
138+
kind=trace.SpanKind.CLIENT,
139+
attributes=attributes,
140+
**kwargs,
141+
)
142+
106143
async def _wrap_unary_response(self, continuation, span):
107144
try:
108145
call = await continuation()

0 commit comments

Comments
 (0)