Source File
spanstore.go
Belonging Package
go.opencensus.io/trace
package trace
import (
)
const (
maxBucketSize = 100000
defaultBucketSize = 10
)
var (
ssmu sync.RWMutex // protects spanStores
spanStores = make(map[string]*spanStore)
)
type internalOnly struct{}
internal.Trace = &internalOnly{}
}
func ( internalOnly) ( string) []*SpanData {
:= spanStoreForName()
if == nil {
return nil
}
var []*SpanData
.mu.Lock()
defer .mu.Unlock()
for := range .active {
= append(, .makeSpanData())
}
return
}
func ( internalOnly) ( string, int32) []*SpanData {
:= spanStoreForName()
if == nil {
return nil
}
var []*SpanData
.mu.Lock()
defer .mu.Unlock()
if != 0 {
if , := .errors[]; {
for , := range .buffer {
if == nil {
break
}
= append(, )
}
}
} else {
for , := range .errors {
for , := range .buffer {
if == nil {
break
}
= append(, )
}
}
}
return
}
func ( internalOnly) ( []internal.BucketConfiguration) {
for , := range {
:= .MaxRequestsSucceeded
if < 0 {
= 0
}
if > maxBucketSize {
= maxBucketSize
}
:= .MaxRequestsErrors
if < 0 {
= 0
}
if > maxBucketSize {
= maxBucketSize
}
spanStoreSetSize(.Name, , )
}
}
func ( internalOnly) () map[string]internal.PerMethodSummary {
:= make(map[string]internal.PerMethodSummary)
ssmu.RLock()
defer ssmu.RUnlock()
for , := range spanStores {
.mu.Lock()
:= internal.PerMethodSummary{
Active: len(.active),
}
for , := range .errors {
.ErrorBuckets = append(.ErrorBuckets, internal.ErrorBucketSummary{
ErrorCode: ,
Size: .size(),
})
}
for , := range .latency {
, := latencyBucketBounds()
.LatencyBuckets = append(.LatencyBuckets, internal.LatencyBucketSummary{
MinLatency: ,
MaxLatency: ,
Size: .size(),
})
}
.mu.Unlock()
[] =
}
return
}
func ( internalOnly) ( string, , time.Duration) []*SpanData {
:= spanStoreForName()
if == nil {
return nil
}
var []*SpanData
.mu.Lock()
defer .mu.Unlock()
for , := range .latency {
, := latencyBucketBounds()
if +1 != len(.latency) && <= {
continue
}
if != 0 && < {
continue
}
for , := range .buffer {
if == nil {
break
}
if != 0 || != 0 {
:= .EndTime.Sub(.StartTime)
if < {
continue
}
if != 0 && > {
continue
}
}
= append(, )
}
}
return
}
func ( string) *spanStore {
ssmu.RLock()
, := spanStores[]
ssmu.RUnlock()
if {
return
}
ssmu.Lock()
defer ssmu.Unlock()
, = spanStores[]
if {
return
}
= newSpanStore(, defaultBucketSize, defaultBucketSize)
spanStores[] =
return
}
func ( string, int, int) {
ssmu.RLock()
, := spanStores[]
ssmu.RUnlock()
if {
.resize(, )
return
}
ssmu.Lock()
defer ssmu.Unlock()
, = spanStores[]
if {
.resize(, )
return
}
= newSpanStore(, , )
spanStores[] =
}
func ( *spanStore) ( int, int) {
.mu.Lock()
for := range .latency {
.latency[].resize()
}
for , := range .errors {
.resize()
}
.maxSpansPerErrorBucket =
.mu.Unlock()
}
func ( *spanStore) ( *Span, *SpanData) {
:= .EndTime.Sub(.StartTime)
if < 0 {
= 0
}
:= .Status.Code
.mu.Lock()
delete(.active, )
if == 0 {
.latency[latencyBucket()].add()
} else {
if .errors == nil {
.errors = make(map[int32]*bucket)
}
if := .errors[]; != nil {
.add()
} else {
:= makeBucket(.maxSpansPerErrorBucket)
.errors[] = &
.add()
}
}
.mu.Unlock()
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |