36 lines
832 B
Go
36 lines
832 B
Go
package metrics
|
|
|
|
import "time"
|
|
|
|
// Timer acts as a stopwatch, sending observations to a wrapped histogram.
|
|
// It's a bit of helpful syntax sugar for h.Observe(time.Since(x)).
|
|
type Timer struct {
|
|
h Histogram
|
|
t time.Time
|
|
u time.Duration
|
|
}
|
|
|
|
// NewTimer wraps the given histogram and records the current time.
|
|
func NewTimer(h Histogram) *Timer {
|
|
return &Timer{
|
|
h: h,
|
|
t: time.Now(),
|
|
u: time.Second,
|
|
}
|
|
}
|
|
|
|
// ObserveDuration captures the number of seconds since the timer was
|
|
// constructed, and forwards that observation to the histogram.
|
|
func (t *Timer) ObserveDuration() {
|
|
d := float64(time.Since(t.t).Nanoseconds()) / float64(t.u)
|
|
if d < 0 {
|
|
d = 0
|
|
}
|
|
t.h.Observe(d)
|
|
}
|
|
|
|
// Unit sets the unit of the float64 emitted by the timer.
|
|
// By default, the timer emits seconds.
|
|
func (t *Timer) Unit(u time.Duration) {
|
|
t.u = u
|
|
}
|