@@ -77,8 +77,7 @@ def run():
77
77
import grpc
78
78
79
79
from opentelemetry import trace
80
- from opentelemetry.instrumentation.grpc import GrpcInstrumentorServer, server_interceptor
81
- from opentelemetry.instrumentation.grpc.grpcext import intercept_server
80
+ from opentelemetry.instrumentation.grpc import GrpcInstrumentorServer
82
81
from opentelemetry.sdk.trace import TracerProvider
83
82
from opentelemetry.sdk.trace.export import (
84
83
ConsoleSpanExporter,
@@ -94,10 +93,10 @@ def run():
94
93
trace.get_tracer_provider().add_span_processor(
95
94
SimpleExportSpanProcessor(ConsoleSpanExporter())
96
95
)
96
+
97
97
grpc_server_instrumentor = GrpcInstrumentorServer()
98
98
grpc_server_instrumentor.instrument()
99
99
100
-
101
100
class Greeter(helloworld_pb2_grpc.GreeterServicer):
102
101
def SayHello(self, request, context):
103
102
return helloworld_pb2.HelloReply(message="Hello, %s!" % request.name)
@@ -106,7 +105,6 @@ def SayHello(self, request, context):
106
105
def serve():
107
106
108
107
server = grpc.server(futures.ThreadPoolExecutor())
109
- server = intercept_server(server, server_interceptor())
110
108
111
109
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
112
110
server.add_insecure_port("[::]:50051")
@@ -117,18 +115,25 @@ def serve():
117
115
if __name__ == "__main__":
118
116
logging.basicConfig()
119
117
serve()
118
+
119
+ You can also add the instrumentor manually, rather than using
120
+ :py:class:`~opentelemetry.instrumentation.grpc.GrpcInstrumentorServer`:
121
+
122
+ .. code-block:: python
123
+
124
+ from opentelemetry.instrumentation.grpc import server_interceptor
125
+
126
+ server = grpc.server(futures.ThreadPoolExecutor(),
127
+ interceptors = [server_interceptor()])
128
+
120
129
"""
121
- from contextlib import contextmanager
122
130
from functools import partial
123
131
124
132
import grpc
125
133
from wrapt import wrap_function_wrapper as _wrap
126
134
127
135
from opentelemetry import trace
128
- from opentelemetry .instrumentation .grpc .grpcext import (
129
- intercept_channel ,
130
- intercept_server ,
131
- )
136
+ from opentelemetry .instrumentation .grpc .grpcext import intercept_channel
132
137
from opentelemetry .instrumentation .grpc .version import __version__
133
138
from opentelemetry .instrumentation .instrumentor import BaseInstrumentor
134
139
from opentelemetry .instrumentation .utils import unwrap
@@ -140,15 +145,33 @@ def serve():
140
145
141
146
142
147
class GrpcInstrumentorServer (BaseInstrumentor ):
148
+ """
149
+ Globally instrument the grpc server.
150
+
151
+ Usage::
152
+
153
+ grpc_server_instrumentor = GrpcInstrumentorServer()
154
+ grpc_server_instrumentor.instrument()
155
+
156
+ """
157
+
158
+ # pylint:disable=attribute-defined-outside-init
159
+
143
160
def _instrument (self , ** kwargs ):
144
- _wrap ( "grpc" , "server" , self . wrapper_fn )
161
+ self . _original_func = grpc . server
145
162
146
- def _uninstrument (self , ** kwargs ):
147
- unwrap (grpc , "server" )
163
+ def server (* args , ** kwargs ):
164
+ if "interceptors" in kwargs :
165
+ # add our interceptor as the first
166
+ kwargs ["interceptors" ].insert (0 , server_interceptor ())
167
+ else :
168
+ kwargs ["interceptors" ] = [server_interceptor ()]
169
+ return self ._original_func (* args , ** kwargs )
148
170
149
- def wrapper_fn (self , original_func , instance , args , kwargs ):
150
- server = original_func (* args , ** kwargs )
151
- return intercept_server (server , server_interceptor ())
171
+ grpc .server = server
172
+
173
+ def _uninstrument (self , ** kwargs ):
174
+ grpc .server = self ._original_func
152
175
153
176
154
177
class GrpcInstrumentorClient (BaseInstrumentor ):
0 commit comments