// Copyright 2019 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package stats provides support for recording telemetry statistics. // It acts as a coordination point between things that want to record stats, // and things that want to aggregate and report stats. package stats import ( "context" "sync" "time" "golang.org/x/tools/internal/telemetry/unit" ) // Int64Measure is used to record integer values. type Int64Measure struct { name string description string unit unit.Unit mu sync.Mutex subscribers []Int64Subscriber } // Float64Measure is used to record floating point values. type Float64Measure struct { name string description string unit unit.Unit mu sync.Mutex subscribers []Float64Subscriber } // Int64Subscriber is the type for functions that want to listen to // integer statistic events. type Int64Subscriber func(ctx context.Context, im *Int64Measure, value int64, at time.Time) // Float64Subscriber is the type for functions that want to listen to // floating point statistic events. type Float64Subscriber func(ctx context.Context, fm *Float64Measure, value float64, at time.Time) // Int64 creates a new Int64Measure and prepares it for use. func Int64(name string, description string, unit unit.Unit) *Int64Measure { return &Int64Measure{ name: name, description: description, unit: unit, } } // Float64 creates a new Float64Measure and prepares it for use. func Float64(name string, description string, unit unit.Unit) *Float64Measure { return &Float64Measure{ name: name, description: description, unit: unit, } } // Name returns the name this measure was given on construction. func (m *Int64Measure) Name() string { return m.name } // Description returns the description this measure was given on construction. func (m *Int64Measure) Description() string { return m.description } // Unit returns the units this measure was given on construction. func (m *Int64Measure) Unit() unit.Unit { return m.unit } // Subscribe adds a new subscriber to this measure. func (m *Int64Measure) Subscribe(s Int64Subscriber) { m.mu.Lock() m.subscribers = append(m.subscribers, s) m.mu.Unlock() } // Record delivers a new value to the subscribers of this measure. func (m *Int64Measure) Record(ctx context.Context, value int64) { at := time.Now() m.mu.Lock() defer m.mu.Unlock() for _, s := range m.subscribers { s(ctx, m, value, at) } } // Name returns the name this measure was given on construction. func (m *Float64Measure) Name() string { return m.name } // Description returns the description this measure was given on construction. func (m *Float64Measure) Description() string { return m.description } // Unit returns the units this measure was given on construction. func (m *Float64Measure) Unit() unit.Unit { return m.unit } // Subscribe adds a new subscriber to this measure. func (m *Float64Measure) Subscribe(s Float64Subscriber) { m.mu.Lock() m.subscribers = append(m.subscribers, s) m.mu.Unlock() } // Record delivers a new value to the subscribers of this measure. func (m *Float64Measure) Record(ctx context.Context, value float64) { at := time.Now() m.mu.Lock() defer m.mu.Unlock() for _, s := range m.subscribers { s(ctx, m, value, at) } }