runtime,runtime/metrics: add heap object count metric

For #37112.

Change-Id: Idd3dd5c84215ddd1ab05c2e76e848aa0a4d40fb0
Reviewed-on: https://go-review.googlesource.com/c/go/+/247043
Run-TryBot: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
This commit is contained in:
Michael Anthony Knyszek 2020-08-06 15:44:27 +00:00 committed by Michael Knyszek
parent 74e566ed1d
commit 07c3f65d53
4 changed files with 26 additions and 2 deletions

View file

@ -38,6 +38,13 @@ func initMetrics() {
return return
} }
metrics = map[string]metricData{ metrics = map[string]metricData{
"/gc/heap/objects:objects": {
deps: makeStatDepSet(heapStatsDep),
compute: func(in *statAggregate, out *metricValue) {
out.kind = metricKindUint64
out.scalar = in.heapStats.numObjects
},
},
"/memory/classes/heap/free:bytes": { "/memory/classes/heap/free:bytes": {
deps: makeStatDepSet(heapStatsDep), deps: makeStatDepSet(heapStatsDep),
compute: func(in *statAggregate, out *metricValue) { compute: func(in *statAggregate, out *metricValue) {
@ -210,9 +217,13 @@ func (s *statDepSet) has(d statDep) bool {
type heapStatsAggregate struct { type heapStatsAggregate struct {
heapStatsDelta heapStatsDelta
// Derived from values in heapStatsDelta.
// inObjects is the bytes of memory occupied by objects, // inObjects is the bytes of memory occupied by objects,
// derived from other values in heapStats.
inObjects uint64 inObjects uint64
// numObjects is the number of live objects in the heap.
numObjects uint64
} }
// compute populates the heapStatsAggregate with values from the runtime. // compute populates the heapStatsAggregate with values from the runtime.
@ -221,8 +232,11 @@ func (a *heapStatsAggregate) compute() {
// Calculate derived stats. // Calculate derived stats.
a.inObjects = uint64(a.largeAlloc - a.largeFree) a.inObjects = uint64(a.largeAlloc - a.largeFree)
a.numObjects = uint64(a.largeAllocCount - a.largeFreeCount)
for i := range a.smallAllocCount { for i := range a.smallAllocCount {
a.inObjects += uint64(a.smallAllocCount[i]-a.smallFreeCount[i]) * uint64(class_to_size[i]) n := uint64(a.smallAllocCount[i] - a.smallFreeCount[i])
a.inObjects += n * uint64(class_to_size[i])
a.numObjects += n
} }
} }

View file

@ -50,6 +50,11 @@ type Description struct {
// The English language descriptions below must be kept in sync with the // The English language descriptions below must be kept in sync with the
// descriptions of each metric in doc.go. // descriptions of each metric in doc.go.
var allDesc = []Description{ var allDesc = []Description{
{
Name: "/gc/heap/objects:objects",
Description: "Number of objects, live or unswept, occupying heap memory.",
Kind: KindUint64,
},
{ {
Name: "/memory/classes/heap/free:bytes", Name: "/memory/classes/heap/free:bytes",
Description: "Memory that is available for allocation, and may be returned to the underlying system.", Description: "Memory that is available for allocation, and may be returned to the underlying system.",

View file

@ -44,6 +44,9 @@ the documentation of the Name field of the Description struct.
Supported metrics Supported metrics
/gc/heap/objects:objects
Number of objects, live or unswept, occupying heap memory.
/memory/classes/heap/free:bytes /memory/classes/heap/free:bytes
Memory that is available for allocation, and may be returned Memory that is available for allocation, and may be returned
to the underlying system. to the underlying system.

View file

@ -70,6 +70,8 @@ func TestReadMetrics(t *testing.T) {
checkUint64(t, name, samples[i].Value.Uint64(), mstats.BuckHashSys) checkUint64(t, name, samples[i].Value.Uint64(), mstats.BuckHashSys)
case "/memory/classes/total:bytes": case "/memory/classes/total:bytes":
checkUint64(t, name, samples[i].Value.Uint64(), mstats.Sys) checkUint64(t, name, samples[i].Value.Uint64(), mstats.Sys)
case "/gc/heap/objects:objects":
checkUint64(t, name, samples[i].Value.Uint64(), mstats.HeapObjects)
} }
} }
} }