You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.5 KiB
112 lines
2.5 KiB
package metrics |
|
|
|
import "sync/atomic" |
|
|
|
// Counters hold an int64 value that can be incremented and decremented. |
|
type Counter interface { |
|
Clear() |
|
Count() int64 |
|
Dec(int64) |
|
Inc(int64) |
|
Snapshot() Counter |
|
} |
|
|
|
// GetOrRegisterCounter returns an existing Counter or constructs and registers |
|
// a new StandardCounter. |
|
func GetOrRegisterCounter(name string, r Registry) Counter { |
|
if nil == r { |
|
r = DefaultRegistry |
|
} |
|
return r.GetOrRegister(name, NewCounter).(Counter) |
|
} |
|
|
|
// NewCounter constructs a new StandardCounter. |
|
func NewCounter() Counter { |
|
if UseNilMetrics { |
|
return NilCounter{} |
|
} |
|
return &StandardCounter{0} |
|
} |
|
|
|
// NewRegisteredCounter constructs and registers a new StandardCounter. |
|
func NewRegisteredCounter(name string, r Registry) Counter { |
|
c := NewCounter() |
|
if nil == r { |
|
r = DefaultRegistry |
|
} |
|
r.Register(name, c) |
|
return c |
|
} |
|
|
|
// CounterSnapshot is a read-only copy of another Counter. |
|
type CounterSnapshot int64 |
|
|
|
// Clear panics. |
|
func (CounterSnapshot) Clear() { |
|
panic("Clear called on a CounterSnapshot") |
|
} |
|
|
|
// Count returns the count at the time the snapshot was taken. |
|
func (c CounterSnapshot) Count() int64 { return int64(c) } |
|
|
|
// Dec panics. |
|
func (CounterSnapshot) Dec(int64) { |
|
panic("Dec called on a CounterSnapshot") |
|
} |
|
|
|
// Inc panics. |
|
func (CounterSnapshot) Inc(int64) { |
|
panic("Inc called on a CounterSnapshot") |
|
} |
|
|
|
// Snapshot returns the snapshot. |
|
func (c CounterSnapshot) Snapshot() Counter { return c } |
|
|
|
// NilCounter is a no-op Counter. |
|
type NilCounter struct{} |
|
|
|
// Clear is a no-op. |
|
func (NilCounter) Clear() {} |
|
|
|
// Count is a no-op. |
|
func (NilCounter) Count() int64 { return 0 } |
|
|
|
// Dec is a no-op. |
|
func (NilCounter) Dec(i int64) {} |
|
|
|
// Inc is a no-op. |
|
func (NilCounter) Inc(i int64) {} |
|
|
|
// Snapshot is a no-op. |
|
func (NilCounter) Snapshot() Counter { return NilCounter{} } |
|
|
|
// StandardCounter is the standard implementation of a Counter and uses the |
|
// sync/atomic package to manage a single int64 value. |
|
type StandardCounter struct { |
|
count int64 |
|
} |
|
|
|
// Clear sets the counter to zero. |
|
func (c *StandardCounter) Clear() { |
|
atomic.StoreInt64(&c.count, 0) |
|
} |
|
|
|
// Count returns the current count. |
|
func (c *StandardCounter) Count() int64 { |
|
return atomic.LoadInt64(&c.count) |
|
} |
|
|
|
// Dec decrements the counter by the given amount. |
|
func (c *StandardCounter) Dec(i int64) { |
|
atomic.AddInt64(&c.count, -i) |
|
} |
|
|
|
// Inc increments the counter by the given amount. |
|
func (c *StandardCounter) Inc(i int64) { |
|
atomic.AddInt64(&c.count, i) |
|
} |
|
|
|
// Snapshot returns a read-only copy of the counter. |
|
func (c *StandardCounter) Snapshot() Counter { |
|
return CounterSnapshot(c.Count()) |
|
}
|
|
|