66 lines
1.8 KiB
Go
66 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)
|
||
|
}
|
||
|
}
|