Skip to content

Commit ffa3b39

Browse files
Rewrite gRPC server interceptor (open-telemetry#1171)
Co-authored-by: Aaron Abbott <[email protected]>
1 parent bcc53c8 commit ffa3b39

File tree

7 files changed

+256
-461
lines changed

7 files changed

+256
-461
lines changed

docs/examples/opentelemetry-example-app/src/opentelemetry_example_app/grpc/hello_world_server.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343

4444
from opentelemetry import trace
4545
from opentelemetry.instrumentation.grpc import server_interceptor
46-
from opentelemetry.instrumentation.grpc.grpcext import intercept_server
4746
from opentelemetry.sdk.trace import TracerProvider
4847
from opentelemetry.sdk.trace.export import (
4948
ConsoleSpanExporter,
@@ -73,8 +72,9 @@ def SayHello(self, request, context):
7372

7473
def serve():
7574

76-
server = grpc.server(futures.ThreadPoolExecutor())
77-
server = intercept_server(server, server_interceptor())
75+
server = grpc.server(
76+
futures.ThreadPoolExecutor(), interceptors=[server_interceptor()],
77+
)
7878

7979
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
8080
server.add_insecure_port("[::]:50051")

docs/examples/opentelemetry-example-app/src/opentelemetry_example_app/grpc/route_guide_server.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646

4747
from opentelemetry import trace
4848
from opentelemetry.instrumentation.grpc import server_interceptor
49-
from opentelemetry.instrumentation.grpc.grpcext import intercept_server
5049
from opentelemetry.sdk.trace import TracerProvider
5150
from opentelemetry.sdk.trace.export import (
5251
ConsoleSpanExporter,
@@ -162,8 +161,10 @@ def RouteChat(self, request_iterator, context):
162161

163162

164163
def serve():
165-
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
166-
server = intercept_server(server, server_interceptor())
164+
server = grpc.server(
165+
futures.ThreadPoolExecutor(max_workers=10),
166+
interceptors=[server_interceptor()],
167+
)
167168

168169
route_guide_pb2_grpc.add_RouteGuideServicer_to_server(
169170
RouteGuideServicer(), server

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

+38-15
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ def run():
7777
import grpc
7878
7979
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
8281
from opentelemetry.sdk.trace import TracerProvider
8382
from opentelemetry.sdk.trace.export import (
8483
ConsoleSpanExporter,
@@ -94,10 +93,10 @@ def run():
9493
trace.get_tracer_provider().add_span_processor(
9594
SimpleExportSpanProcessor(ConsoleSpanExporter())
9695
)
96+
9797
grpc_server_instrumentor = GrpcInstrumentorServer()
9898
grpc_server_instrumentor.instrument()
9999
100-
101100
class Greeter(helloworld_pb2_grpc.GreeterServicer):
102101
def SayHello(self, request, context):
103102
return helloworld_pb2.HelloReply(message="Hello, %s!" % request.name)
@@ -106,7 +105,6 @@ def SayHello(self, request, context):
106105
def serve():
107106
108107
server = grpc.server(futures.ThreadPoolExecutor())
109-
server = intercept_server(server, server_interceptor())
110108
111109
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
112110
server.add_insecure_port("[::]:50051")
@@ -117,18 +115,25 @@ def serve():
117115
if __name__ == "__main__":
118116
logging.basicConfig()
119117
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+
120129
"""
121-
from contextlib import contextmanager
122130
from functools import partial
123131

124132
import grpc
125133
from wrapt import wrap_function_wrapper as _wrap
126134

127135
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
132137
from opentelemetry.instrumentation.grpc.version import __version__
133138
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
134139
from opentelemetry.instrumentation.utils import unwrap
@@ -140,15 +145,33 @@ def serve():
140145

141146

142147
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+
143160
def _instrument(self, **kwargs):
144-
_wrap("grpc", "server", self.wrapper_fn)
161+
self._original_func = grpc.server
145162

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)
148170

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
152175

153176

154177
class GrpcInstrumentorClient(BaseInstrumentor):

0 commit comments

Comments
 (0)