diff options
author | Valentin Rothberg <rothberg@redhat.com> | 2021-07-02 13:03:10 +0200 |
---|---|---|
committer | Valentin Rothberg <rothberg@redhat.com> | 2021-07-02 13:03:10 +0200 |
commit | 735be12481cdc3edfcbca3500172d2164255e1a3 (patch) | |
tree | 67f0ee2916812072967707ae6de779ebbcdb0476 /vendor/go.opencensus.io/trace/trace.go | |
parent | 7eb9ed975899ffe12fb82066aebf652444205e02 (diff) | |
download | podman-735be12481cdc3edfcbca3500172d2164255e1a3.tar.gz podman-735be12481cdc3edfcbca3500172d2164255e1a3.tar.bz2 podman-735be12481cdc3edfcbca3500172d2164255e1a3.zip |
force github.com/spf13/cobra@v1.1.3
v1.2.0 is breaking CI (see containers/podman/pull/10844).
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
Diffstat (limited to 'vendor/go.opencensus.io/trace/trace.go')
-rw-r--r-- | vendor/go.opencensus.io/trace/trace.go | 187 |
1 files changed, 95 insertions, 92 deletions
diff --git a/vendor/go.opencensus.io/trace/trace.go b/vendor/go.opencensus.io/trace/trace.go index 861df9d39..3f8977b41 100644 --- a/vendor/go.opencensus.io/trace/trace.go +++ b/vendor/go.opencensus.io/trace/trace.go @@ -28,16 +28,12 @@ import ( "go.opencensus.io/trace/tracestate" ) -type tracer struct{} - -var _ Tracer = &tracer{} - // Span represents a span of a trace. It has an associated SpanContext, and // stores data accumulated while the span is active. // // Ideally users should interact with Spans by calling the functions in this // package that take a Context parameter. -type span struct { +type Span struct { // data contains information recorded about the span. // // It will be non-nil if we are exporting the span or recording events for it. @@ -70,7 +66,7 @@ type span struct { // IsRecordingEvents returns true if events are being recorded for this span. // Use this check to avoid computing expensive annotations when they will never // be used. -func (s *span) IsRecordingEvents() bool { +func (s *Span) IsRecordingEvents() bool { if s == nil { return false } @@ -113,13 +109,13 @@ type SpanContext struct { type contextKey struct{} // FromContext returns the Span stored in a context, or nil if there isn't one. -func (t *tracer) FromContext(ctx context.Context) *Span { +func FromContext(ctx context.Context) *Span { s, _ := ctx.Value(contextKey{}).(*Span) return s } // NewContext returns a new context with the given Span attached. -func (t *tracer) NewContext(parent context.Context, s *Span) context.Context { +func NewContext(parent context.Context, s *Span) context.Context { return context.WithValue(parent, contextKey{}, s) } @@ -170,14 +166,12 @@ func WithSampler(sampler Sampler) StartOption { // // Returned context contains the newly created span. You can use it to // propagate the returned span in process. -func (t *tracer) StartSpan(ctx context.Context, name string, o ...StartOption) (context.Context, *Span) { +func StartSpan(ctx context.Context, name string, o ...StartOption) (context.Context, *Span) { var opts StartOptions var parent SpanContext - if p := t.FromContext(ctx); p != nil { - if ps, ok := p.internal.(*span); ok { - ps.addChild() - } - parent = p.SpanContext() + if p := FromContext(ctx); p != nil { + p.addChild() + parent = p.spanContext } for _, op := range o { op(&opts) @@ -186,8 +180,7 @@ func (t *tracer) StartSpan(ctx context.Context, name string, o ...StartOption) ( ctx, end := startExecutionTracerTask(ctx, name) span.executionTracerTaskEnd = end - extSpan := NewSpan(span) - return t.NewContext(ctx, extSpan), extSpan + return NewContext(ctx, span), span } // StartSpanWithRemoteParent starts a new child span of the span from the given parent. @@ -197,7 +190,7 @@ func (t *tracer) StartSpan(ctx context.Context, name string, o ...StartOption) ( // // Returned context contains the newly created span. You can use it to // propagate the returned span in process. -func (t *tracer) StartSpanWithRemoteParent(ctx context.Context, name string, parent SpanContext, o ...StartOption) (context.Context, *Span) { +func StartSpanWithRemoteParent(ctx context.Context, name string, parent SpanContext, o ...StartOption) (context.Context, *Span) { var opts StartOptions for _, op := range o { op(&opts) @@ -205,24 +198,19 @@ func (t *tracer) StartSpanWithRemoteParent(ctx context.Context, name string, par span := startSpanInternal(name, parent != SpanContext{}, parent, true, opts) ctx, end := startExecutionTracerTask(ctx, name) span.executionTracerTaskEnd = end - extSpan := NewSpan(span) - return t.NewContext(ctx, extSpan), extSpan + return NewContext(ctx, span), span } -func startSpanInternal(name string, hasParent bool, parent SpanContext, remoteParent bool, o StartOptions) *span { - s := &span{} - s.spanContext = parent +func startSpanInternal(name string, hasParent bool, parent SpanContext, remoteParent bool, o StartOptions) *Span { + span := &Span{} + span.spanContext = parent cfg := config.Load().(*Config) - if gen, ok := cfg.IDGenerator.(*defaultIDGenerator); ok { - // lazy initialization - gen.init() - } if !hasParent { - s.spanContext.TraceID = cfg.IDGenerator.NewTraceID() + span.spanContext.TraceID = cfg.IDGenerator.NewTraceID() } - s.spanContext.SpanID = cfg.IDGenerator.NewSpanID() + span.spanContext.SpanID = cfg.IDGenerator.NewSpanID() sampler := cfg.DefaultSampler if !hasParent || remoteParent || o.Sampler != nil { @@ -234,47 +222,47 @@ func startSpanInternal(name string, hasParent bool, parent SpanContext, remotePa if o.Sampler != nil { sampler = o.Sampler } - s.spanContext.setIsSampled(sampler(SamplingParameters{ + span.spanContext.setIsSampled(sampler(SamplingParameters{ ParentContext: parent, - TraceID: s.spanContext.TraceID, - SpanID: s.spanContext.SpanID, + TraceID: span.spanContext.TraceID, + SpanID: span.spanContext.SpanID, Name: name, HasRemoteParent: remoteParent}).Sample) } - if !internal.LocalSpanStoreEnabled && !s.spanContext.IsSampled() { - return s + if !internal.LocalSpanStoreEnabled && !span.spanContext.IsSampled() { + return span } - s.data = &SpanData{ - SpanContext: s.spanContext, + span.data = &SpanData{ + SpanContext: span.spanContext, StartTime: time.Now(), SpanKind: o.SpanKind, Name: name, HasRemoteParent: remoteParent, } - s.lruAttributes = newLruMap(cfg.MaxAttributesPerSpan) - s.annotations = newEvictedQueue(cfg.MaxAnnotationEventsPerSpan) - s.messageEvents = newEvictedQueue(cfg.MaxMessageEventsPerSpan) - s.links = newEvictedQueue(cfg.MaxLinksPerSpan) + span.lruAttributes = newLruMap(cfg.MaxAttributesPerSpan) + span.annotations = newEvictedQueue(cfg.MaxAnnotationEventsPerSpan) + span.messageEvents = newEvictedQueue(cfg.MaxMessageEventsPerSpan) + span.links = newEvictedQueue(cfg.MaxLinksPerSpan) if hasParent { - s.data.ParentSpanID = parent.SpanID + span.data.ParentSpanID = parent.SpanID } if internal.LocalSpanStoreEnabled { var ss *spanStore ss = spanStoreForNameCreateIfNew(name) if ss != nil { - s.spanStore = ss - ss.add(s) + span.spanStore = ss + ss.add(span) } } - return s + return span } // End ends the span. -func (s *span) End() { +func (s *Span) End() { if s == nil { return } @@ -304,7 +292,7 @@ func (s *span) End() { // makeSpanData produces a SpanData representing the current state of the Span. // It requires that s.data is non-nil. -func (s *span) makeSpanData() *SpanData { +func (s *Span) makeSpanData() *SpanData { var sd SpanData s.mu.Lock() sd = *s.data @@ -329,7 +317,7 @@ func (s *span) makeSpanData() *SpanData { } // SpanContext returns the SpanContext of the span. -func (s *span) SpanContext() SpanContext { +func (s *Span) SpanContext() SpanContext { if s == nil { return SpanContext{} } @@ -337,7 +325,7 @@ func (s *span) SpanContext() SpanContext { } // SetName sets the name of the span, if it is recording events. -func (s *span) SetName(name string) { +func (s *Span) SetName(name string) { if !s.IsRecordingEvents() { return } @@ -347,7 +335,7 @@ func (s *span) SetName(name string) { } // SetStatus sets the status of the span, if it is recording events. -func (s *span) SetStatus(status Status) { +func (s *Span) SetStatus(status Status) { if !s.IsRecordingEvents() { return } @@ -356,32 +344,32 @@ func (s *span) SetStatus(status Status) { s.mu.Unlock() } -func (s *span) interfaceArrayToLinksArray() []Link { - linksArr := make([]Link, 0, len(s.links.queue)) +func (s *Span) interfaceArrayToLinksArray() []Link { + linksArr := make([]Link, 0) for _, value := range s.links.queue { linksArr = append(linksArr, value.(Link)) } return linksArr } -func (s *span) interfaceArrayToMessageEventArray() []MessageEvent { - messageEventArr := make([]MessageEvent, 0, len(s.messageEvents.queue)) +func (s *Span) interfaceArrayToMessageEventArray() []MessageEvent { + messageEventArr := make([]MessageEvent, 0) for _, value := range s.messageEvents.queue { messageEventArr = append(messageEventArr, value.(MessageEvent)) } return messageEventArr } -func (s *span) interfaceArrayToAnnotationArray() []Annotation { - annotationArr := make([]Annotation, 0, len(s.annotations.queue)) +func (s *Span) interfaceArrayToAnnotationArray() []Annotation { + annotationArr := make([]Annotation, 0) for _, value := range s.annotations.queue { annotationArr = append(annotationArr, value.(Annotation)) } return annotationArr } -func (s *span) lruAttributesToAttributeMap() map[string]interface{} { - attributes := make(map[string]interface{}, s.lruAttributes.len()) +func (s *Span) lruAttributesToAttributeMap() map[string]interface{} { + attributes := make(map[string]interface{}) for _, key := range s.lruAttributes.keys() { value, ok := s.lruAttributes.get(key) if ok { @@ -392,13 +380,13 @@ func (s *span) lruAttributesToAttributeMap() map[string]interface{} { return attributes } -func (s *span) copyToCappedAttributes(attributes []Attribute) { +func (s *Span) copyToCappedAttributes(attributes []Attribute) { for _, a := range attributes { s.lruAttributes.add(a.key, a.value) } } -func (s *span) addChild() { +func (s *Span) addChild() { if !s.IsRecordingEvents() { return } @@ -410,7 +398,7 @@ func (s *span) addChild() { // AddAttributes sets attributes in the span. // // Existing attributes whose keys appear in the attributes parameter are overwritten. -func (s *span) AddAttributes(attributes ...Attribute) { +func (s *Span) AddAttributes(attributes ...Attribute) { if !s.IsRecordingEvents() { return } @@ -419,27 +407,49 @@ func (s *span) AddAttributes(attributes ...Attribute) { s.mu.Unlock() } -func (s *span) printStringInternal(attributes []Attribute, str string) { +// copyAttributes copies a slice of Attributes into a map. +func copyAttributes(m map[string]interface{}, attributes []Attribute) { + for _, a := range attributes { + m[a.key] = a.value + } +} + +func (s *Span) lazyPrintfInternal(attributes []Attribute, format string, a ...interface{}) { now := time.Now() - var am map[string]interface{} + msg := fmt.Sprintf(format, a...) + var m map[string]interface{} + s.mu.Lock() if len(attributes) != 0 { - am = make(map[string]interface{}, len(attributes)) - for _, attr := range attributes { - am[attr.key] = attr.value - } + m = make(map[string]interface{}) + copyAttributes(m, attributes) } + s.annotations.add(Annotation{ + Time: now, + Message: msg, + Attributes: m, + }) + s.mu.Unlock() +} + +func (s *Span) printStringInternal(attributes []Attribute, str string) { + now := time.Now() + var a map[string]interface{} s.mu.Lock() + if len(attributes) != 0 { + a = make(map[string]interface{}) + copyAttributes(a, attributes) + } s.annotations.add(Annotation{ Time: now, Message: str, - Attributes: am, + Attributes: a, }) s.mu.Unlock() } // Annotate adds an annotation with attributes. // Attributes can be nil. -func (s *span) Annotate(attributes []Attribute, str string) { +func (s *Span) Annotate(attributes []Attribute, str string) { if !s.IsRecordingEvents() { return } @@ -447,11 +457,11 @@ func (s *span) Annotate(attributes []Attribute, str string) { } // Annotatef adds an annotation with attributes. -func (s *span) Annotatef(attributes []Attribute, format string, a ...interface{}) { +func (s *Span) Annotatef(attributes []Attribute, format string, a ...interface{}) { if !s.IsRecordingEvents() { return } - s.printStringInternal(attributes, fmt.Sprintf(format, a...)) + s.lazyPrintfInternal(attributes, format, a...) } // AddMessageSendEvent adds a message send event to the span. @@ -460,7 +470,7 @@ func (s *span) Annotatef(attributes []Attribute, format string, a ...interface{} // unique in this span and the same between the send event and the receive // event (this allows to identify a message between the sender and receiver). // For example, this could be a sequence id. -func (s *span) AddMessageSendEvent(messageID, uncompressedByteSize, compressedByteSize int64) { +func (s *Span) AddMessageSendEvent(messageID, uncompressedByteSize, compressedByteSize int64) { if !s.IsRecordingEvents() { return } @@ -482,7 +492,7 @@ func (s *span) AddMessageSendEvent(messageID, uncompressedByteSize, compressedBy // unique in this span and the same between the send event and the receive // event (this allows to identify a message between the sender and receiver). // For example, this could be a sequence id. -func (s *span) AddMessageReceiveEvent(messageID, uncompressedByteSize, compressedByteSize int64) { +func (s *Span) AddMessageReceiveEvent(messageID, uncompressedByteSize, compressedByteSize int64) { if !s.IsRecordingEvents() { return } @@ -499,7 +509,7 @@ func (s *span) AddMessageReceiveEvent(messageID, uncompressedByteSize, compresse } // AddLink adds a link to the span. -func (s *span) AddLink(l Link) { +func (s *Span) AddLink(l Link) { if !s.IsRecordingEvents() { return } @@ -508,7 +518,7 @@ func (s *span) AddLink(l Link) { s.mu.Unlock() } -func (s *span) String() string { +func (s *Span) String() string { if s == nil { return "<nil>" } @@ -524,9 +534,20 @@ func (s *span) String() string { var config atomic.Value // access atomically func init() { + gen := &defaultIDGenerator{} + // initialize traceID and spanID generators. + var rngSeed int64 + for _, p := range []interface{}{ + &rngSeed, &gen.traceIDAdd, &gen.nextSpanID, &gen.spanIDInc, + } { + binary.Read(crand.Reader, binary.LittleEndian, p) + } + gen.traceIDRand = rand.New(rand.NewSource(rngSeed)) + gen.spanIDInc |= 1 + config.Store(&Config{ DefaultSampler: ProbabilitySampler(defaultSamplingProbability), - IDGenerator: &defaultIDGenerator{}, + IDGenerator: gen, MaxAttributesPerSpan: DefaultMaxAttributesPerSpan, MaxAnnotationEventsPerSpan: DefaultMaxAnnotationEventsPerSpan, MaxMessageEventsPerSpan: DefaultMaxMessageEventsPerSpan, @@ -550,24 +571,6 @@ type defaultIDGenerator struct { traceIDAdd [2]uint64 traceIDRand *rand.Rand - - initOnce sync.Once -} - -// init initializes the generator on the first call to avoid consuming entropy -// unnecessarily. -func (gen *defaultIDGenerator) init() { - gen.initOnce.Do(func() { - // initialize traceID and spanID generators. - var rngSeed int64 - for _, p := range []interface{}{ - &rngSeed, &gen.traceIDAdd, &gen.nextSpanID, &gen.spanIDInc, - } { - binary.Read(crand.Reader, binary.LittleEndian, p) - } - gen.traceIDRand = rand.New(rand.NewSource(rngSeed)) - gen.spanIDInc |= 1 - }) } // NewSpanID returns a non-zero span ID from a randomly-chosen sequence. |