61 lines
1.6 KiB
Go
61 lines
1.6 KiB
Go
package zipkintracer
|
|
|
|
import "sync"
|
|
|
|
// A SpanRecorder handles all of the `RawSpan` data generated via an
|
|
// associated `Tracer` (see `NewStandardTracer`) instance. It also names
|
|
// the containing process and provides access to a straightforward tag map.
|
|
type SpanRecorder interface {
|
|
// Implementations must determine whether and where to store `span`.
|
|
RecordSpan(span RawSpan)
|
|
}
|
|
|
|
// InMemorySpanRecorder is a simple thread-safe implementation of
|
|
// SpanRecorder that stores all reported spans in memory, accessible
|
|
// via reporter.GetSpans(). It is primarily intended for testing purposes.
|
|
type InMemorySpanRecorder struct {
|
|
sync.RWMutex
|
|
spans []RawSpan
|
|
}
|
|
|
|
// NewInMemoryRecorder creates new InMemorySpanRecorder
|
|
func NewInMemoryRecorder() *InMemorySpanRecorder {
|
|
return new(InMemorySpanRecorder)
|
|
}
|
|
|
|
// RecordSpan implements the respective method of SpanRecorder.
|
|
func (r *InMemorySpanRecorder) RecordSpan(span RawSpan) {
|
|
r.Lock()
|
|
defer r.Unlock()
|
|
r.spans = append(r.spans, span)
|
|
}
|
|
|
|
// GetSpans returns a copy of the array of spans accumulated so far.
|
|
func (r *InMemorySpanRecorder) GetSpans() []RawSpan {
|
|
r.RLock()
|
|
defer r.RUnlock()
|
|
spans := make([]RawSpan, len(r.spans))
|
|
copy(spans, r.spans)
|
|
return spans
|
|
}
|
|
|
|
// GetSampledSpans returns a slice of spans accumulated so far which were sampled.
|
|
func (r *InMemorySpanRecorder) GetSampledSpans() []RawSpan {
|
|
r.RLock()
|
|
defer r.RUnlock()
|
|
spans := make([]RawSpan, 0, len(r.spans))
|
|
for _, span := range r.spans {
|
|
if span.Context.Sampled {
|
|
spans = append(spans, span)
|
|
}
|
|
}
|
|
return spans
|
|
}
|
|
|
|
// Reset clears the internal array of spans.
|
|
func (r *InMemorySpanRecorder) Reset() {
|
|
r.Lock()
|
|
defer r.Unlock()
|
|
r.spans = nil
|
|
}
|