package metrics import ( "runtime" "runtime/debug" "testing" "time" ) func BenchmarkDebugGCStats(b *testing.B) { r := NewRegistry() RegisterDebugGCStats(r) b.ResetTimer() for i := 0; i < b.N; i++ { CaptureDebugGCStatsOnce(r) } } func TestDebugGCStatsBlocking(t *testing.T) { if g := runtime.GOMAXPROCS(0); g < 2 { t.Skipf("skipping TestDebugGCMemStatsBlocking with GOMAXPROCS=%d\n", g) return } ch := make(chan int) go testDebugGCStatsBlocking(ch) var gcStats debug.GCStats t0 := time.Now() debug.ReadGCStats(&gcStats) t1 := time.Now() t.Log("i++ during debug.ReadGCStats:", <-ch) go testDebugGCStatsBlocking(ch) d := t1.Sub(t0) t.Log(d) time.Sleep(d) t.Log("i++ during time.Sleep:", <-ch) } func testDebugGCStatsBlocking(ch chan int) { i := 0 for { select { case ch <- i: return default: i++ } } } func TestDebugGCStatsDoubleRegister(t *testing.T) { r := NewRegistry() RegisterDebugGCStats(r) var storedGauge = (r.Get("debug.GCStats.LastGC")).(Gauge) runtime.GC() CaptureDebugGCStatsOnce(r) firstGC := storedGauge.Value() if 0 == firstGC { t.Errorf("firstGC got %d, expected > 0", firstGC) } time.Sleep(time.Millisecond) RegisterDebugGCStats(r) runtime.GC() CaptureDebugGCStatsOnce(r) if lastGC := storedGauge.Value(); firstGC == lastGC { t.Errorf("lastGC got %d, expected a higher timestamp value", lastGC) } }