|
16 | 16 | # pylint:disable=import-self
|
17 | 17 | # pylint:disable=no-name-in-module
|
18 | 18 | # pylint:disable=relative-beyond-top-level
|
| 19 | +from contextlib import contextmanager |
| 20 | + |
19 | 21 | import grpc
|
| 22 | +from concurrent import futures |
20 | 23 | from opentelemetry import trace
|
21 | 24 | from opentelemetry.ext.grpc.version import __version__
|
| 25 | +from opentelemetry.sdk.trace import TracerProvider |
22 | 26 | from opentelemetry.auto_instrumentation.instrumentor import BaseInstrumentor
|
23 | 27 | from opentelemetry.trace import get_tracer
|
24 | 28 | from wrapt import ObjectProxy
|
25 | 29 | from wrapt import wrap_function_wrapper as _wrap
|
| 30 | +from opentelemetry.ext.grpc.grpcext import intercept_channel, intercept_server |
26 | 31 |
|
| 32 | +import pdb |
| 33 | +from opentelemetry.sdk.trace.export import ( |
| 34 | + ConsoleSpanExporter, |
| 35 | + SimpleExportSpanProcessor, |
| 36 | +) |
27 | 37 |
|
28 | 38 |
|
29 | 39 | class GrpcInstrumentorServer(BaseInstrumentor):
|
| 40 | + trace.set_tracer_provider(TracerProvider()) |
| 41 | + tracer = trace.get_tracer_provider() |
| 42 | + server = None |
30 | 43 |
|
31 | 44 | def _instrument(self, **kwargs):
|
32 |
| - # tracer = self.get_trace(kwargs) |
33 |
| - |
34 |
| - _wrap(grpc, 'server', server_interceptor(tracer_provider=get_tracer_provider(**kwargs))) |
35 |
| - _wrap(grpc, 'secure_channel', server_interceptor(tracer_provider=get_tracer_provider(**kwargs))) |
| 45 | + self.server = grpc.server(futures.ThreadPoolExecutor()) |
| 46 | + self.server = intercept_server(self.server, server_interceptor()) |
36 | 47 |
|
37 | 48 | def _uninstrument(self, **kwargs):
|
38 |
| - _unwrap(grpc, 'server') |
| 49 | + if hasattr(self.server, 'stop'): |
| 50 | + return self.server.stop(kwargs.get('grace')) |
39 | 51 |
|
40 | 52 |
|
41 | 53 | class GrpcInstrumentorClient(BaseInstrumentor):
|
| 54 | + trace.set_tracer_provider(TracerProvider()) |
| 55 | + tracer = trace.get_tracer_provider() |
| 56 | + channel = None |
42 | 57 |
|
43 | 58 | def _instrument(self, **kwargs):
|
44 |
| - # tracer = get_tracer_provider(kwargs) |
45 |
| - _wrap(grpc, 'insecure_channel', client_interceptor(tracer_provider=get_tracer_provider(**kwargs))) |
46 |
| - _wrap(grpc, 'secure_channel', client_interceptor(tracer_provider=get_tracer_provider(**kwargs))) |
| 59 | + hostport = kwargs.get('hostport') |
| 60 | + |
| 61 | + if kwargs.get('channel_type') == 'secure': |
| 62 | + self.channel = secure_channel_wrapper(hostport, kwargs.get("credentials")) |
| 63 | + |
| 64 | + else: |
| 65 | + self.channel = insecure_channel_wrapper(hostport) |
47 | 66 |
|
48 | 67 | def _uninstrument(self, **kwargs):
|
49 |
| - _unwrap(grpc, 'secure_channel') |
50 |
| - _unwrap(grpc, 'insecure_channel') |
51 | 68 |
|
| 69 | + if hasattr(self.channel, 'close'): |
| 70 | + return self.channel.close() |
52 | 71 |
|
53 |
| -def _unwrap(obj, attr): |
54 |
| - func = getattr(obj, attr, None) |
55 | 72 |
|
56 |
| - if func and isinstance(func, ObjectProxy) and hasattr(func, "__wrapped__"): |
57 |
| - setattr(obj, attr, func.__wrapped__) |
| 73 | +@contextmanager |
| 74 | +def insecure_channel_wrapper(hostport): |
| 75 | + with grpc.insecure_channel(hostport) as channel: |
| 76 | + yield intercept_channel(channel, client_interceptor()) |
58 | 77 |
|
59 | 78 |
|
60 |
| -def get_tracer_provider(**kwargs): |
61 |
| - return kwargs.get("tracer_provider") |
| 79 | +@contextmanager |
| 80 | +def secure_channel_wrapper(hostport, credentials): |
| 81 | + with grpc.secure_channel(hostport, credentials) as channel: |
| 82 | + yield intercept_channel(channel, client_interceptor()) |
62 | 83 |
|
63 | 84 |
|
64 | 85 | def client_interceptor(tracer_provider=None):
|
|
0 commit comments