diff --git a/prometheus/go_collector.go b/prometheus/go_collector.go index 931868b..dbf4c30 100644 --- a/prometheus/go_collector.go +++ b/prometheus/go_collector.go @@ -3,6 +3,7 @@ package prometheus import ( "runtime" "runtime/debug" + "time" ) type goCollector struct { @@ -37,7 +38,13 @@ func (c *goCollector) Collect(ch chan<- Metric) { ch <- c.goroutines var stats debug.GCStats + stats.PauseQuantiles = make([]time.Duration, 5) debug.ReadGCStats(&stats) - ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), float64(stats.PauseTotal.Seconds()), nil) + quantiles := make(map[float64]float64) + for idx, pq := range stats.PauseQuantiles[1:] { + quantiles[float64(idx+1)/float64(len(stats.PauseQuantiles)-1)] = pq.Seconds() + } + quantiles[0.0] = stats.PauseQuantiles[0].Seconds() + ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), float64(stats.PauseTotal.Seconds()), quantiles) } diff --git a/prometheus/go_collector_test.go b/prometheus/go_collector_test.go index 16f389b..b75d28e 100644 --- a/prometheus/go_collector_test.go +++ b/prometheus/go_collector_test.go @@ -1,7 +1,7 @@ package prometheus import ( - "runtime/debug" + "runtime" "testing" "time" @@ -72,7 +72,7 @@ func TestGCCollector(t *testing.T) { go func() { c.Collect(ch) // force GC - debug.FreeOSMemory() + runtime.GC() <-waitc c.Collect(ch) }() @@ -89,6 +89,14 @@ func TestGCCollector(t *testing.T) { continue } + if len(pb.GetSummary().Quantile) != 5 { + t.Errorf("expected 4 buckets, got %d", len(pb.GetSummary().Quantile)) + } + for idx, want := range []float64{0.0, 0.25, 0.5, 0.75, 1.0} { + if *pb.GetSummary().Quantile[idx].Quantile != want { + t.Errorf("bucket #%d is off, got %f, want %f", idx, *pb.GetSummary().Quantile[idx].Quantile, want) + } + } if first { first = false oldGC = *pb.GetSummary().SampleCount