The grpcio-opentracing
package makes it easy to add OpenTracing support to
gRPC-based systems in Python.
pip install grpcio-opentracing
See the below code for basic usage or examples/trivial for a complete example.
from grpc_opentracing import open_tracing_client_interceptor
from grpc_opentracing.grpcext import intercept_channel
tracer = # some OpenTracing Tracer instance
interceptor = open_tracing_client_interceptor(tracer)
channel = # the grpc.Channel you created to invoke RPCs
channel = intercept_channel(channel, interceptor)
# All future RPC activity involving `channel` will be automatically traced.
from grpc_opentracing import open_tracing_server_interceptor
from grpc_opentracing.grpcext import intercept_server
tracer = # some OpenTracing Tracer instance
interceptor = open_tracing_server_interceptor(tracer)
server = # the grpc.Server you created to receive RPCs
server = intercept_server(server, interceptor)
# All future RPC activity involving `server` will be automatically traced.
grpcio-opentracing
provides features that let you connect its span with other
tracing spans. On the client-side, you can write a class that derives from
ActiveSpanSource
and provide it when creating the interceptor.
class CustomActiveSpanSource(ActiveSpanSource):
@classmethod
def get_active_span(self):
# your custom method of getting the active span
tracer = # some OpenTracing Tracer instance
interceptor = open_tracing_client_interceptor(
tracer,
active_span_source=CustomActiveSpanSource)
...
On the server-side, the context
argument passed into your service methods
packages the gRPC span created on the server-side.
class CustomRpcService(...):
...
def Method1(self, request, context):
span = context.get_active_span()
...
See examples/integration for a complete example.