| 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) |