Copyright 2018, OpenCensus Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Package b3 contains a propagation.HTTPFormat implementation for B3 propagation. See https://github.com/openzipkin/b3-propagation for more details.
package b3 // import "go.opencensus.io/plugin/ochttp/propagation/b3"

import (
	
	

	
	
)
B3 headers that OpenCensus understands.
const (
	TraceIDHeader = "X-B3-TraceId"
	SpanIDHeader  = "X-B3-SpanId"
	SampledHeader = "X-B3-Sampled"
)
HTTPFormat implements propagation.HTTPFormat to propagate traces in HTTP headers in B3 propagation format. HTTPFormat skips the X-B3-ParentId and X-B3-Flags headers because there are additional fields not represented in the OpenCensus span context. Spans created from the incoming header will be the direct children of the client-side span. Similarly, receiver of the outgoing spans should use client-side span created by OpenCensus as the parent.
type HTTPFormat struct{}

var _ propagation.HTTPFormat = (*HTTPFormat)(nil)
SpanContextFromRequest extracts a B3 span context from incoming requests.
func ( *HTTPFormat) ( *http.Request) ( trace.SpanContext,  bool) {
	,  := ParseTraceID(.Header.Get(TraceIDHeader))
	if ! {
		return trace.SpanContext{}, false
	}
	,  := ParseSpanID(.Header.Get(SpanIDHeader))
	if ! {
		return trace.SpanContext{}, false
	}
	,  := ParseSampled(.Header.Get(SampledHeader))
	return trace.SpanContext{
		TraceID:      ,
		SpanID:       ,
		TraceOptions: ,
	}, true
}
ParseTraceID parses the value of the X-B3-TraceId header.
func ( string) (trace.TraceID, bool) {
	if  == "" {
		return trace.TraceID{}, false
	}
	,  := hex.DecodeString()
	if  != nil || len() > 16 {
		return trace.TraceID{}, false
	}
	var  trace.TraceID
The lower 64-bits.
		 := 8 + (8 - len())
		copy([:], )
	} else {
		 := 16 - len()
		copy([:], )
	}

	return , true
}
ParseSpanID parses the value of the X-B3-SpanId or X-B3-ParentSpanId headers.
func ( string) ( trace.SpanID,  bool) {
	if  == "" {
		return trace.SpanID{}, false
	}
	,  := hex.DecodeString()
	if  != nil || len() > 8 {
		return trace.SpanID{}, false
	}
	 := 8 - len()
	copy([:], )
	return , true
}
ParseSampled parses the value of the X-B3-Sampled header.
func ( string) (trace.TraceOptions, bool) {
	switch  {
	case "true", "1":
		return trace.TraceOptions(1), true
	default:
		return trace.TraceOptions(0), false
	}
}
SpanContextToRequest modifies the given request to include B3 headers.
func ( *HTTPFormat) ( trace.SpanContext,  *http.Request) {
	.Header.Set(TraceIDHeader, hex.EncodeToString(.TraceID[:]))
	.Header.Set(SpanIDHeader, hex.EncodeToString(.SpanID[:]))

	var  string
	if .IsSampled() {
		 = "1"
	} else {
		 = "0"
	}
	.Header.Set(SampledHeader, )