mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
* update vendor directory, add go.opencensus.io * update imports * oops * s/opentracing/opencensus/ & remove prometheus / zipkin stuff & remove old stats * the dep train rides again * fix gin build * deps from last guy * start in on the agent metrics * she builds * remove tags for now, cardinality error is fussing. subscribe instead of register * update to patched version of opencensus to proceed for now TODO switch to a release * meh fix imports * println debug the bad boys * lace it with the tags * update deps again * fix all inconsistent cardinality errors * add our own logger * fix init * fix oom measure * remove bugged removal code * fix s3 measures * fix prom handler nil
74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package b3
|
|
|
|
import (
|
|
"google.golang.org/grpc/metadata"
|
|
|
|
"github.com/openzipkin/zipkin-go/model"
|
|
"github.com/openzipkin/zipkin-go/propagation"
|
|
)
|
|
|
|
// ExtractGRPC will extract a span.Context from the gRPC Request metadata if
|
|
// found in B3 header format.
|
|
func ExtractGRPC(md *metadata.MD) propagation.Extractor {
|
|
return func() (*model.SpanContext, error) {
|
|
var (
|
|
traceIDHeader = GetGRPCHeader(md, TraceID)
|
|
spanIDHeader = GetGRPCHeader(md, SpanID)
|
|
parentSpanIDHeader = GetGRPCHeader(md, ParentSpanID)
|
|
sampledHeader = GetGRPCHeader(md, Sampled)
|
|
flagsHeader = GetGRPCHeader(md, Flags)
|
|
)
|
|
|
|
return ParseHeaders(
|
|
traceIDHeader, spanIDHeader, parentSpanIDHeader, sampledHeader,
|
|
flagsHeader,
|
|
)
|
|
}
|
|
}
|
|
|
|
// InjectGRPC will inject a span.Context into gRPC metadata.
|
|
func InjectGRPC(md *metadata.MD) propagation.Injector {
|
|
return func(sc model.SpanContext) error {
|
|
if (model.SpanContext{}) == sc {
|
|
return ErrEmptyContext
|
|
}
|
|
|
|
if sc.Debug {
|
|
setGRPCHeader(md, Flags, "1")
|
|
} else if sc.Sampled != nil {
|
|
// Debug is encoded as X-B3-Flags: 1. Since Debug implies Sampled,
|
|
// we don't send "X-B3-Sampled" if Debug is set.
|
|
if *sc.Sampled {
|
|
setGRPCHeader(md, Sampled, "1")
|
|
} else {
|
|
setGRPCHeader(md, Sampled, "0")
|
|
}
|
|
}
|
|
|
|
if !sc.TraceID.Empty() && sc.ID > 0 {
|
|
// set identifiers
|
|
setGRPCHeader(md, TraceID, sc.TraceID.String())
|
|
setGRPCHeader(md, SpanID, sc.ID.String())
|
|
if sc.ParentID != nil {
|
|
setGRPCHeader(md, ParentSpanID, sc.ParentID.String())
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// GetGRPCHeader retrieves the last value found for a particular key. If key is
|
|
// not found it returns an empty string.
|
|
func GetGRPCHeader(md *metadata.MD, key string) string {
|
|
v := (*md)[key]
|
|
if len(v) < 1 {
|
|
return ""
|
|
}
|
|
return v[len(v)-1]
|
|
}
|
|
|
|
func setGRPCHeader(md *metadata.MD, key, value string) {
|
|
(*md)[key] = append((*md)[key], value)
|
|
}
|