mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime/metrics: add CPU stats
This changes adds a breakdown for estimated CPU usage by time. These estimates are not based on real on-CPU counters, so each metric has a disclaimer explaining so. They can, however, be more reasonably compared to a total CPU time metric that this change also adds. Fixes #47216. Change-Id: I125006526be9f8e0d609200e193da5a78d9935be Reviewed-on: https://go-review.googlesource.com/c/go/+/404307 Reviewed-by: Michael Pratt <mpratt@google.com> Reviewed-by: Josh MacDonald <jmacd@lightstep.com> Auto-Submit: Michael Knyszek <mknyszek@google.com> Reviewed-by: David Chase <drchase@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
87eda2a782
commit
b7c28f484d
11 changed files with 459 additions and 21 deletions
|
|
@ -90,6 +90,83 @@ func initMetrics() {
|
|||
out.scalar = uint64(NumCgoCall())
|
||||
},
|
||||
},
|
||||
"/cpu/classes/gc/mark/assist:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.gcAssistTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/gc/mark/dedicated:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.gcDedicatedTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/gc/mark/idle:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.gcIdleTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/gc/pause:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.gcPauseTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/gc/total:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.gcTotalTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/idle:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.idleTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/scavenge/assist:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.scavengeAssistTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/scavenge/background:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.scavengeBgTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/scavenge/total:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.scavengeTotalTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/total:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.totalTime))
|
||||
},
|
||||
},
|
||||
"/cpu/classes/user:cpu-seconds": {
|
||||
deps: makeStatDepSet(cpuStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
out.kind = metricKindFloat64
|
||||
out.scalar = float64bits(nsToSec(in.cpuStats.userTime))
|
||||
},
|
||||
},
|
||||
"/gc/cycles/automatic:gc-cycles": {
|
||||
deps: makeStatDepSet(sysStatsDep),
|
||||
compute: func(in *statAggregate, out *metricValue) {
|
||||
|
|
@ -345,6 +422,7 @@ type statDep uint
|
|||
const (
|
||||
heapStatsDep statDep = iota // corresponds to heapStatsAggregate
|
||||
sysStatsDep // corresponds to sysStatsAggregate
|
||||
cpuStatsDep // corresponds to cpuStatsAggregate
|
||||
numStatsDeps
|
||||
)
|
||||
|
||||
|
|
@ -490,6 +568,23 @@ func (a *sysStatsAggregate) compute() {
|
|||
})
|
||||
}
|
||||
|
||||
// cpuStatsAggregate represents CPU stats obtained from the runtime
|
||||
// acquired together to avoid skew and inconsistencies.
|
||||
type cpuStatsAggregate struct {
|
||||
cpuStats
|
||||
}
|
||||
|
||||
// compute populates the cpuStatsAggregate with values from the runtime.
|
||||
func (a *cpuStatsAggregate) compute() {
|
||||
a.cpuStats = work.cpuStats
|
||||
}
|
||||
|
||||
// nsToSec takes a duration in nanoseconds and converts it to seconds as
|
||||
// a float64.
|
||||
func nsToSec(ns int64) float64 {
|
||||
return float64(ns) / 1e9
|
||||
}
|
||||
|
||||
// statAggregate is the main driver of the metrics implementation.
|
||||
//
|
||||
// It contains multiple aggregates of runtime statistics, as well
|
||||
|
|
@ -499,6 +594,7 @@ type statAggregate struct {
|
|||
ensured statDepSet
|
||||
heapStats heapStatsAggregate
|
||||
sysStats sysStatsAggregate
|
||||
cpuStats cpuStatsAggregate
|
||||
}
|
||||
|
||||
// ensure populates statistics aggregates determined by deps if they
|
||||
|
|
@ -517,6 +613,8 @@ func (a *statAggregate) ensure(deps *statDepSet) {
|
|||
a.heapStats.compute()
|
||||
case sysStatsDep:
|
||||
a.sysStats.compute()
|
||||
case cpuStatsDep:
|
||||
a.cpuStats.compute()
|
||||
}
|
||||
}
|
||||
a.ensured = a.ensured.union(missing)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue