OTEL Baggage. Golang

b, _ := baggage.NewMember("key", "value")
bag, _ := baggage.New(b)
ctx = baggage.ContextWithBaggage(ctx, bag)

Исходный контекст в этом примере мог быть создан например при старте нового span’а. И если потом сделать его Inject то он передастся как http заголовок:

otel.GetTextMapPropagator().Inject(ctx, propagation.HeaderCarrier(w.Header()))

Извлечение пришедшей таким образом информации:

ctx := otel.GetTextMapPropagator().Extract(r.Context(), propagation.HeaderCarrier(r.Header))
 
bag := baggage.FromContext(ctx)
_, span := tracer.Start(ctx, "second")
defer span.End() 
fmt.Println(bag.Member("key").Value())

TextMapPropogator

Важно при объявлении TextMapPropogator использовать композитный “пропогатор” и добавить к стандартной TraceContext так же Baggage: otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))