blob: f1348ab7935b4e3df7298f08484145fadeb229fd [file] [log] [blame]
package metrics2
import (
"fmt"
"runtime"
"strings"
"time"
"go.skia.org/infra/go/util"
)
const (
MEASUREMENT_TIMER = "timer"
NAME_FUNC_TIMER = "func_timer"
)
// timer implements Timer.
type timer struct {
begin time.Time
m Float64SummaryMetric
}
// NewTimer creates and returns a new started timer.
//
// makeUnique - True if the measurement name needs to made unique, which means
// to append 'name' to 'timer'.
func newTimer(c Client, name string, makeUnique bool, tagsList ...map[string]string) Timer {
// Make a copy of the tags and add the name.
tags := util.AddParams(map[string]string{}, tagsList...)
tags["name"] = name
measurement := MEASUREMENT_TIMER
if makeUnique {
measurement = fmt.Sprintf("%s_%s_ns", MEASUREMENT_TIMER, name)
tags["type"] = MEASUREMENT_TIMER
}
ret := &timer{
m: c.GetFloat64SummaryMetric(measurement, tags),
}
ret.Start()
return ret
}
// Start starts or resets the timer.
func (t *timer) Start() {
t.begin = time.Now()
}
// Stop stops the timer and reports the elapsed time.
func (t *timer) Stop() time.Duration {
dur := time.Now().Sub(t.begin)
v := float64(dur)
t.m.Observe(v)
return dur
}
// NewTimer creates and returns a new Timer using the default client.
func NewTimer(name string, tags ...map[string]string) Timer {
return defaultClient.NewTimer(name, tags...)
}
// FuncTimer is specifically intended for measuring the duration of functions.
// It uses the default client.
//
// The standard way to use FuncTimer is at the top of the func you
// want to measure:
//
// func myfunc() {
// defer metrics2.FuncTimer().Stop()
// ...
// }
//
func FuncTimer() Timer {
pc, _, _, _ := runtime.Caller(1)
f := runtime.FuncForPC(pc)
split := strings.Split(f.Name(), ".")
fn := "unknown"
pkg := "unknown"
if len(split) >= 2 {
fn = split[len(split)-1]
pkg = strings.Join(split[:len(split)-1], ".")
}
return NewTimer(NAME_FUNC_TIMER, map[string]string{"package": pkg, "func": fn})
}
// Verify that timer implements the Timer interface.
var _ Timer = (*timer)(nil)