package metrics import ( "fmt" "strings" "time" ) type HistTimer struct { Histogram start time.Time name string } func NewHistTimer(name string) *HistTimer { rawName := strings.Split(name, "{") return &HistTimer{ Histogram: GetOrCreateHistogram(name), start: time.Now(), name: rawName[0], } } func (h *HistTimer) PutSince() { h.Histogram.ObserveDuration(h.start) } func (h *HistTimer) Tag(pairs ...string) *HistTimer { if len(pairs)%2 != 0 { pairs = append(pairs, "UNEQUAL_KEY_VALUE_TAGS") } var toJoin []string for i := 0; i < len(pairs); i = i + 2 { toJoin = append(toJoin, fmt.Sprintf(`%s="%s"`, pairs[i], pairs[i+1])) } tags := "" if len(toJoin) > 0 { tags = "{" + strings.Join(toJoin, ",") + "}" } return &HistTimer{ Histogram: GetOrCreateHistogram(h.name + tags), start: time.Now(), name: h.name, } } func (h *HistTimer) Child(suffix string) *HistTimer { suffix = strings.TrimPrefix(suffix, "_") return NewHistTimer(h.name + "_" + suffix) }