Skip to content

Default span propagation for tracing in builders #156

@xd009642

Description

@xd009642

Following on from jtescher/opentelemetry-rust#17

It would be useful if the server and client builders provided a default implementing for propagating parent spans via the grpc-trace-bin header. Currently I have something similar to this for a service I'm working on using https://github.com/census-instrumentation/opencensus-go/blob/17d7955af9d42886455ce010dd46878208041a58/plugin/ocgrpc/trace_common.go as a reference for how it's typically done in other languages:

Server::builder()
    .interceptor_fn(|svc, req| {
        let grpc_trace = &req.headers()["grpc-trace-bin"];
        let bp = BinaryPropagator::new();
        let span_state = bp.from_bytes(grpc_trace.as_bytes().into().span_id();
        let parent = match span_state {
            0 => None,
            e @ _ => Some(Id::from_u64(e)),
        };
        let root = match req.uri().path() {
            "/package.service/method" => span!(parent: parent, Level::INFO, "package.service.method"),
            _ => span!(parent: parent, Level::INFO, "package.service.unknown"),
        };
        let _enter = root.enter();
        svc.call(req)
    })
    .add_service(service).serve(addr).await?;

The ugly match is because the span name needs a static lifetime so if there was also a static string representing the package.service.name identifier in the generated grpc code that would be useful as well.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions