Source File
worker.go
Belonging Package
go.opencensus.io/stats/view
package view
import (
)
func () {
defaultWorker = NewMeter().(*worker)
go defaultWorker.start()
internal.DefaultRecorder = record
}
type measureRef struct {
measure string
views map[*viewInternal]struct{}
}
type worker struct {
measures map[string]*measureRef
views map[string]*viewInternal
startTimes map[*viewInternal]time.Time
timer *time.Ticker
c chan command
quit, done chan bool
mu sync.RWMutex
r *resource.Resource
exportersMu sync.RWMutex
exporters map[Exporter]struct{}
}
type Meter interface {
Stop()
func ( string) ( *View) {
return defaultWorker.Find()
}
func ( ...*View) error {
return defaultWorker.Register(...)
}
func ( ...*View) {
defaultWorker.Unregister(...)
}
func ( string) ([]*Row, error) {
return defaultWorker.RetrieveData()
}
func ( time.Duration) {
defaultWorker.SetReportingPeriod()
}
func () Meter {
return &worker{
measures: make(map[string]*measureRef),
views: make(map[string]*viewInternal),
startTimes: make(map[*viewInternal]time.Time),
timer: time.NewTicker(defaultReportingDuration),
c: make(chan command, 1024),
quit: make(chan bool),
done: make(chan bool),
exporters: make(map[Exporter]struct{}),
}
}
func ( *worker) ( *resource.Resource) {
.r =
}
func ( *worker) () {
go .start()
}
func ( *worker) () {
:= metricproducer.GlobalManager()
.AddProducer()
for {
select {
case := <-.c:
.handleCommand()
case <-.timer.C:
.reportUsage()
case <-.quit:
.timer.Stop()
close(.c)
.done <- true
return
}
}
}
func ( *worker) () {
:= metricproducer.GlobalManager()
.DeleteProducer()
.quit <- true
<-.done
}
func ( *worker) ( string) *measureRef {
if , := .measures[]; {
return
}
:= &measureRef{
measure: ,
views: make(map[*viewInternal]struct{}),
}
.measures[] =
return
}
func ( *worker) ( *View) (*viewInternal, error) {
.mu.Lock()
defer .mu.Unlock()
, := newViewInternal()
if != nil {
return nil,
}
if , := .views[.view.Name]; {
if !.view.same(.view) {
return nil, fmt.Errorf("cannot register view %q; a different view with the same name is already registered", .Name)
}
return , nil
}
.views[.view.Name] =
.startTimes[] = time.Now()
:= .getMeasureRef(.view.Measure.Name())
.views[] = struct{}{}
return , nil
}
func ( *worker) ( *viewInternal) {
.mu.Lock()
defer .mu.Unlock()
delete(.views, .view.Name)
delete(.startTimes, )
if := .measures[.view.Measure.Name()]; != nil {
delete(.views, )
}
}
func ( *worker) ( *viewInternal) {
if !.isSubscribed() {
return
}
:= .collectedRows()
:= &Data{
View: .view,
Start: .startTimes[],
End: time.Now(),
Rows: ,
}
.exportersMu.Lock()
defer .exportersMu.Unlock()
for := range .exporters {
.ExportView()
}
}
func ( *worker) () {
.mu.Lock()
defer .mu.Unlock()
for , := range .views {
.reportView()
}
}
func ( *worker) ( *viewInternal, time.Time) *metricdata.Metric {
if !.isSubscribed() {
return nil
}
var time.Time
if .metricDescriptor.Type == metricdata.TypeGaugeInt64 ||
.metricDescriptor.Type == metricdata.TypeGaugeFloat64 {
= time.Time{}
} else {
= .startTimes[]
}
return viewToMetric(, .r, , )
}
func ( *worker) () []*metricdata.Metric {
.mu.Lock()
defer .mu.Unlock()
:= time.Now()
:= make([]*metricdata.Metric, 0, len(.views))
for , := range .views {
:= .toMetric(, )
if != nil {
= append(, )
}
}
return
}
func ( *worker) ( Exporter) {
.exportersMu.Lock()
defer .exportersMu.Unlock()
.exporters[] = struct{}{}
}
func ( *worker) ( Exporter) {
.exportersMu.Lock()
defer .exportersMu.Unlock()
delete(.exporters, )
![]() |
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. |