Search code examples
pythongrpczipkinopentracingjaeger

get trace ID of sent request


I'm using the Open Tracing Python library for GRPC and am trying to build off of the example script here: https://github.com/opentracing-contrib/python-grpc/blob/master/examples/trivial/trivial_client.py.

Once I have sent a request through the intercepted channel, how do I find the trace-id value for the request? I want to use this to look at the traced data in the Jaeger UI.


Solution

  • I had missed a key piece of documentation. In order to get a trace ID, you have to create a span on the client side. This span will have the trace ID that can be used to examine data in the Jaeger UI. The span has to be added into the GRPC messages via an ActiveSpanSource instance.

    # opentracing-related imports
    from grpc_opentracing import open_tracing_client_interceptor, ActiveSpanSource
    from grpc_opentracing.grpcext import intercept_channel
    from jaeger_client import Config
    
    # dummy class to hold span data for passing into GRPC channel
    class FixedActiveSpanSource(ActiveSpanSource):
    
        def __init__(self):
            self.active_span = None
    
        def get_active_span(self):
            return self.active_span
    
    config = Config(
        config={
            'sampler': {
                'type': 'const',
                'param': 1,
            },
            'logging': True,
        },
        service_name='foo')
    
    tracer = config.initialize_tracer()
    
    # ...
    # In the method where GRPC requests are sent
    # ...
    active_span_source = FixedActiveSpanSource()
    tracer_interceptor = open_tracing_client_interceptor(
        tracer,
        log_payloads=True,
        active_span_source=active_span_source)
    
    with tracer.start_span('span-foo') as span:
        print(f"Created span: trace_id:{span.trace_id:x}, span_id:{span.span_id:x}, parent_id:{span.parent_id}, flags:{span.flags:x}")
        # provide the span to the GRPC interceptor here
        active_span_source.active_span = span
        with grpc.insecure_channel(...) as channel:
            channel = intercept_channel(channel, tracer_interceptor)
    

    Of course, you could switch the ordering of the with statements so that the span is created after the GRPC channel. That part doesn't make any difference.