traefik/vendor/github.com/openzipkin/zipkin-go-opentracing/wire/carrier.go
2018-01-10 17:48:04 +01:00

65 lines
1.8 KiB
Go

package wire
import (
"github.com/openzipkin/zipkin-go-opentracing/flag"
"github.com/openzipkin/zipkin-go-opentracing/types"
)
// ProtobufCarrier is a DelegatingCarrier that uses protocol buffers as the
// the underlying datastructure. The reason for implementing DelagatingCarrier
// is to allow for end users to serialize the underlying protocol buffers using
// jsonpb or any other serialization forms they want.
type ProtobufCarrier TracerState
// SetState set's the tracer state.
func (p *ProtobufCarrier) SetState(traceID types.TraceID, spanID uint64, parentSpanID *uint64, sampled bool, flags flag.Flags) {
p.TraceId = traceID.Low
p.TraceIdHigh = traceID.High
p.SpanId = spanID
if parentSpanID == nil {
flags |= flag.IsRoot
p.ParentSpanId = 0
} else {
flags &^= flag.IsRoot
p.ParentSpanId = *parentSpanID
}
flags |= flag.SamplingSet
if sampled {
flags |= flag.Sampled
p.Sampled = sampled
} else {
flags &^= flag.Sampled
}
p.Flags = uint64(flags)
}
// State returns the tracer state.
func (p *ProtobufCarrier) State() (traceID types.TraceID, spanID uint64, parentSpanID *uint64, sampled bool, flags flag.Flags) {
traceID.Low = p.TraceId
traceID.High = p.TraceIdHigh
spanID = p.SpanId
sampled = p.Sampled
flags = flag.Flags(p.Flags)
if flags&flag.IsRoot == 0 {
parentSpanID = &p.ParentSpanId
}
return traceID, spanID, parentSpanID, sampled, flags
}
// SetBaggageItem sets a baggage item.
func (p *ProtobufCarrier) SetBaggageItem(key, value string) {
if p.BaggageItems == nil {
p.BaggageItems = map[string]string{key: value}
return
}
p.BaggageItems[key] = value
}
// GetBaggage iterates over each baggage item and executes the callback with
// the key:value pair.
func (p *ProtobufCarrier) GetBaggage(f func(k, v string)) {
for k, v := range p.BaggageItems {
f(k, v)
}
}