From 2186909d8651728cb71a4e02e0fe7b2c3d55e9b4 Mon Sep 17 00:00:00 2001 From: Nayef Ghattas Date: Tue, 5 Sep 2023 14:00:17 +0200 Subject: [PATCH] runtime/metrics: fix /gc/scan/* metrics MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. Fixes #62477. Change-Id: I67497347d50ed5c3ce1719a18714c062ec938cab Reviewed-on: https://go-review.googlesource.com/c/go/+/525595 Reviewed-by: Michael Knyszek Auto-Submit: Michael Knyszek LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Pratt Reviewed-by: Felix Geisendörfer --- 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.50.0