27
27
28
28
from opentelemetry import trace
29
29
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
+ )
30
35
from opentelemetry.sdk.trace import TracerProvider
31
36
from opentelemetry.sdk.trace.export import (
32
37
ConsoleSpanExporter,
38
43
except ImportError:
39
44
from gen import helloworld_pb2, helloworld_pb2_grpc
40
45
46
+ exporter = ConsoleMetricExporter()
47
+ reader = PeriodicExportingMetricReader(exporter)
48
+ metrics.set_meter_provider(
49
+ MeterProvider(metric_readers=[reader])
50
+ )
51
+
41
52
trace.set_tracer_provider(TracerProvider())
42
53
trace.get_tracer_provider().add_span_processor(
43
54
SimpleSpanProcessor(ConsoleSpanExporter())
@@ -58,6 +69,18 @@ def run():
58
69
logging.basicConfig()
59
70
run()
60
71
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
+
61
84
Usage Server
62
85
------------
63
86
.. code-block:: python
@@ -135,7 +158,6 @@ def serve():
135
158
from wrapt import wrap_function_wrapper as _wrap
136
159
137
160
from opentelemetry import metrics , trace
138
- from opentelemetry .instrumentation .grpc .grpcext import intercept_channel
139
161
from opentelemetry .instrumentation .grpc .package import _instruments
140
162
from opentelemetry .instrumentation .grpc .version import __version__
141
163
from opentelemetry .instrumentation .instrumentor import BaseInstrumentor
@@ -235,39 +257,47 @@ def _uninstrument(self, **kwargs):
235
257
236
258
def wrapper_fn (self , original_func , instance , args , kwargs ):
237
259
channel = original_func (* args , ** kwargs )
260
+ meter_provider = kwargs .get ("meter_provider" )
238
261
tracer_provider = kwargs .get ("tracer_provider" )
239
- return intercept_channel (
262
+ return grpc . intercept_channel (
240
263
channel ,
241
- client_interceptor (tracer_provider = tracer_provider ),
264
+ client_interceptor (
265
+ meter_provider = meter_provider ,
266
+ tracer_provider = tracer_provider
267
+ )
242
268
)
243
269
244
270
245
- def client_interceptor (tracer_provider = None ):
271
+ def client_interceptor (meter_provider = None , tracer_provider = None ):
246
272
"""Create a gRPC client channel interceptor.
247
273
248
274
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.
250
277
251
278
Returns:
252
279
An invocation-side interceptor object.
253
280
"""
281
+
254
282
from . import _client
255
283
284
+ meter = metrics .get_meter (__name__ , __version__ , meter_provider )
256
285
tracer = trace .get_tracer (__name__ , __version__ , tracer_provider )
257
286
258
- return _client .OpenTelemetryClientInterceptor (tracer )
287
+ return _client .OpenTelemetryClientInterceptor (meter , tracer )
259
288
260
289
261
290
def server_interceptor (meter_provider = None , tracer_provider = None ):
262
291
"""Create a gRPC server interceptor.
263
292
264
293
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.
267
296
268
297
Returns:
269
298
A service-side interceptor object.
270
299
"""
300
+
271
301
from . import _server
272
302
273
303
meter = metrics .get_meter (__name__ , __version__ , meter_provider )
0 commit comments