summaryrefslogtreecommitdiffstats
path: root/widgets/cpu.go
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/cpu.go')
-rw-r--r--widgets/cpu.go58
1 files changed, 25 insertions, 33 deletions
diff --git a/widgets/cpu.go b/widgets/cpu.go
index d8d9a50..2668b3a 100644
--- a/widgets/cpu.go
+++ b/widgets/cpu.go
@@ -2,12 +2,13 @@ package widgets
import (
"fmt"
- "sync"
"time"
"github.com/VictoriaMetrics/metrics"
+ "github.com/VividCortex/ewma"
"github.com/xxxserxxx/gotop/v4/devices"
+ "github.com/gizak/termui/v3"
ui "github.com/xxxserxxx/gotop/v4/termui"
)
@@ -17,8 +18,8 @@ type CPUWidget struct {
ShowAverageLoad bool
ShowPerCPULoad bool
updateInterval time.Duration
- updateLock sync.Mutex
cpuLoads map[string]float64
+ average ewma.MovingAverage
}
var cpuLabels []string
@@ -31,7 +32,9 @@ func NewCPUWidget(updateInterval time.Duration, horizontalScale int, showAverage
ShowAverageLoad: showAverageLoad,
ShowPerCPULoad: showPerCPULoad,
cpuLoads: make(map[string]float64),
+ average: ewma.NewMovingAverage(),
}
+ self.LabelStyles[AVRG] = termui.ModifierBold
self.Title = " CPU Usage "
self.HorizontalScale = horizontalScale
@@ -44,7 +47,7 @@ func NewCPUWidget(updateInterval time.Duration, horizontalScale int, showAverage
}
if self.ShowAverageLoad {
- self.Data["AVRG"] = []float64{0}
+ self.Data[AVRG] = []float64{0}
}
if self.ShowPerCPULoad {
@@ -91,38 +94,27 @@ func (cpu *CPUWidget) Scale(i int) {
}
func (cpu *CPUWidget) update() {
- if cpu.ShowAverageLoad {
- go func() {
- cpus := make(map[string]int)
- devices.UpdateCPU(cpus, cpu.updateInterval, false)
- cpu.Lock()
- defer cpu.Unlock()
- cpu.updateLock.Lock()
- defer cpu.updateLock.Unlock()
- var val float64
- for _, v := range cpus {
- val = float64(v)
- break
- }
- cpu.Data[AVRG] = append(cpu.Data[AVRG], val)
- cpu.Labels[AVRG] = fmt.Sprintf("%3.0f%%", val)
- cpu.cpuLoads[AVRG] = val
- }()
- }
-
- if cpu.ShowPerCPULoad {
- go func() {
- cpus := make(map[string]int)
- devices.UpdateCPU(cpus, cpu.updateInterval, true)
- cpu.Lock()
- defer cpu.Unlock()
- cpu.updateLock.Lock()
- defer cpu.updateLock.Unlock()
- for key, percent := range cpus {
+ go func() {
+ cpus := make(map[string]int)
+ devices.UpdateCPU(cpus, cpu.updateInterval, true)
+ cpu.Lock()
+ defer cpu.Unlock()
+ // AVG = ((AVG*i)+n)/(i+1)
+ var sum int
+ for key, percent := range cpus {
+ sum += percent
+ if cpu.ShowPerCPULoad {
cpu.Data[key] = append(cpu.Data[key], float64(percent))
cpu.Labels[key] = fmt.Sprintf("%d%%", percent)
cpu.cpuLoads[key] = float64(percent)
}
- }()
- }
+ }
+ if cpu.ShowAverageLoad {
+ cpu.average.Add(float64(sum) / float64(len(cpus)))
+ avg := cpu.average.Value()
+ cpu.Data[AVRG] = append(cpu.Data[AVRG], avg)
+ cpu.Labels[AVRG] = fmt.Sprintf("%3.0f%%", avg)
+ cpu.cpuLoads[AVRG] = avg
+ }
+ }()
}