Skip to content

Commit 9f1792f

Browse files
author
Corvin Lasogga
committed
Complete redesign of OpenTelemetryClientInterceptor including support of metrics, tracing of messages and changed API to officical grpc.ClientInterceptor API
1 parent d252e71 commit 9f1792f

File tree

5 files changed

+445
-590
lines changed

5 files changed

+445
-590
lines changed

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

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
2828
from opentelemetry import trace
2929
from opentelemetry.instrumentation.grpc import GrpcInstrumentorClient
30+
from opentelemetry.sdk.metrics import MeterProvider
31+
from opentelemetry.sdk.metrics.export import (
32+
ConsoleMetricExporter,
33+
PeriodicExportingMetricReader,
34+
)
3035
from opentelemetry.sdk.trace import TracerProvider
3136
from opentelemetry.sdk.trace.export import (
3237
ConsoleSpanExporter,
@@ -38,6 +43,12 @@
3843
except ImportError:
3944
from gen import helloworld_pb2, helloworld_pb2_grpc
4045
46+
exporter = ConsoleMetricExporter()
47+
reader = PeriodicExportingMetricReader(exporter)
48+
metrics.set_meter_provider(
49+
MeterProvider(metric_readers=[reader])
50+
)
51+
4152
trace.set_tracer_provider(TracerProvider())
4253
trace.get_tracer_provider().add_span_processor(
4354
SimpleSpanProcessor(ConsoleSpanExporter())
@@ -58,6 +69,18 @@ def run():
5869
logging.basicConfig()
5970
run()
6071
72+
You can also add the instrumentor manually, rather than using
73+
:py:class:`~opentelemetry.instrumentation.grpc.GrpcInstrumentorClient`:
74+
75+
.. code-block:: python
76+
77+
from opentelemetry.instrumentation.grpc import client_interceptor
78+
79+
channel = grpc.intercept_channel(
80+
grpc.insecure_channel(...) / grpc.secure_channel(...),
81+
client_interceptor()
82+
)
83+
6184
Usage Server
6285
------------
6386
.. code-block:: python
@@ -135,7 +158,6 @@ def serve():
135158
from wrapt import wrap_function_wrapper as _wrap
136159

137160
from opentelemetry import metrics, trace
138-
from opentelemetry.instrumentation.grpc.grpcext import intercept_channel
139161
from opentelemetry.instrumentation.grpc.package import _instruments
140162
from opentelemetry.instrumentation.grpc.version import __version__
141163
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
@@ -235,39 +257,47 @@ def _uninstrument(self, **kwargs):
235257

236258
def wrapper_fn(self, original_func, instance, args, kwargs):
237259
channel = original_func(*args, **kwargs)
260+
meter_provider = kwargs.get("meter_provider")
238261
tracer_provider = kwargs.get("tracer_provider")
239-
return intercept_channel(
262+
return grpc.intercept_channel(
240263
channel,
241-
client_interceptor(tracer_provider=tracer_provider),
264+
client_interceptor(
265+
meter_provider=meter_provider,
266+
tracer_provider=tracer_provider
267+
)
242268
)
243269

244270

245-
def client_interceptor(tracer_provider=None):
271+
def client_interceptor(meter_provider=None, tracer_provider=None):
246272
"""Create a gRPC client channel interceptor.
247273
248274
Args:
249-
tracer: The tracer to use to create client-side spans.
275+
meter_provider: The meter provider which allows access to the meter.
276+
tracer_provider: The tracer provider which allows access to the tracer.
250277
251278
Returns:
252279
An invocation-side interceptor object.
253280
"""
281+
254282
from . import _client
255283

284+
meter = metrics.get_meter(__name__, __version__, meter_provider)
256285
tracer = trace.get_tracer(__name__, __version__, tracer_provider)
257286

258-
return _client.OpenTelemetryClientInterceptor(tracer)
287+
return _client.OpenTelemetryClientInterceptor(meter, tracer)
259288

260289

261290
def server_interceptor(meter_provider=None, tracer_provider=None):
262291
"""Create a gRPC server interceptor.
263292
264293
Args:
265-
meter_provider: The meter provider which allows acess to the meter.
266-
tracer_provider: The tracer provider which allows acess to the tracer.
294+
meter_provider: The meter provider which allows access to the meter.
295+
tracer_provider: The tracer provider which allows access to the tracer.
267296
268297
Returns:
269298
A service-side interceptor object.
270299
"""
300+
271301
from . import _server
272302

273303
meter = metrics.get_meter(__name__, __version__, meter_provider)

0 commit comments

Comments
 (0)