Skip to content

Commit 3f0d1a1

Browse files
committed
Conformity of client intereptor(s) with the official grpc.*ClientInterceptor-interfaces
Signed-off-by: Jason Parraga <[email protected]>
1 parent af17965 commit 3f0d1a1

File tree

7 files changed

+404
-762
lines changed

7 files changed

+404
-762
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
@@ -286,7 +286,6 @@ async def serve():
286286
negate,
287287
service_name,
288288
)
289-
from opentelemetry.instrumentation.grpc.grpcext import intercept_channel
290289
from opentelemetry.instrumentation.grpc.package import _instruments
291290
from opentelemetry.instrumentation.grpc.version import __version__
292291
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
@@ -339,7 +338,8 @@ def server(*args, **kwargs):
339338
kwargs["interceptors"].insert(
340339
0,
341340
server_interceptor(
342-
tracer_provider=tracer_provider, filter_=self._filter
341+
tracer_provider=tracer_provider,
342+
filter_=self._filter,
343343
),
344344
)
345345
else:
@@ -476,9 +476,10 @@ def wrapper_fn(self, original_func, instance, args, kwargs):
476476
tracer_provider = kwargs.get("tracer_provider")
477477
request_hook = self._request_hook
478478
response_hook = self._response_hook
479-
return intercept_channel(
479+
480+
return grpc.intercept_channel(
480481
channel,
481-
client_interceptor(
482+
*client_interceptors(
482483
tracer_provider=tracer_provider,
483484
filter_=self._filter,
484485
request_hook=request_hook,
@@ -560,10 +561,10 @@ def _uninstrument(self, **kwargs):
560561
grpc.aio.secure_channel = self._original_secure
561562

562563

563-
def client_interceptor(
564+
def client_interceptors(
564565
tracer_provider=None, filter_=None, request_hook=None, response_hook=None
565566
):
566-
"""Create a gRPC client channel interceptor.
567+
"""Create gRPC client channel interceptors.
567568
568569
Args:
569570
tracer: The tracer to use to create client-side spans.
@@ -573,7 +574,7 @@ def client_interceptor(
573574
all requests.
574575
575576
Returns:
576-
An invocation-side interceptor object.
577+
A list of invocation-side interceptor objects.
577578
"""
578579
from . import _client
579580

@@ -584,12 +585,32 @@ def client_interceptor(
584585
schema_url="https://opentelemetry.io/schemas/1.11.0",
585586
)
586587

587-
return _client.OpenTelemetryClientInterceptor(
588-
tracer,
589-
filter_=filter_,
590-
request_hook=request_hook,
591-
response_hook=response_hook,
592-
)
588+
return [
589+
_client.UnaryUnaryClientInterceptor(
590+
tracer,
591+
filter_=filter_,
592+
request_hook=request_hook,
593+
response_hook=response_hook,
594+
),
595+
_client.UnaryStreamClientInterceptor(
596+
tracer,
597+
filter_=filter_,
598+
request_hook=request_hook,
599+
response_hook=response_hook,
600+
),
601+
_client.StreamUnaryClientInterceptor(
602+
tracer,
603+
filter_=filter_,
604+
request_hook=request_hook,
605+
response_hook=response_hook,
606+
),
607+
_client.StreamStreamClientInterceptor(
608+
tracer,
609+
filter_=filter_,
610+
request_hook=request_hook,
611+
response_hook=response_hook,
612+
),
613+
]
593614

594615

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

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

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@
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
27-
from opentelemetry.semconv.trace import SpanAttributes
25+
from opentelemetry.semconv.trace import RpcSystemValues, SpanAttributes
2826
from opentelemetry.trace.status import Status, StatusCode
2927

28+
from ._client import _safe_invoke
29+
3030
logger = logging.getLogger(__name__)
3131

3232

@@ -52,7 +52,25 @@ def callback(call):
5252
return callback
5353

5454

55-
class _BaseAioClientInterceptor(OpenTelemetryClientInterceptor):
55+
class _BaseAioClientInterceptor:
56+
def __init__(
57+
self, tracer, filter_=None, request_hook=None, response_hook=None
58+
):
59+
self._tracer = tracer
60+
self._filter = filter_
61+
self._request_hook = request_hook
62+
self._response_hook = response_hook
63+
64+
def _call_request_hook(self, span, request):
65+
if not callable(self._request_hook):
66+
return
67+
_safe_invoke(self._request_hook, span, request)
68+
69+
def _call_response_hook(self, span, response):
70+
if not callable(self._response_hook):
71+
return
72+
_safe_invoke(self._response_hook, span, response)
73+
5674
@staticmethod
5775
def propagate_trace_in_details(client_call_details: ClientCallDetails):
5876
metadata = client_call_details.metadata
@@ -101,6 +119,22 @@ def _start_interceptor_span(self, method):
101119
set_status_on_exception=False,
102120
)
103121

122+
def _start_span(self, method, **kwargs):
123+
service, meth = method.lstrip("/").split("/", 1)
124+
attributes = {
125+
SpanAttributes.RPC_SYSTEM: RpcSystemValues.GRPC.value,
126+
SpanAttributes.RPC_SERVICE: service,
127+
SpanAttributes.RPC_METHOD: meth,
128+
SpanAttributes.RPC_GRPC_STATUS_CODE: grpc.StatusCode.OK.value[0],
129+
}
130+
131+
return self._tracer.start_as_current_span(
132+
name=method,
133+
kind=trace.SpanKind.CLIENT,
134+
attributes=attributes,
135+
**kwargs,
136+
)
137+
104138
async def _wrap_unary_response(self, continuation, span):
105139
try:
106140
call = await continuation()

0 commit comments

Comments
 (0)