From 57e68204bdb8b30e578aea47eb851ceabd27dfd3 Mon Sep 17 00:00:00 2001 From: Joel Male Date: Wed, 25 Feb 2026 15:17:30 +1000 Subject: [PATCH] fix: derive CPU total from per-core average to avoid split measurement windows --- main.go | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/main.go b/main.go index f2f00ed..5315bff 100644 --- a/main.go +++ b/main.go @@ -861,21 +861,22 @@ func collectMetrics(config *Config) (*Metrics, error) { } } - // CPU - cpuPercent, err := cpu.Percent(time.Second, false) + // CPU — single sample with percpu=true, then average for the total. + // Calling cpu.Percent twice with separate 1s windows can produce + // wildly inconsistent totals vs per-core values. + cpuPerCore, err := cpu.Percent(time.Second, true) if err != nil { return nil, fmt.Errorf("failed to get CPU percent: %w", err) } - if len(cpuPercent) > 0 { - metrics.CPU.Percent = cpuPercent[0] + metrics.CPU.PerCore = cpuPerCore + if len(cpuPerCore) > 0 { + var sum float64 + for _, p := range cpuPerCore { + sum += p + } + metrics.CPU.Percent = sum / float64(len(cpuPerCore)) } - cpuPercentPerCore, err := cpu.Percent(time.Second, true) - if err != nil { - return nil, fmt.Errorf("failed to get per-core CPU percent: %w", err) - } - metrics.CPU.PerCore = cpuPercentPerCore - cpuCount, err := cpu.Counts(true) if err != nil { return nil, fmt.Errorf("failed to get CPU count: %w", err)