feat(telemetry): instrument inference duration and frame age
This commit is contained in:
		
							
								
								
									
										16
									
								
								vendor/go.opentelemetry.io/otel/attribute/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/go.opentelemetry.io/otel/attribute/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
// 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 attribute provides key and value attributes.
 | 
			
		||||
package attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
							
								
								
									
										150
									
								
								vendor/go.opentelemetry.io/otel/attribute/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								vendor/go.opentelemetry.io/otel/attribute/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,150 @@
 | 
			
		||||
// 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 attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	// Encoder is a mechanism for serializing a label set into a
 | 
			
		||||
	// specific string representation that supports caching, to
 | 
			
		||||
	// avoid repeated serialization. An example could be an
 | 
			
		||||
	// exporter encoding the label set into a wire representation.
 | 
			
		||||
	Encoder interface {
 | 
			
		||||
		// Encode returns the serialized encoding of the label
 | 
			
		||||
		// set using its Iterator.  This result may be cached
 | 
			
		||||
		// by a attribute.Set.
 | 
			
		||||
		Encode(iterator Iterator) string
 | 
			
		||||
 | 
			
		||||
		// ID returns a value that is unique for each class of
 | 
			
		||||
		// label encoder.  Label encoders allocate these using
 | 
			
		||||
		// `NewEncoderID`.
 | 
			
		||||
		ID() EncoderID
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// EncoderID is used to identify distinct Encoder
 | 
			
		||||
	// implementations, for caching encoded results.
 | 
			
		||||
	EncoderID struct {
 | 
			
		||||
		value uint64
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// defaultLabelEncoder uses a sync.Pool of buffers to reduce
 | 
			
		||||
	// the number of allocations used in encoding labels.  This
 | 
			
		||||
	// implementation encodes a comma-separated list of key=value,
 | 
			
		||||
	// with '/'-escaping of '=', ',', and '\'.
 | 
			
		||||
	defaultLabelEncoder struct {
 | 
			
		||||
		// pool is a pool of labelset builders.  The buffers in this
 | 
			
		||||
		// pool grow to a size that most label encodings will not
 | 
			
		||||
		// allocate new memory.
 | 
			
		||||
		pool sync.Pool // *bytes.Buffer
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// escapeChar is used to ensure uniqueness of the label encoding where
 | 
			
		||||
// keys or values contain either '=' or ','.  Since there is no parser
 | 
			
		||||
// needed for this encoding and its only requirement is to be unique,
 | 
			
		||||
// this choice is arbitrary.  Users will see these in some exporters
 | 
			
		||||
// (e.g., stdout), so the backslash ('\') is used as a conventional choice.
 | 
			
		||||
const escapeChar = '\\'
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	_ Encoder = &defaultLabelEncoder{}
 | 
			
		||||
 | 
			
		||||
	// encoderIDCounter is for generating IDs for other label
 | 
			
		||||
	// encoders.
 | 
			
		||||
	encoderIDCounter uint64
 | 
			
		||||
 | 
			
		||||
	defaultEncoderOnce     sync.Once
 | 
			
		||||
	defaultEncoderID       = NewEncoderID()
 | 
			
		||||
	defaultEncoderInstance *defaultLabelEncoder
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewEncoderID returns a unique label encoder ID. It should be
 | 
			
		||||
// called once per each type of label encoder. Preferably in init() or
 | 
			
		||||
// in var definition.
 | 
			
		||||
func NewEncoderID() EncoderID {
 | 
			
		||||
	return EncoderID{value: atomic.AddUint64(&encoderIDCounter, 1)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DefaultEncoder returns a label encoder that encodes labels
 | 
			
		||||
// in such a way that each escaped label's key is followed by an equal
 | 
			
		||||
// sign and then by an escaped label's value. All key-value pairs are
 | 
			
		||||
// separated by a comma.
 | 
			
		||||
//
 | 
			
		||||
// Escaping is done by prepending a backslash before either a
 | 
			
		||||
// backslash, equal sign or a comma.
 | 
			
		||||
func DefaultEncoder() Encoder {
 | 
			
		||||
	defaultEncoderOnce.Do(func() {
 | 
			
		||||
		defaultEncoderInstance = &defaultLabelEncoder{
 | 
			
		||||
			pool: sync.Pool{
 | 
			
		||||
				New: func() interface{} {
 | 
			
		||||
					return &bytes.Buffer{}
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
	return defaultEncoderInstance
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Encode is a part of an implementation of the LabelEncoder
 | 
			
		||||
// interface.
 | 
			
		||||
func (d *defaultLabelEncoder) Encode(iter Iterator) string {
 | 
			
		||||
	buf := d.pool.Get().(*bytes.Buffer)
 | 
			
		||||
	defer d.pool.Put(buf)
 | 
			
		||||
	buf.Reset()
 | 
			
		||||
 | 
			
		||||
	for iter.Next() {
 | 
			
		||||
		i, keyValue := iter.IndexedLabel()
 | 
			
		||||
		if i > 0 {
 | 
			
		||||
			_, _ = buf.WriteRune(',')
 | 
			
		||||
		}
 | 
			
		||||
		copyAndEscape(buf, string(keyValue.Key))
 | 
			
		||||
 | 
			
		||||
		_, _ = buf.WriteRune('=')
 | 
			
		||||
 | 
			
		||||
		if keyValue.Value.Type() == STRING {
 | 
			
		||||
			copyAndEscape(buf, keyValue.Value.AsString())
 | 
			
		||||
		} else {
 | 
			
		||||
			_, _ = buf.WriteString(keyValue.Value.Emit())
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return buf.String()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ID is a part of an implementation of the LabelEncoder interface.
 | 
			
		||||
func (*defaultLabelEncoder) ID() EncoderID {
 | 
			
		||||
	return defaultEncoderID
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// copyAndEscape escapes `=`, `,` and its own escape character (`\`),
 | 
			
		||||
// making the default encoding unique.
 | 
			
		||||
func copyAndEscape(buf *bytes.Buffer, val string) {
 | 
			
		||||
	for _, ch := range val {
 | 
			
		||||
		switch ch {
 | 
			
		||||
		case '=', ',', escapeChar:
 | 
			
		||||
			buf.WriteRune(escapeChar)
 | 
			
		||||
		}
 | 
			
		||||
		buf.WriteRune(ch)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Valid returns true if this encoder ID was allocated by
 | 
			
		||||
// `NewEncoderID`.  Invalid encoder IDs will not be cached.
 | 
			
		||||
func (id EncoderID) Valid() bool {
 | 
			
		||||
	return id.value != 0
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										143
									
								
								vendor/go.opentelemetry.io/otel/attribute/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								vendor/go.opentelemetry.io/otel/attribute/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,143 @@
 | 
			
		||||
// 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 attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
// Iterator allows iterating over the set of labels in order,
 | 
			
		||||
// sorted by key.
 | 
			
		||||
type Iterator struct {
 | 
			
		||||
	storage *Set
 | 
			
		||||
	idx     int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MergeIterator supports iterating over two sets of labels while
 | 
			
		||||
// eliminating duplicate values from the combined set.  The first
 | 
			
		||||
// iterator value takes precedence.
 | 
			
		||||
type MergeIterator struct {
 | 
			
		||||
	one     oneIterator
 | 
			
		||||
	two     oneIterator
 | 
			
		||||
	current KeyValue
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type oneIterator struct {
 | 
			
		||||
	iter  Iterator
 | 
			
		||||
	done  bool
 | 
			
		||||
	label KeyValue
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Next moves the iterator to the next position. Returns false if there
 | 
			
		||||
// are no more labels.
 | 
			
		||||
func (i *Iterator) Next() bool {
 | 
			
		||||
	i.idx++
 | 
			
		||||
	return i.idx < i.Len()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Label returns current KeyValue. Must be called only after Next returns
 | 
			
		||||
// true.
 | 
			
		||||
func (i *Iterator) Label() KeyValue {
 | 
			
		||||
	kv, _ := i.storage.Get(i.idx)
 | 
			
		||||
	return kv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Attribute is a synonym for Label().
 | 
			
		||||
func (i *Iterator) Attribute() KeyValue {
 | 
			
		||||
	return i.Label()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IndexedLabel returns current index and attribute. Must be called only
 | 
			
		||||
// after Next returns true.
 | 
			
		||||
func (i *Iterator) IndexedLabel() (int, KeyValue) {
 | 
			
		||||
	return i.idx, i.Label()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns a number of labels in the iterator's `*Set`.
 | 
			
		||||
func (i *Iterator) Len() int {
 | 
			
		||||
	return i.storage.Len()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ToSlice is a convenience function that creates a slice of labels
 | 
			
		||||
// from the passed iterator. The iterator is set up to start from the
 | 
			
		||||
// beginning before creating the slice.
 | 
			
		||||
func (i *Iterator) ToSlice() []KeyValue {
 | 
			
		||||
	l := i.Len()
 | 
			
		||||
	if l == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	i.idx = -1
 | 
			
		||||
	slice := make([]KeyValue, 0, l)
 | 
			
		||||
	for i.Next() {
 | 
			
		||||
		slice = append(slice, i.Label())
 | 
			
		||||
	}
 | 
			
		||||
	return slice
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewMergeIterator returns a MergeIterator for merging two label sets
 | 
			
		||||
// Duplicates are resolved by taking the value from the first set.
 | 
			
		||||
func NewMergeIterator(s1, s2 *Set) MergeIterator {
 | 
			
		||||
	mi := MergeIterator{
 | 
			
		||||
		one: makeOne(s1.Iter()),
 | 
			
		||||
		two: makeOne(s2.Iter()),
 | 
			
		||||
	}
 | 
			
		||||
	return mi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func makeOne(iter Iterator) oneIterator {
 | 
			
		||||
	oi := oneIterator{
 | 
			
		||||
		iter: iter,
 | 
			
		||||
	}
 | 
			
		||||
	oi.advance()
 | 
			
		||||
	return oi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (oi *oneIterator) advance() {
 | 
			
		||||
	if oi.done = !oi.iter.Next(); !oi.done {
 | 
			
		||||
		oi.label = oi.iter.Label()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Next returns true if there is another label available.
 | 
			
		||||
func (m *MergeIterator) Next() bool {
 | 
			
		||||
	if m.one.done && m.two.done {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if m.one.done {
 | 
			
		||||
		m.current = m.two.label
 | 
			
		||||
		m.two.advance()
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if m.two.done {
 | 
			
		||||
		m.current = m.one.label
 | 
			
		||||
		m.one.advance()
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if m.one.label.Key == m.two.label.Key {
 | 
			
		||||
		m.current = m.one.label // first iterator label value wins
 | 
			
		||||
		m.one.advance()
 | 
			
		||||
		m.two.advance()
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if m.one.label.Key < m.two.label.Key {
 | 
			
		||||
		m.current = m.one.label
 | 
			
		||||
		m.one.advance()
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	m.current = m.two.label
 | 
			
		||||
	m.two.advance()
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Label returns the current value after Next() returns true.
 | 
			
		||||
func (m *MergeIterator) Label() KeyValue {
 | 
			
		||||
	return m.current
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										134
									
								
								vendor/go.opentelemetry.io/otel/attribute/key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								vendor/go.opentelemetry.io/otel/attribute/key.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,134 @@
 | 
			
		||||
// 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 attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
// Key represents the key part in key-value pairs. It's a string. The
 | 
			
		||||
// allowed character set in the key depends on the use of the key.
 | 
			
		||||
type Key string
 | 
			
		||||
 | 
			
		||||
// Bool creates a KeyValue instance with a BOOL Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Bool(name, value).
 | 
			
		||||
func (k Key) Bool(v bool) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: BoolValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BoolSlice creates a KeyValue instance with a BOOLSLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- BoolSlice(name, value).
 | 
			
		||||
func (k Key) BoolSlice(v []bool) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: BoolSliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int creates a KeyValue instance with an INT64 Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Int(name, value).
 | 
			
		||||
func (k Key) Int(v int) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: IntValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IntSlice creates a KeyValue instance with an INT64SLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- IntSlice(name, value).
 | 
			
		||||
func (k Key) IntSlice(v []int) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: IntSliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64 creates a KeyValue instance with an INT64 Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Int64(name, value).
 | 
			
		||||
func (k Key) Int64(v int64) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: Int64Value(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64Slice creates a KeyValue instance with an INT64SLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Int64Slice(name, value).
 | 
			
		||||
func (k Key) Int64Slice(v []int64) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: Int64SliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64 creates a KeyValue instance with a FLOAT64 Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Float64(name, value).
 | 
			
		||||
func (k Key) Float64(v float64) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: Float64Value(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64Slice creates a KeyValue instance with a FLOAT64SLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- Float64(name, value).
 | 
			
		||||
func (k Key) Float64Slice(v []float64) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: Float64SliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String creates a KeyValue instance with a STRING Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- String(name, value).
 | 
			
		||||
func (k Key) String(v string) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: StringValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringSlice creates a KeyValue instance with a STRINGSLICE Value.
 | 
			
		||||
//
 | 
			
		||||
// If creating both a key and value at the same time, use the provided
 | 
			
		||||
// convenience function instead -- StringSlice(name, value).
 | 
			
		||||
func (k Key) StringSlice(v []string) KeyValue {
 | 
			
		||||
	return KeyValue{
 | 
			
		||||
		Key:   k,
 | 
			
		||||
		Value: StringSliceValue(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Defined returns true for non-empty keys.
 | 
			
		||||
func (k Key) Defined() bool {
 | 
			
		||||
	return len(k) != 0
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										86
									
								
								vendor/go.opentelemetry.io/otel/attribute/kv.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								vendor/go.opentelemetry.io/otel/attribute/kv.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
// 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 attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// KeyValue holds a key and value pair.
 | 
			
		||||
type KeyValue struct {
 | 
			
		||||
	Key   Key
 | 
			
		||||
	Value Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Valid returns if kv is a valid OpenTelemetry attribute.
 | 
			
		||||
func (kv KeyValue) Valid() bool {
 | 
			
		||||
	return kv.Key != "" && kv.Value.Type() != INVALID
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Bool creates a KeyValue with a BOOL Value type.
 | 
			
		||||
func Bool(k string, v bool) KeyValue {
 | 
			
		||||
	return Key(k).Bool(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BoolSlice creates a KeyValue with a BOOLSLICE Value type.
 | 
			
		||||
func BoolSlice(k string, v []bool) KeyValue {
 | 
			
		||||
	return Key(k).BoolSlice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int creates a KeyValue with an INT64 Value type.
 | 
			
		||||
func Int(k string, v int) KeyValue {
 | 
			
		||||
	return Key(k).Int(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IntSlice creates a KeyValue with an INT64SLICE Value type.
 | 
			
		||||
func IntSlice(k string, v []int) KeyValue {
 | 
			
		||||
	return Key(k).IntSlice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64 creates a KeyValue with an INT64 Value type.
 | 
			
		||||
func Int64(k string, v int64) KeyValue {
 | 
			
		||||
	return Key(k).Int64(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64Slice creates a KeyValue with an INT64SLICE Value type.
 | 
			
		||||
func Int64Slice(k string, v []int64) KeyValue {
 | 
			
		||||
	return Key(k).Int64Slice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64 creates a KeyValue with a FLOAT64 Value type.
 | 
			
		||||
func Float64(k string, v float64) KeyValue {
 | 
			
		||||
	return Key(k).Float64(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64Slice creates a KeyValue with a FLOAT64SLICE Value type.
 | 
			
		||||
func Float64Slice(k string, v []float64) KeyValue {
 | 
			
		||||
	return Key(k).Float64Slice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String creates a KeyValue with a STRING Value type.
 | 
			
		||||
func String(k, v string) KeyValue {
 | 
			
		||||
	return Key(k).String(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringSlice creates a KeyValue with a STRINGSLICE Value type.
 | 
			
		||||
func StringSlice(k string, v []string) KeyValue {
 | 
			
		||||
	return Key(k).StringSlice(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stringer creates a new key-value pair with a passed name and a string
 | 
			
		||||
// value generated by the passed Stringer interface.
 | 
			
		||||
func Stringer(k string, v fmt.Stringer) KeyValue {
 | 
			
		||||
	return Key(k).String(v.String())
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										426
									
								
								vendor/go.opentelemetry.io/otel/attribute/set.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										426
									
								
								vendor/go.opentelemetry.io/otel/attribute/set.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,426 @@
 | 
			
		||||
// 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 attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	// Set is the representation for a distinct label set.  It
 | 
			
		||||
	// manages an immutable set of labels, with an internal cache
 | 
			
		||||
	// for storing label encodings.
 | 
			
		||||
	//
 | 
			
		||||
	// This type supports the `Equivalent` method of comparison
 | 
			
		||||
	// using values of type `Distinct`.
 | 
			
		||||
	//
 | 
			
		||||
	// This type is used to implement:
 | 
			
		||||
	// 1. Metric labels
 | 
			
		||||
	// 2. Resource sets
 | 
			
		||||
	// 3. Correlation map (TODO)
 | 
			
		||||
	Set struct {
 | 
			
		||||
		equivalent Distinct
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Distinct wraps a variable-size array of `KeyValue`,
 | 
			
		||||
	// constructed with keys in sorted order.  This can be used as
 | 
			
		||||
	// a map key or for equality checking between Sets.
 | 
			
		||||
	Distinct struct {
 | 
			
		||||
		iface interface{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Filter supports removing certain labels from label sets.
 | 
			
		||||
	// When the filter returns true, the label will be kept in
 | 
			
		||||
	// the filtered label set.  When the filter returns false, the
 | 
			
		||||
	// label is excluded from the filtered label set, and the
 | 
			
		||||
	// label instead appears in the `removed` list of excluded labels.
 | 
			
		||||
	Filter func(KeyValue) bool
 | 
			
		||||
 | 
			
		||||
	// Sortable implements `sort.Interface`, used for sorting
 | 
			
		||||
	// `KeyValue`.  This is an exported type to support a
 | 
			
		||||
	// memory optimization.  A pointer to one of these is needed
 | 
			
		||||
	// for the call to `sort.Stable()`, which the caller may
 | 
			
		||||
	// provide in order to avoid an allocation.  See
 | 
			
		||||
	// `NewSetWithSortable()`.
 | 
			
		||||
	Sortable []KeyValue
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// keyValueType is used in `computeDistinctReflect`.
 | 
			
		||||
	keyValueType = reflect.TypeOf(KeyValue{})
 | 
			
		||||
 | 
			
		||||
	// emptySet is returned for empty label sets.
 | 
			
		||||
	emptySet = &Set{
 | 
			
		||||
		equivalent: Distinct{
 | 
			
		||||
			iface: [0]KeyValue{},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EmptySet returns a reference to a Set with no elements.
 | 
			
		||||
//
 | 
			
		||||
// This is a convenience provided for optimized calling utility.
 | 
			
		||||
func EmptySet() *Set {
 | 
			
		||||
	return emptySet
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// reflect abbreviates `reflect.ValueOf`.
 | 
			
		||||
func (d Distinct) reflect() reflect.Value {
 | 
			
		||||
	return reflect.ValueOf(d.iface)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Valid returns true if this value refers to a valid `*Set`.
 | 
			
		||||
func (d Distinct) Valid() bool {
 | 
			
		||||
	return d.iface != nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns the number of labels in this set.
 | 
			
		||||
func (l *Set) Len() int {
 | 
			
		||||
	if l == nil || !l.equivalent.Valid() {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	return l.equivalent.reflect().Len()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get returns the KeyValue at ordered position `idx` in this set.
 | 
			
		||||
func (l *Set) Get(idx int) (KeyValue, bool) {
 | 
			
		||||
	if l == nil {
 | 
			
		||||
		return KeyValue{}, false
 | 
			
		||||
	}
 | 
			
		||||
	value := l.equivalent.reflect()
 | 
			
		||||
 | 
			
		||||
	if idx >= 0 && idx < value.Len() {
 | 
			
		||||
		// Note: The Go compiler successfully avoids an allocation for
 | 
			
		||||
		// the interface{} conversion here:
 | 
			
		||||
		return value.Index(idx).Interface().(KeyValue), true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return KeyValue{}, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Value returns the value of a specified key in this set.
 | 
			
		||||
func (l *Set) Value(k Key) (Value, bool) {
 | 
			
		||||
	if l == nil {
 | 
			
		||||
		return Value{}, false
 | 
			
		||||
	}
 | 
			
		||||
	rValue := l.equivalent.reflect()
 | 
			
		||||
	vlen := rValue.Len()
 | 
			
		||||
 | 
			
		||||
	idx := sort.Search(vlen, func(idx int) bool {
 | 
			
		||||
		return rValue.Index(idx).Interface().(KeyValue).Key >= k
 | 
			
		||||
	})
 | 
			
		||||
	if idx >= vlen {
 | 
			
		||||
		return Value{}, false
 | 
			
		||||
	}
 | 
			
		||||
	keyValue := rValue.Index(idx).Interface().(KeyValue)
 | 
			
		||||
	if k == keyValue.Key {
 | 
			
		||||
		return keyValue.Value, true
 | 
			
		||||
	}
 | 
			
		||||
	return Value{}, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasValue tests whether a key is defined in this set.
 | 
			
		||||
func (l *Set) HasValue(k Key) bool {
 | 
			
		||||
	if l == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	_, ok := l.Value(k)
 | 
			
		||||
	return ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Iter returns an iterator for visiting the labels in this set.
 | 
			
		||||
func (l *Set) Iter() Iterator {
 | 
			
		||||
	return Iterator{
 | 
			
		||||
		storage: l,
 | 
			
		||||
		idx:     -1,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ToSlice returns the set of labels belonging to this set, sorted,
 | 
			
		||||
// where keys appear no more than once.
 | 
			
		||||
func (l *Set) ToSlice() []KeyValue {
 | 
			
		||||
	iter := l.Iter()
 | 
			
		||||
	return iter.ToSlice()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equivalent returns a value that may be used as a map key.  The
 | 
			
		||||
// Distinct type guarantees that the result will equal the equivalent
 | 
			
		||||
// Distinct value of any label set with the same elements as this,
 | 
			
		||||
// where sets are made unique by choosing the last value in the input
 | 
			
		||||
// for any given key.
 | 
			
		||||
func (l *Set) Equivalent() Distinct {
 | 
			
		||||
	if l == nil || !l.equivalent.Valid() {
 | 
			
		||||
		return emptySet.equivalent
 | 
			
		||||
	}
 | 
			
		||||
	return l.equivalent
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equals returns true if the argument set is equivalent to this set.
 | 
			
		||||
func (l *Set) Equals(o *Set) bool {
 | 
			
		||||
	return l.Equivalent() == o.Equivalent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Encoded returns the encoded form of this set, according to
 | 
			
		||||
// `encoder`.
 | 
			
		||||
func (l *Set) Encoded(encoder Encoder) string {
 | 
			
		||||
	if l == nil || encoder == nil {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return encoder.Encode(l.Iter())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func empty() Set {
 | 
			
		||||
	return Set{
 | 
			
		||||
		equivalent: emptySet.equivalent,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSet returns a new `Set`.  See the documentation for
 | 
			
		||||
// `NewSetWithSortableFiltered` for more details.
 | 
			
		||||
//
 | 
			
		||||
// Except for empty sets, this method adds an additional allocation
 | 
			
		||||
// compared with calls that include a `*Sortable`.
 | 
			
		||||
func NewSet(kvs ...KeyValue) Set {
 | 
			
		||||
	// Check for empty set.
 | 
			
		||||
	if len(kvs) == 0 {
 | 
			
		||||
		return empty()
 | 
			
		||||
	}
 | 
			
		||||
	s, _ := NewSetWithSortableFiltered(kvs, new(Sortable), nil)
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSetWithSortable returns a new `Set`.  See the documentation for
 | 
			
		||||
// `NewSetWithSortableFiltered` for more details.
 | 
			
		||||
//
 | 
			
		||||
// This call includes a `*Sortable` option as a memory optimization.
 | 
			
		||||
func NewSetWithSortable(kvs []KeyValue, tmp *Sortable) Set {
 | 
			
		||||
	// Check for empty set.
 | 
			
		||||
	if len(kvs) == 0 {
 | 
			
		||||
		return empty()
 | 
			
		||||
	}
 | 
			
		||||
	s, _ := NewSetWithSortableFiltered(kvs, tmp, nil)
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSetWithFiltered returns a new `Set`.  See the documentation for
 | 
			
		||||
// `NewSetWithSortableFiltered` for more details.
 | 
			
		||||
//
 | 
			
		||||
// This call includes a `Filter` to include/exclude label keys from
 | 
			
		||||
// the return value.  Excluded keys are returned as a slice of label
 | 
			
		||||
// values.
 | 
			
		||||
func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
 | 
			
		||||
	// Check for empty set.
 | 
			
		||||
	if len(kvs) == 0 {
 | 
			
		||||
		return empty(), nil
 | 
			
		||||
	}
 | 
			
		||||
	return NewSetWithSortableFiltered(kvs, new(Sortable), filter)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSetWithSortableFiltered returns a new `Set`.
 | 
			
		||||
//
 | 
			
		||||
// Duplicate keys are eliminated by taking the last value.  This
 | 
			
		||||
// re-orders the input slice so that unique last-values are contiguous
 | 
			
		||||
// at the end of the slice.
 | 
			
		||||
//
 | 
			
		||||
// This ensures the following:
 | 
			
		||||
//
 | 
			
		||||
// - Last-value-wins semantics
 | 
			
		||||
// - Caller sees the reordering, but doesn't lose values
 | 
			
		||||
// - Repeated call preserve last-value wins.
 | 
			
		||||
//
 | 
			
		||||
// Note that methods are defined on `*Set`, although this returns `Set`.
 | 
			
		||||
// Callers can avoid memory allocations by:
 | 
			
		||||
//
 | 
			
		||||
// - allocating a `Sortable` for use as a temporary in this method
 | 
			
		||||
// - allocating a `Set` for storing the return value of this
 | 
			
		||||
//   constructor.
 | 
			
		||||
//
 | 
			
		||||
// The result maintains a cache of encoded labels, by attribute.EncoderID.
 | 
			
		||||
// This value should not be copied after its first use.
 | 
			
		||||
//
 | 
			
		||||
// The second `[]KeyValue` return value is a list of labels that were
 | 
			
		||||
// excluded by the Filter (if non-nil).
 | 
			
		||||
func NewSetWithSortableFiltered(kvs []KeyValue, tmp *Sortable, filter Filter) (Set, []KeyValue) {
 | 
			
		||||
	// Check for empty set.
 | 
			
		||||
	if len(kvs) == 0 {
 | 
			
		||||
		return empty(), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	*tmp = kvs
 | 
			
		||||
 | 
			
		||||
	// Stable sort so the following de-duplication can implement
 | 
			
		||||
	// last-value-wins semantics.
 | 
			
		||||
	sort.Stable(tmp)
 | 
			
		||||
 | 
			
		||||
	*tmp = nil
 | 
			
		||||
 | 
			
		||||
	position := len(kvs) - 1
 | 
			
		||||
	offset := position - 1
 | 
			
		||||
 | 
			
		||||
	// The requirements stated above require that the stable
 | 
			
		||||
	// result be placed in the end of the input slice, while
 | 
			
		||||
	// overwritten values are swapped to the beginning.
 | 
			
		||||
	//
 | 
			
		||||
	// De-duplicate with last-value-wins semantics.  Preserve
 | 
			
		||||
	// duplicate values at the beginning of the input slice.
 | 
			
		||||
	for ; offset >= 0; offset-- {
 | 
			
		||||
		if kvs[offset].Key == kvs[position].Key {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		position--
 | 
			
		||||
		kvs[offset], kvs[position] = kvs[position], kvs[offset]
 | 
			
		||||
	}
 | 
			
		||||
	if filter != nil {
 | 
			
		||||
		return filterSet(kvs[position:], filter)
 | 
			
		||||
	}
 | 
			
		||||
	return Set{
 | 
			
		||||
		equivalent: computeDistinct(kvs[position:]),
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// filterSet reorders `kvs` so that included keys are contiguous at
 | 
			
		||||
// the end of the slice, while excluded keys precede the included keys.
 | 
			
		||||
func filterSet(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
 | 
			
		||||
	var excluded []KeyValue
 | 
			
		||||
 | 
			
		||||
	// Move labels that do not match the filter so
 | 
			
		||||
	// they're adjacent before calling computeDistinct().
 | 
			
		||||
	distinctPosition := len(kvs)
 | 
			
		||||
 | 
			
		||||
	// Swap indistinct keys forward and distinct keys toward the
 | 
			
		||||
	// end of the slice.
 | 
			
		||||
	offset := len(kvs) - 1
 | 
			
		||||
	for ; offset >= 0; offset-- {
 | 
			
		||||
		if filter(kvs[offset]) {
 | 
			
		||||
			distinctPosition--
 | 
			
		||||
			kvs[offset], kvs[distinctPosition] = kvs[distinctPosition], kvs[offset]
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	excluded = kvs[:distinctPosition]
 | 
			
		||||
 | 
			
		||||
	return Set{
 | 
			
		||||
		equivalent: computeDistinct(kvs[distinctPosition:]),
 | 
			
		||||
	}, excluded
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Filter returns a filtered copy of this `Set`.  See the
 | 
			
		||||
// documentation for `NewSetWithSortableFiltered` for more details.
 | 
			
		||||
func (l *Set) Filter(re Filter) (Set, []KeyValue) {
 | 
			
		||||
	if re == nil {
 | 
			
		||||
		return Set{
 | 
			
		||||
			equivalent: l.equivalent,
 | 
			
		||||
		}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Note: This could be refactored to avoid the temporary slice
 | 
			
		||||
	// allocation, if it proves to be expensive.
 | 
			
		||||
	return filterSet(l.ToSlice(), re)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// computeDistinct returns a `Distinct` using either the fixed- or
 | 
			
		||||
// reflect-oriented code path, depending on the size of the input.
 | 
			
		||||
// The input slice is assumed to already be sorted and de-duplicated.
 | 
			
		||||
func computeDistinct(kvs []KeyValue) Distinct {
 | 
			
		||||
	iface := computeDistinctFixed(kvs)
 | 
			
		||||
	if iface == nil {
 | 
			
		||||
		iface = computeDistinctReflect(kvs)
 | 
			
		||||
	}
 | 
			
		||||
	return Distinct{
 | 
			
		||||
		iface: iface,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// computeDistinctFixed computes a `Distinct` for small slices.  It
 | 
			
		||||
// returns nil if the input is too large for this code path.
 | 
			
		||||
func computeDistinctFixed(kvs []KeyValue) interface{} {
 | 
			
		||||
	switch len(kvs) {
 | 
			
		||||
	case 1:
 | 
			
		||||
		ptr := new([1]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 2:
 | 
			
		||||
		ptr := new([2]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 3:
 | 
			
		||||
		ptr := new([3]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 4:
 | 
			
		||||
		ptr := new([4]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 5:
 | 
			
		||||
		ptr := new([5]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 6:
 | 
			
		||||
		ptr := new([6]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 7:
 | 
			
		||||
		ptr := new([7]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 8:
 | 
			
		||||
		ptr := new([8]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 9:
 | 
			
		||||
		ptr := new([9]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	case 10:
 | 
			
		||||
		ptr := new([10]KeyValue)
 | 
			
		||||
		copy((*ptr)[:], kvs)
 | 
			
		||||
		return *ptr
 | 
			
		||||
	default:
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// computeDistinctReflect computes a `Distinct` using reflection,
 | 
			
		||||
// works for any size input.
 | 
			
		||||
func computeDistinctReflect(kvs []KeyValue) interface{} {
 | 
			
		||||
	at := reflect.New(reflect.ArrayOf(len(kvs), keyValueType)).Elem()
 | 
			
		||||
	for i, keyValue := range kvs {
 | 
			
		||||
		*(at.Index(i).Addr().Interface().(*KeyValue)) = keyValue
 | 
			
		||||
	}
 | 
			
		||||
	return at.Interface()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON returns the JSON encoding of the `*Set`.
 | 
			
		||||
func (l *Set) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	return json.Marshal(l.equivalent.iface)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len implements `sort.Interface`.
 | 
			
		||||
func (l *Sortable) Len() int {
 | 
			
		||||
	return len(*l)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Swap implements `sort.Interface`.
 | 
			
		||||
func (l *Sortable) Swap(i, j int) {
 | 
			
		||||
	(*l)[i], (*l)[j] = (*l)[j], (*l)[i]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Less implements `sort.Interface`.
 | 
			
		||||
func (l *Sortable) Less(i, j int) bool {
 | 
			
		||||
	return (*l)[i].Key < (*l)[j].Key
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/go.opentelemetry.io/otel/attribute/type_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/go.opentelemetry.io/otel/attribute/type_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
// Code generated by "stringer -type=Type"; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package attribute
 | 
			
		||||
 | 
			
		||||
import "strconv"
 | 
			
		||||
 | 
			
		||||
func _() {
 | 
			
		||||
	// An "invalid array index" compiler error signifies that the constant values have changed.
 | 
			
		||||
	// Re-run the stringer command to generate them again.
 | 
			
		||||
	var x [1]struct{}
 | 
			
		||||
	_ = x[INVALID-0]
 | 
			
		||||
	_ = x[BOOL-1]
 | 
			
		||||
	_ = x[INT64-2]
 | 
			
		||||
	_ = x[FLOAT64-3]
 | 
			
		||||
	_ = x[STRING-4]
 | 
			
		||||
	_ = x[BOOLSLICE-5]
 | 
			
		||||
	_ = x[INT64SLICE-6]
 | 
			
		||||
	_ = x[FLOAT64SLICE-7]
 | 
			
		||||
	_ = x[STRINGSLICE-8]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const _Type_name = "INVALIDBOOLINT64FLOAT64STRINGBOOLSLICEINT64SLICEFLOAT64SLICESTRINGSLICE"
 | 
			
		||||
 | 
			
		||||
var _Type_index = [...]uint8{0, 7, 11, 16, 23, 29, 38, 48, 60, 71}
 | 
			
		||||
 | 
			
		||||
func (i Type) String() string {
 | 
			
		||||
	if i < 0 || i >= Type(len(_Type_index)-1) {
 | 
			
		||||
		return "Type(" + strconv.FormatInt(int64(i), 10) + ")"
 | 
			
		||||
	}
 | 
			
		||||
	return _Type_name[_Type_index[i]:_Type_index[i+1]]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										271
									
								
								vendor/go.opentelemetry.io/otel/attribute/value.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								vendor/go.opentelemetry.io/otel/attribute/value.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,271 @@
 | 
			
		||||
// 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 attribute // import "go.opentelemetry.io/otel/attribute"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/otel/internal"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:generate stringer -type=Type
 | 
			
		||||
 | 
			
		||||
// Type describes the type of the data Value holds.
 | 
			
		||||
type Type int
 | 
			
		||||
 | 
			
		||||
// Value represents the value part in key-value pairs.
 | 
			
		||||
type Value struct {
 | 
			
		||||
	vtype    Type
 | 
			
		||||
	numeric  uint64
 | 
			
		||||
	stringly string
 | 
			
		||||
	slice    interface{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// INVALID is used for a Value with no value set.
 | 
			
		||||
	INVALID Type = iota
 | 
			
		||||
	// BOOL is a boolean Type Value.
 | 
			
		||||
	BOOL
 | 
			
		||||
	// INT64 is a 64-bit signed integral Type Value.
 | 
			
		||||
	INT64
 | 
			
		||||
	// FLOAT64 is a 64-bit floating point Type Value.
 | 
			
		||||
	FLOAT64
 | 
			
		||||
	// STRING is a string Type Value.
 | 
			
		||||
	STRING
 | 
			
		||||
	// BOOLSLICE is a slice of booleans Type Value.
 | 
			
		||||
	BOOLSLICE
 | 
			
		||||
	// INT64SLICE is a slice of 64-bit signed integral numbers Type Value.
 | 
			
		||||
	INT64SLICE
 | 
			
		||||
	// FLOAT64SLICE is a slice of 64-bit floating point numbers Type Value.
 | 
			
		||||
	FLOAT64SLICE
 | 
			
		||||
	// STRINGSLICE is a slice of strings Type Value.
 | 
			
		||||
	STRINGSLICE
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// BoolValue creates a BOOL Value.
 | 
			
		||||
func BoolValue(v bool) Value {
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype:   BOOL,
 | 
			
		||||
		numeric: internal.BoolToRaw(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BoolSliceValue creates a BOOLSLICE Value.
 | 
			
		||||
func BoolSliceValue(v []bool) Value {
 | 
			
		||||
	cp := make([]bool, len(v))
 | 
			
		||||
	copy(cp, v)
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: BOOLSLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IntValue creates an INT64 Value.
 | 
			
		||||
func IntValue(v int) Value {
 | 
			
		||||
	return Int64Value(int64(v))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IntSliceValue creates an INTSLICE Value.
 | 
			
		||||
func IntSliceValue(v []int) Value {
 | 
			
		||||
	cp := make([]int64, 0, len(v))
 | 
			
		||||
	for _, i := range v {
 | 
			
		||||
		cp = append(cp, int64(i))
 | 
			
		||||
	}
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: INT64SLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64Value creates an INT64 Value.
 | 
			
		||||
func Int64Value(v int64) Value {
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype:   INT64,
 | 
			
		||||
		numeric: internal.Int64ToRaw(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64SliceValue creates an INT64SLICE Value.
 | 
			
		||||
func Int64SliceValue(v []int64) Value {
 | 
			
		||||
	cp := make([]int64, len(v))
 | 
			
		||||
	copy(cp, v)
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: INT64SLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64Value creates a FLOAT64 Value.
 | 
			
		||||
func Float64Value(v float64) Value {
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype:   FLOAT64,
 | 
			
		||||
		numeric: internal.Float64ToRaw(v),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64SliceValue creates a FLOAT64SLICE Value.
 | 
			
		||||
func Float64SliceValue(v []float64) Value {
 | 
			
		||||
	cp := make([]float64, len(v))
 | 
			
		||||
	copy(cp, v)
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: FLOAT64SLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringValue creates a STRING Value.
 | 
			
		||||
func StringValue(v string) Value {
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype:    STRING,
 | 
			
		||||
		stringly: v,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StringSliceValue creates a STRINGSLICE Value.
 | 
			
		||||
func StringSliceValue(v []string) Value {
 | 
			
		||||
	cp := make([]string, len(v))
 | 
			
		||||
	copy(cp, v)
 | 
			
		||||
	return Value{
 | 
			
		||||
		vtype: STRINGSLICE,
 | 
			
		||||
		slice: &cp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Type returns a type of the Value.
 | 
			
		||||
func (v Value) Type() Type {
 | 
			
		||||
	return v.vtype
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsBool returns the bool value. Make sure that the Value's type is
 | 
			
		||||
// BOOL.
 | 
			
		||||
func (v Value) AsBool() bool {
 | 
			
		||||
	return internal.RawToBool(v.numeric)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsBoolSlice returns the []bool value. Make sure that the Value's type is
 | 
			
		||||
// BOOLSLICE.
 | 
			
		||||
func (v Value) AsBoolSlice() []bool {
 | 
			
		||||
	if s, ok := v.slice.(*[]bool); ok {
 | 
			
		||||
		return *s
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsInt64 returns the int64 value. Make sure that the Value's type is
 | 
			
		||||
// INT64.
 | 
			
		||||
func (v Value) AsInt64() int64 {
 | 
			
		||||
	return internal.RawToInt64(v.numeric)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsInt64Slice returns the []int64 value. Make sure that the Value's type is
 | 
			
		||||
// INT64SLICE.
 | 
			
		||||
func (v Value) AsInt64Slice() []int64 {
 | 
			
		||||
	if s, ok := v.slice.(*[]int64); ok {
 | 
			
		||||
		return *s
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsFloat64 returns the float64 value. Make sure that the Value's
 | 
			
		||||
// type is FLOAT64.
 | 
			
		||||
func (v Value) AsFloat64() float64 {
 | 
			
		||||
	return internal.RawToFloat64(v.numeric)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsFloat64Slice returns the []float64 value. Make sure that the Value's type is
 | 
			
		||||
// INT64SLICE.
 | 
			
		||||
func (v Value) AsFloat64Slice() []float64 {
 | 
			
		||||
	if s, ok := v.slice.(*[]float64); ok {
 | 
			
		||||
		return *s
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsString returns the string value. Make sure that the Value's type
 | 
			
		||||
// is STRING.
 | 
			
		||||
func (v Value) AsString() string {
 | 
			
		||||
	return v.stringly
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AsStringSlice returns the []string value. Make sure that the Value's type is
 | 
			
		||||
// INT64SLICE.
 | 
			
		||||
func (v Value) AsStringSlice() []string {
 | 
			
		||||
	if s, ok := v.slice.(*[]string); ok {
 | 
			
		||||
		return *s
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type unknownValueType struct{}
 | 
			
		||||
 | 
			
		||||
// AsInterface returns Value's data as interface{}.
 | 
			
		||||
func (v Value) AsInterface() interface{} {
 | 
			
		||||
	switch v.Type() {
 | 
			
		||||
	case BOOL:
 | 
			
		||||
		return v.AsBool()
 | 
			
		||||
	case BOOLSLICE:
 | 
			
		||||
		return v.AsBoolSlice()
 | 
			
		||||
	case INT64:
 | 
			
		||||
		return v.AsInt64()
 | 
			
		||||
	case INT64SLICE:
 | 
			
		||||
		return v.AsInt64Slice()
 | 
			
		||||
	case FLOAT64:
 | 
			
		||||
		return v.AsFloat64()
 | 
			
		||||
	case FLOAT64SLICE:
 | 
			
		||||
		return v.AsFloat64Slice()
 | 
			
		||||
	case STRING:
 | 
			
		||||
		return v.stringly
 | 
			
		||||
	case STRINGSLICE:
 | 
			
		||||
		return v.AsStringSlice()
 | 
			
		||||
	}
 | 
			
		||||
	return unknownValueType{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Emit returns a string representation of Value's data.
 | 
			
		||||
func (v Value) Emit() string {
 | 
			
		||||
	switch v.Type() {
 | 
			
		||||
	case BOOLSLICE:
 | 
			
		||||
		return fmt.Sprint(*(v.slice.(*[]bool)))
 | 
			
		||||
	case BOOL:
 | 
			
		||||
		return strconv.FormatBool(v.AsBool())
 | 
			
		||||
	case INT64SLICE:
 | 
			
		||||
		return fmt.Sprint(*(v.slice.(*[]int64)))
 | 
			
		||||
	case INT64:
 | 
			
		||||
		return strconv.FormatInt(v.AsInt64(), 10)
 | 
			
		||||
	case FLOAT64SLICE:
 | 
			
		||||
		return fmt.Sprint(*(v.slice.(*[]float64)))
 | 
			
		||||
	case FLOAT64:
 | 
			
		||||
		return fmt.Sprint(v.AsFloat64())
 | 
			
		||||
	case STRINGSLICE:
 | 
			
		||||
		return fmt.Sprint(*(v.slice.(*[]string)))
 | 
			
		||||
	case STRING:
 | 
			
		||||
		return v.stringly
 | 
			
		||||
	default:
 | 
			
		||||
		return "unknown"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSON returns the JSON encoding of the Value.
 | 
			
		||||
func (v Value) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	var jsonVal struct {
 | 
			
		||||
		Type  string
 | 
			
		||||
		Value interface{}
 | 
			
		||||
	}
 | 
			
		||||
	jsonVal.Type = v.Type().String()
 | 
			
		||||
	jsonVal.Value = v.AsInterface()
 | 
			
		||||
	return json.Marshal(jsonVal)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user