126 lines
2.1 KiB
Go
126 lines
2.1 KiB
Go
package metrics
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
const FANOUT = 128
|
|
|
|
// Stop the compiler from complaining during debugging.
|
|
var (
|
|
_ = io.Discard
|
|
_ = log.LstdFlags
|
|
)
|
|
|
|
func BenchmarkMetrics(b *testing.B) {
|
|
r := NewRegistry()
|
|
c := NewRegisteredCounter("counter", r)
|
|
g := NewRegisteredGauge("gauge", r)
|
|
gf := NewRegisteredGaugeFloat64("gaugefloat64", r)
|
|
h := NewRegisteredHistogram("histogram", r, NewUniformSample(100))
|
|
m := NewRegisteredMeter("meter", r)
|
|
t := NewRegisteredTimer("timer", r)
|
|
RegisterDebugGCStats(r)
|
|
RegisterRuntimeMemStats(r)
|
|
b.ResetTimer()
|
|
ch := make(chan bool)
|
|
|
|
wgD := &sync.WaitGroup{}
|
|
/*
|
|
wgD.Add(1)
|
|
go func() {
|
|
defer wgD.Done()
|
|
//log.Println("go CaptureDebugGCStats")
|
|
for {
|
|
select {
|
|
case <-ch:
|
|
//log.Println("done CaptureDebugGCStats")
|
|
return
|
|
default:
|
|
CaptureDebugGCStatsOnce(r)
|
|
}
|
|
}
|
|
}()
|
|
//*/
|
|
|
|
wgR := &sync.WaitGroup{}
|
|
//*
|
|
wgR.Add(1)
|
|
go func() {
|
|
defer wgR.Done()
|
|
//log.Println("go CaptureRuntimeMemStats")
|
|
for {
|
|
select {
|
|
case <-ch:
|
|
//log.Println("done CaptureRuntimeMemStats")
|
|
return
|
|
default:
|
|
CaptureRuntimeMemStatsOnce(r)
|
|
}
|
|
}
|
|
}()
|
|
//*/
|
|
|
|
wgW := &sync.WaitGroup{}
|
|
/*
|
|
wgW.Add(1)
|
|
go func() {
|
|
defer wgW.Done()
|
|
//log.Println("go Write")
|
|
for {
|
|
select {
|
|
case <-ch:
|
|
//log.Println("done Write")
|
|
return
|
|
default:
|
|
WriteOnce(r, io.Discard)
|
|
}
|
|
}
|
|
}()
|
|
//*/
|
|
|
|
wg := &sync.WaitGroup{}
|
|
wg.Add(FANOUT)
|
|
for i := 0; i < FANOUT; i++ {
|
|
go func(i int) {
|
|
defer wg.Done()
|
|
//log.Println("go", i)
|
|
for i := 0; i < b.N; i++ {
|
|
c.Inc(1)
|
|
g.Update(int64(i))
|
|
gf.Update(float64(i))
|
|
h.Update(int64(i))
|
|
m.Mark(1)
|
|
t.Update(1)
|
|
}
|
|
//log.Println("done", i)
|
|
}(i)
|
|
}
|
|
wg.Wait()
|
|
close(ch)
|
|
wgD.Wait()
|
|
wgR.Wait()
|
|
wgW.Wait()
|
|
}
|
|
|
|
func Example() {
|
|
c := NewCounter()
|
|
Register("money", c)
|
|
c.Inc(17)
|
|
|
|
// Threadsafe registration
|
|
t := GetOrRegisterTimer("db.get.latency", nil)
|
|
t.Time(func() { time.Sleep(10 * time.Millisecond) })
|
|
t.Update(1)
|
|
|
|
fmt.Println(c.Count())
|
|
fmt.Println(t.Min())
|
|
// Output: 17
|
|
// 1
|
|
}
|