1// Copyright The OpenTelemetry Authors
2// SPDX-License-Identifier: Apache-2.0
3
4package propagation // import "go.opentelemetry.io/otel/propagation"
5
6import (
7 "context"
8
9 "go.opentelemetry.io/otel/baggage"
10)
11
12const baggageHeader = "baggage"
13
14// Baggage is a propagator that supports the W3C Baggage format.
15//
16// This propagates user-defined baggage associated with a trace. The complete
17// specification is defined at https://www.w3.org/TR/baggage/.
18type Baggage struct{}
19
20var _ TextMapPropagator = Baggage{}
21
22// Inject sets baggage key-values from ctx into the carrier.
23func (b Baggage) Inject(ctx context.Context, carrier TextMapCarrier) {
24 bStr := baggage.FromContext(ctx).String()
25 if bStr != "" {
26 carrier.Set(baggageHeader, bStr)
27 }
28}
29
30// Extract returns a copy of parent with the baggage from the carrier added.
31func (b Baggage) Extract(parent context.Context, carrier TextMapCarrier) context.Context {
32 bStr := carrier.Get(baggageHeader)
33 if bStr == "" {
34 return parent
35 }
36
37 bag, err := baggage.Parse(bStr)
38 if err != nil {
39 return parent
40 }
41 return baggage.ContextWithBaggage(parent, bag)
42}
43
44// Fields returns the keys who's values are set with Inject.
45func (b Baggage) Fields() []string {
46 return []string{baggageHeader}
47}