feat(telemetry): instrument inference duration and frame age
This commit is contained in:
		
							
								
								
									
										58
									
								
								vendor/go.opentelemetry.io/otel/propagation/baggage.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								vendor/go.opentelemetry.io/otel/propagation/baggage.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
// Copyright The OpenTelemetry 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 propagation // import "go.opentelemetry.io/otel/propagation"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/otel/baggage"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const baggageHeader = "baggage"
 | 
			
		||||
 | 
			
		||||
// Baggage is a propagator that supports the W3C Baggage format.
 | 
			
		||||
//
 | 
			
		||||
// This propagates user-defined baggage associated with a trace. The complete
 | 
			
		||||
// specification is defined at https://w3c.github.io/baggage/.
 | 
			
		||||
type Baggage struct{}
 | 
			
		||||
 | 
			
		||||
var _ TextMapPropagator = Baggage{}
 | 
			
		||||
 | 
			
		||||
// Inject sets baggage key-values from ctx into the carrier.
 | 
			
		||||
func (b Baggage) Inject(ctx context.Context, carrier TextMapCarrier) {
 | 
			
		||||
	bStr := baggage.FromContext(ctx).String()
 | 
			
		||||
	if bStr != "" {
 | 
			
		||||
		carrier.Set(baggageHeader, bStr)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Extract returns a copy of parent with the baggage from the carrier added.
 | 
			
		||||
func (b Baggage) Extract(parent context.Context, carrier TextMapCarrier) context.Context {
 | 
			
		||||
	bStr := carrier.Get(baggageHeader)
 | 
			
		||||
	if bStr == "" {
 | 
			
		||||
		return parent
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bag, err := baggage.Parse(bStr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return parent
 | 
			
		||||
	}
 | 
			
		||||
	return baggage.ContextWithBaggage(parent, bag)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Fields returns the keys who's values are set with Inject.
 | 
			
		||||
func (b Baggage) Fields() []string {
 | 
			
		||||
	return []string{baggageHeader}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								vendor/go.opentelemetry.io/otel/propagation/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								vendor/go.opentelemetry.io/otel/propagation/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
// Copyright The OpenTelemetry 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 propagation contains OpenTelemetry context propagators.
 | 
			
		||||
 | 
			
		||||
OpenTelemetry propagators are used to extract and inject context data from and
 | 
			
		||||
into messages exchanged by applications. The propagator supported by this
 | 
			
		||||
package is the W3C Trace Context encoding
 | 
			
		||||
(https://www.w3.org/TR/trace-context/), and W3C Baggage
 | 
			
		||||
(https://w3c.github.io/baggage/).
 | 
			
		||||
*/
 | 
			
		||||
package propagation // import "go.opentelemetry.io/otel/propagation"
 | 
			
		||||
							
								
								
									
										153
									
								
								vendor/go.opentelemetry.io/otel/propagation/propagation.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								vendor/go.opentelemetry.io/otel/propagation/propagation.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,153 @@
 | 
			
		||||
// Copyright The OpenTelemetry 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 propagation // import "go.opentelemetry.io/otel/propagation"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TextMapCarrier is the storage medium used by a TextMapPropagator.
 | 
			
		||||
type TextMapCarrier interface {
 | 
			
		||||
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
			
		||||
	// must never be done outside of a new major release.
 | 
			
		||||
 | 
			
		||||
	// Get returns the value associated with the passed key.
 | 
			
		||||
	Get(key string) string
 | 
			
		||||
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
			
		||||
	// must never be done outside of a new major release.
 | 
			
		||||
 | 
			
		||||
	// Set stores the key-value pair.
 | 
			
		||||
	Set(key string, value string)
 | 
			
		||||
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
			
		||||
	// must never be done outside of a new major release.
 | 
			
		||||
 | 
			
		||||
	// Keys lists the keys stored in this carrier.
 | 
			
		||||
	Keys() []string
 | 
			
		||||
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
			
		||||
	// must never be done outside of a new major release.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MapCarrier is a TextMapCarrier that uses a map held in memory as a storage
 | 
			
		||||
// medium for propagated key-value pairs.
 | 
			
		||||
type MapCarrier map[string]string
 | 
			
		||||
 | 
			
		||||
// Compile time check that MapCarrier implements the TextMapCarrier.
 | 
			
		||||
var _ TextMapCarrier = MapCarrier{}
 | 
			
		||||
 | 
			
		||||
// Get returns the value associated with the passed key.
 | 
			
		||||
func (c MapCarrier) Get(key string) string {
 | 
			
		||||
	return c[key]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Set stores the key-value pair.
 | 
			
		||||
func (c MapCarrier) Set(key, value string) {
 | 
			
		||||
	c[key] = value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Keys lists the keys stored in this carrier.
 | 
			
		||||
func (c MapCarrier) Keys() []string {
 | 
			
		||||
	keys := make([]string, 0, len(c))
 | 
			
		||||
	for k := range c {
 | 
			
		||||
		keys = append(keys, k)
 | 
			
		||||
	}
 | 
			
		||||
	return keys
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HeaderCarrier adapts http.Header to satisfy the TextMapCarrier interface.
 | 
			
		||||
type HeaderCarrier http.Header
 | 
			
		||||
 | 
			
		||||
// Get returns the value associated with the passed key.
 | 
			
		||||
func (hc HeaderCarrier) Get(key string) string {
 | 
			
		||||
	return http.Header(hc).Get(key)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Set stores the key-value pair.
 | 
			
		||||
func (hc HeaderCarrier) Set(key string, value string) {
 | 
			
		||||
	http.Header(hc).Set(key, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Keys lists the keys stored in this carrier.
 | 
			
		||||
func (hc HeaderCarrier) Keys() []string {
 | 
			
		||||
	keys := make([]string, 0, len(hc))
 | 
			
		||||
	for k := range hc {
 | 
			
		||||
		keys = append(keys, k)
 | 
			
		||||
	}
 | 
			
		||||
	return keys
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TextMapPropagator propagates cross-cutting concerns as key-value text
 | 
			
		||||
// pairs within a carrier that travels in-band across process boundaries.
 | 
			
		||||
type TextMapPropagator interface {
 | 
			
		||||
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
			
		||||
	// must never be done outside of a new major release.
 | 
			
		||||
 | 
			
		||||
	// Inject set cross-cutting concerns from the Context into the carrier.
 | 
			
		||||
	Inject(ctx context.Context, carrier TextMapCarrier)
 | 
			
		||||
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
			
		||||
	// must never be done outside of a new major release.
 | 
			
		||||
 | 
			
		||||
	// Extract reads cross-cutting concerns from the carrier into a Context.
 | 
			
		||||
	Extract(ctx context.Context, carrier TextMapCarrier) context.Context
 | 
			
		||||
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
			
		||||
	// must never be done outside of a new major release.
 | 
			
		||||
 | 
			
		||||
	// Fields returns the keys whose values are set with Inject.
 | 
			
		||||
	Fields() []string
 | 
			
		||||
	// DO NOT CHANGE: any modification will not be backwards compatible and
 | 
			
		||||
	// must never be done outside of a new major release.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type compositeTextMapPropagator []TextMapPropagator
 | 
			
		||||
 | 
			
		||||
func (p compositeTextMapPropagator) Inject(ctx context.Context, carrier TextMapCarrier) {
 | 
			
		||||
	for _, i := range p {
 | 
			
		||||
		i.Inject(ctx, carrier)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p compositeTextMapPropagator) Extract(ctx context.Context, carrier TextMapCarrier) context.Context {
 | 
			
		||||
	for _, i := range p {
 | 
			
		||||
		ctx = i.Extract(ctx, carrier)
 | 
			
		||||
	}
 | 
			
		||||
	return ctx
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p compositeTextMapPropagator) Fields() []string {
 | 
			
		||||
	unique := make(map[string]struct{})
 | 
			
		||||
	for _, i := range p {
 | 
			
		||||
		for _, k := range i.Fields() {
 | 
			
		||||
			unique[k] = struct{}{}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fields := make([]string, 0, len(unique))
 | 
			
		||||
	for k := range unique {
 | 
			
		||||
		fields = append(fields, k)
 | 
			
		||||
	}
 | 
			
		||||
	return fields
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewCompositeTextMapPropagator returns a unified TextMapPropagator from the
 | 
			
		||||
// group of passed TextMapPropagator. This allows different cross-cutting
 | 
			
		||||
// concerns to be propagates in a unified manner.
 | 
			
		||||
//
 | 
			
		||||
// The returned TextMapPropagator will inject and extract cross-cutting
 | 
			
		||||
// concerns in the order the TextMapPropagators were provided. Additionally,
 | 
			
		||||
// the Fields method will return a de-duplicated slice of the keys that are
 | 
			
		||||
// set with the Inject method.
 | 
			
		||||
func NewCompositeTextMapPropagator(p ...TextMapPropagator) TextMapPropagator {
 | 
			
		||||
	return compositeTextMapPropagator(p)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										159
									
								
								vendor/go.opentelemetry.io/otel/propagation/trace_context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								vendor/go.opentelemetry.io/otel/propagation/trace_context.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,159 @@
 | 
			
		||||
// Copyright The OpenTelemetry 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 propagation // import "go.opentelemetry.io/otel/propagation"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/hex"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"regexp"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/otel/trace"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	supportedVersion  = 0
 | 
			
		||||
	maxVersion        = 254
 | 
			
		||||
	traceparentHeader = "traceparent"
 | 
			
		||||
	tracestateHeader  = "tracestate"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TraceContext is a propagator that supports the W3C Trace Context format
 | 
			
		||||
// (https://www.w3.org/TR/trace-context/)
 | 
			
		||||
//
 | 
			
		||||
// This propagator will propagate the traceparent and tracestate headers to
 | 
			
		||||
// guarantee traces are not broken. It is up to the users of this propagator
 | 
			
		||||
// to choose if they want to participate in a trace by modifying the
 | 
			
		||||
// traceparent header and relevant parts of the tracestate header containing
 | 
			
		||||
// their proprietary information.
 | 
			
		||||
type TraceContext struct{}
 | 
			
		||||
 | 
			
		||||
var _ TextMapPropagator = TraceContext{}
 | 
			
		||||
var traceCtxRegExp = regexp.MustCompile("^(?P<version>[0-9a-f]{2})-(?P<traceID>[a-f0-9]{32})-(?P<spanID>[a-f0-9]{16})-(?P<traceFlags>[a-f0-9]{2})(?:-.*)?$")
 | 
			
		||||
 | 
			
		||||
// Inject set tracecontext from the Context into the carrier.
 | 
			
		||||
func (tc TraceContext) Inject(ctx context.Context, carrier TextMapCarrier) {
 | 
			
		||||
	sc := trace.SpanContextFromContext(ctx)
 | 
			
		||||
	if !sc.IsValid() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ts := sc.TraceState().String(); ts != "" {
 | 
			
		||||
		carrier.Set(tracestateHeader, ts)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Clear all flags other than the trace-context supported sampling bit.
 | 
			
		||||
	flags := sc.TraceFlags() & trace.FlagsSampled
 | 
			
		||||
 | 
			
		||||
	h := fmt.Sprintf("%.2x-%s-%s-%s",
 | 
			
		||||
		supportedVersion,
 | 
			
		||||
		sc.TraceID(),
 | 
			
		||||
		sc.SpanID(),
 | 
			
		||||
		flags)
 | 
			
		||||
	carrier.Set(traceparentHeader, h)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Extract reads tracecontext from the carrier into a returned Context.
 | 
			
		||||
//
 | 
			
		||||
// The returned Context will be a copy of ctx and contain the extracted
 | 
			
		||||
// tracecontext as the remote SpanContext. If the extracted tracecontext is
 | 
			
		||||
// invalid, the passed ctx will be returned directly instead.
 | 
			
		||||
func (tc TraceContext) Extract(ctx context.Context, carrier TextMapCarrier) context.Context {
 | 
			
		||||
	sc := tc.extract(carrier)
 | 
			
		||||
	if !sc.IsValid() {
 | 
			
		||||
		return ctx
 | 
			
		||||
	}
 | 
			
		||||
	return trace.ContextWithRemoteSpanContext(ctx, sc)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tc TraceContext) extract(carrier TextMapCarrier) trace.SpanContext {
 | 
			
		||||
	h := carrier.Get(traceparentHeader)
 | 
			
		||||
	if h == "" {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	matches := traceCtxRegExp.FindStringSubmatch(h)
 | 
			
		||||
 | 
			
		||||
	if len(matches) == 0 {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(matches) < 5 { // four subgroups plus the overall match
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(matches[1]) != 2 {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
	ver, err := hex.DecodeString(matches[1])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
	version := int(ver[0])
 | 
			
		||||
	if version > maxVersion {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if version == 0 && len(matches) != 5 { // four subgroups plus the overall match
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(matches[2]) != 32 {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var scc trace.SpanContextConfig
 | 
			
		||||
 | 
			
		||||
	scc.TraceID, err = trace.TraceIDFromHex(matches[2][:32])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(matches[3]) != 16 {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
	scc.SpanID, err = trace.SpanIDFromHex(matches[3])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(matches[4]) != 2 {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
	opts, err := hex.DecodeString(matches[4])
 | 
			
		||||
	if err != nil || len(opts) < 1 || (version == 0 && opts[0] > 2) {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
	// Clear all flags other than the trace-context supported sampling bit.
 | 
			
		||||
	scc.TraceFlags = trace.TraceFlags(opts[0]) & trace.FlagsSampled
 | 
			
		||||
 | 
			
		||||
	// Ignore the error returned here. Failure to parse tracestate MUST NOT
 | 
			
		||||
	// affect the parsing of traceparent according to the W3C tracecontext
 | 
			
		||||
	// specification.
 | 
			
		||||
	scc.TraceState, _ = trace.ParseTraceState(carrier.Get(tracestateHeader))
 | 
			
		||||
	scc.Remote = true
 | 
			
		||||
 | 
			
		||||
	sc := trace.NewSpanContext(scc)
 | 
			
		||||
	if !sc.IsValid() {
 | 
			
		||||
		return trace.SpanContext{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Fields returns the keys who's values are set with Inject.
 | 
			
		||||
func (tc TraceContext) Fields() []string {
 | 
			
		||||
	return []string{traceparentHeader, tracestateHeader}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user