open-telemetry / opentelemetry-go-contrib

Collection of extensions for OpenTelemetry-Go.
https://opentelemetry.io/
Apache License 2.0
1.16k stars 551 forks source link

W3C is compatible with B3 protocol #1892

Open dino-ma opened 2 years ago

dino-ma commented 2 years ago

I want to ask how to be compatible with W3C and Zipkin B3 protocol at the same time, and what should I do if W3C protocol takes precedence? I think I need an example.

B3:https://github.com/openzipkin/b3-propagation W3C:https://w3c.github.io/trace-context/ Jaeger:https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/propagators/jaeger/jaeger_propagator.go

If I can, I hope I can be compatible with these three at the same time.

reference resources: https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/propagators https://github.com/open-telemetry/opentelemetry-go/blob/main/example/passthrough/handler/handler.go https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/propagators/b3/b3_example_test.go

My code.

 import(
       "go.opentelemetry.io/contrib/propagators/b3"
    jaegerPropagators "go.opentelemetry.io/contrib/propagators/jaeger"
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/attribute"
    "go.opentelemetry.io/otel/codes"
    "go.opentelemetry.io/otel/exporters/jaeger"
    "go.opentelemetry.io/otel/propagation"
    "go.opentelemetry.io/otel/sdk/resource"
    tracesdk "go.opentelemetry.io/otel/sdk/trace"
    semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
    "go.opentelemetry.io/otel/trace"
)

    jaegerPropagator := jaegerPropagators.Jaeger{}
        b3Propagators := b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader | b3.B3SingleHeader))
        otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}, b3Propagators, jaegerPropagator))

request Header:

At present, Jaeger is OK, B3 is not.

@yurishkuro @Aneurysm9

MrAlias commented 2 years ago

There can only ever be one value for span context values. A span can only belong to a single trace, and that span needs to uniquely be identified.

The way a composite propagator resolves any conflicts is the last propagator wins. That is why you are decoding Jaeger values and not B3 for the trace ID. For extraction of trace data propagators should be passed in order of precedence.

For injection, all propagators of a composite propagator will inject the context. This allows downstream systems that use different context propagation protocols to understand the data.