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) zero := debugMetrics.GCStats.NumGC.Value() // Get a "zero" since GC may have run before these tests. runtime.GC() CaptureDebugGCStatsOnce(r) if numGC := debugMetrics.GCStats.NumGC.Value(); 1 != numGC - zero { t.Errorf("NumGC got %d, expected 1", numGC) } RegisterDebugGCStats(r) if numGC := debugMetrics.GCStats.NumGC.Value(); 1 != numGC - zero { t.Errorf("NumGC got %d, expected 1", numGC - zero) } }