From cd66ca0636a55d301530c0d766a47f07c5423d0d Mon Sep 17 00:00:00 2001 From: Nayef Ghattas Date: Tue, 5 Sep 2023 14:00:17 +0200 Subject: [PATCH] [release-branch.go1.21] runtime/metrics: fix /gc/scan/* metrics In the existing implementation, all /gc/scan/* metrics are always equal to 0 due to the dependency on gcStatDep not being set. This leads to gcStatAggregate always containing zeros, and always reporting 0 for those metrics. Also, add a test to ensure that /gc/scan/* metrics are not empty. For #62477. Fixes #62478. Change-Id: I67497347d50ed5c3ce1719a18714c062ec938cab Reviewed-on: https://go-review.googlesource.com/c/go/+/526116 Reviewed-by: Michael Pratt Auto-Submit: Heschi Kreinick LUCI-TryBot-Result: Go LUCI --- src/runtime/metrics.go | 6 +++++- src/runtime/metrics_test.go | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/runtime/metrics.go b/src/runtime/metrics.go index 8ef1b022cf..3d0f174133 100644 --- a/src/runtime/metrics.go +++ b/src/runtime/metrics.go @@ -190,24 +190,28 @@ func initMetrics() { }, }, "/gc/scan/globals:bytes": { + deps: makeStatDepSet(gcStatsDep), compute: func(in *statAggregate, out *metricValue) { out.kind = metricKindUint64 out.scalar = in.gcStats.globalsScan }, }, "/gc/scan/heap:bytes": { + deps: makeStatDepSet(gcStatsDep), compute: func(in *statAggregate, out *metricValue) { out.kind = metricKindUint64 out.scalar = in.gcStats.heapScan }, }, "/gc/scan/stack:bytes": { + deps: makeStatDepSet(gcStatsDep), compute: func(in *statAggregate, out *metricValue) { out.kind = metricKindUint64 out.scalar = in.gcStats.stackScan }, }, "/gc/scan/total:bytes": { + deps: makeStatDepSet(gcStatsDep), compute: func(in *statAggregate, out *metricValue) { out.kind = metricKindUint64 out.scalar = in.gcStats.totalScan @@ -667,7 +671,7 @@ func (a *cpuStatsAggregate) compute() { // a.cpuStats.accumulate(nanotime(), gcphase == _GCmark) } -// cpuStatsAggregate represents various GC stats obtained from the runtime +// gcStatsAggregate represents various GC stats obtained from the runtime // acquired together to avoid skew and inconsistencies. type gcStatsAggregate struct { heapScan uint64 diff --git a/src/runtime/metrics_test.go b/src/runtime/metrics_test.go index a64e898739..cfb09a3929 100644 --- a/src/runtime/metrics_test.go +++ b/src/runtime/metrics_test.go @@ -405,6 +405,9 @@ func TestReadMetricsConsistency(t *testing.T) { if gc.pauses < gc.numGC*2 { t.Errorf("fewer pauses than expected: got %d, want at least %d", gc.pauses, gc.numGC*2) } + if totalScan.got <= 0 { + t.Errorf("scannable GC space is empty: %d", totalScan.got) + } if totalScan.got != totalScan.want { t.Errorf("/gc/scan/total:bytes doesn't line up with sum of /gc/scan*: total %d vs. sum %d", totalScan.got, totalScan.want) } -- 2.48.1