runtime/metrics: add /gc/heap/live:bytes

For #56857

Change-Id: I0622af974783ab435e91b9fb3c1ba43f256ee4ac
Reviewed-on: https://go-review.googlesource.com/c/go/+/497315
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Michael Knyszek <mknyszek@google.com>
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Felix Geisendörfer <felix.geisendoerfer@datadoghq.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
Felix Geisendörfer 2022-11-21 21:41:54 +00:00 committed by Gopher Robot
parent 8366497625
commit ef2bb813c8
4 changed files with 26 additions and 0 deletions

View file

@ -248,6 +248,13 @@ func initMetrics() {
out.scalar = in.sysStats.heapGoal out.scalar = in.sysStats.heapGoal
}, },
}, },
"/gc/heap/live:bytes": {
deps: makeStatDepSet(heapStatsDep),
compute: func(in *statAggregate, out *metricValue) {
out.kind = metricKindUint64
out.scalar = gcController.heapMarked
},
},
"/gc/heap/objects:objects": { "/gc/heap/objects:objects": {
deps: makeStatDepSet(heapStatsDep), deps: makeStatDepSet(heapStatsDep),
compute: func(in *statAggregate, out *metricValue) { compute: func(in *statAggregate, out *metricValue) {

View file

@ -245,6 +245,11 @@ var allDesc = []Description{
Description: "Heap size target for the end of the GC cycle.", Description: "Heap size target for the end of the GC cycle.",
Kind: KindUint64, Kind: KindUint64,
}, },
{
Name: "/gc/heap/live:bytes",
Description: "Heap memory occupied by live objects that were marked by the previous GC.",
Kind: KindUint64,
},
{ {
Name: "/gc/heap/objects:objects", Name: "/gc/heap/objects:objects",
Description: "Number of objects, live or unswept, occupying heap memory.", Description: "Number of objects, live or unswept, occupying heap memory.",

View file

@ -180,6 +180,10 @@ Below is the full list of supported metrics, ordered lexicographically.
/gc/heap/goal:bytes /gc/heap/goal:bytes
Heap size target for the end of the GC cycle. Heap size target for the end of the GC cycle.
/gc/heap/live:bytes
Heap memory occupied by live objects that were marked by the
previous GC.
/gc/heap/objects:objects /gc/heap/objects:objects
Number of objects, live or unswept, occupying heap memory. Number of objects, live or unswept, occupying heap memory.

View file

@ -28,6 +28,9 @@ func prepareAllMetricsSamples() (map[string]metrics.Description, []metrics.Sampl
} }
func TestReadMetrics(t *testing.T) { func TestReadMetrics(t *testing.T) {
// Run a GC cycle to get some of the stats to be non-zero.
runtime.GC()
// Tests whether readMetrics produces values aligning // Tests whether readMetrics produces values aligning
// with ReadMemStats while the world is stopped. // with ReadMemStats while the world is stopped.
var mstats runtime.MemStats var mstats runtime.MemStats
@ -128,6 +131,13 @@ func TestReadMetrics(t *testing.T) {
mallocs = samples[i].Value.Uint64() mallocs = samples[i].Value.Uint64()
case "/gc/heap/frees:objects": case "/gc/heap/frees:objects":
frees = samples[i].Value.Uint64() frees = samples[i].Value.Uint64()
case "/gc/heap/live:bytes":
if live := samples[i].Value.Uint64(); live > mstats.HeapAlloc {
t.Errorf("live bytes: %d > heap alloc: %d", live, mstats.HeapAlloc)
} else if live == 0 {
// Might happen if we don't call runtime.GC() above.
t.Error("live bytes is 0")
}
case "/gc/heap/objects:objects": case "/gc/heap/objects:objects":
checkUint64(t, name, samples[i].Value.Uint64(), mstats.HeapObjects) checkUint64(t, name, samples[i].Value.Uint64(), mstats.HeapObjects)
case "/gc/heap/goal:bytes": case "/gc/heap/goal:bytes":