@@ -291,12 +291,28 @@ func (v *RawVal) Observe(val float64) {
291291
292292// Stats implements the StatSource interface.
293293func (v * RawVal ) Stats (cb func (key SeriesKey , field string , val float64 )) {
294+ type datum struct {
295+ field string
296+ value float64
297+ }
298+ var data []datum
299+ if len (v .stats ) < 8 {
300+ var buf [8 ]datum
301+ data = buf [:len (v .stats )]
302+ } else {
303+ data = make ([]datum , len (v .stats ))
304+ }
294305 v .mtx .Lock ()
295- cb (v .key , "recent" , v .value )
296- v .mtx .Unlock ()
297- for _ , s := range v .stats {
306+ for i , s := range v .stats {
298307 field , value := s ()
299- cb (v .key , field , value )
308+ data [i ] = datum {field , value }
309+ }
310+ recent := v .value
311+ v .mtx .Unlock ()
312+
313+ cb (v .key , "recent" , recent )
314+ for _ , d := range data {
315+ cb (v .key , d .field , d .value )
300316 }
301317}
302318
@@ -320,10 +336,10 @@ func Count() (observe func(val float64), stat func() (field string, val float64)
320336
321337// Sum is a value aggregator that summarizes the values measured.
322338func Sum () (observe func (val float64 ), stat func () (field string , val float64 )) {
323- var sum int
339+ var sum float64
324340 return func (val float64 ) {
325- sum += int ( val )
341+ sum += val
326342 }, func () (field string , val float64 ) {
327- return "sum" , float64 ( sum )
343+ return "sum" , sum
328344 }
329345}
0 commit comments