package metrics import ( "strconv" "sync/atomic" ) // The Counter type represents a numeric counter that is safe to use from concurrent goroutines. type Counter struct { val int64 desc *desc } // Name identifies the name of the counter. func (c *Counter) Name() string { return c.desc.Name } // Value atomically returns the current value of the counter. func (c *Counter) Value() int64 { return atomic.LoadInt64(&c.val) } // Add atomically adds d to the counter. func (c *Counter) Add(d int64) { atomic.AddInt64(&c.val, d) } // String returns a string representation using the name and value of the counter. func (c *Counter) String() string { var buf [16]byte v := strconv.AppendInt(buf[:0], c.val, 10) return c.desc.Name + ": " + string(v) }