in metric/cpu/cpu.go [150:203]
func (metric Metrics) Format(opts MetricOpts) (mapstr.M, error) {
timeDelta := metric.currentSample.Total() - metric.previousSample.Total()
if timeDelta <= 0 {
return nil, errors.New("previous sample is newer than current sample")
}
normCPU := metric.count
if !metric.isTotals {
normCPU = 1
}
formattedMetrics := mapstr.M{}
reportOptMetric := func(name string, current, previous opt.Uint, norm int) {
if !current.IsZero() {
formattedMetrics[name] = fillMetric(opts, current, previous, timeDelta, norm)
}
}
if opts.Percentages {
_, _ = formattedMetrics.Put("total.pct", createTotal(metric.previousSample, metric.currentSample, timeDelta, normCPU))
}
if opts.NormalizedPercentages {
_, _ = formattedMetrics.Put("total.norm.pct", createTotal(metric.previousSample, metric.currentSample, timeDelta, 1))
}
// /proc/stat metrics
reportOptMetric("user", metric.currentSample.User, metric.previousSample.User, normCPU)
reportOptMetric("system", metric.currentSample.Sys, metric.previousSample.Sys, normCPU)
reportOptMetric("idle", metric.currentSample.Idle, metric.previousSample.Idle, normCPU)
reportOptMetric("nice", metric.currentSample.Nice, metric.previousSample.Nice, normCPU)
reportOptMetric("irq", metric.currentSample.Irq, metric.previousSample.Irq, normCPU)
reportOptMetric("iowait", metric.currentSample.Wait, metric.previousSample.Wait, normCPU)
reportOptMetric("softirq", metric.currentSample.SoftIrq, metric.previousSample.SoftIrq, normCPU)
reportOptMetric("steal", metric.currentSample.Stolen, metric.previousSample.Stolen, normCPU)
// Only add CPU info metrics if we're returning information by core
// (isTotals is false)
if !metric.isTotals {
// Some platforms do not report those metrics, so metric.cpuInfo
// is empty, if that happens we do not add the empty metrics to the
// final event.
if metric.cpuInfo != (CPUInfo{}) {
// /proc/cpuinfo metrics
formattedMetrics["model_number"] = metric.cpuInfo.ModelNumber
formattedMetrics["model_name"] = metric.cpuInfo.ModelName
formattedMetrics["mhz"] = metric.cpuInfo.Mhz
formattedMetrics["core_id"] = metric.cpuInfo.CoreID
formattedMetrics["physical_id"] = metric.cpuInfo.PhysicalID
}
}
return formattedMetrics, nil
}