diff options
author | Sean E. Russell <seanerussell@gmail.com> | 2020-02-13 10:15:52 -0600 |
---|---|---|
committer | Sean E. Russell <seanerussell@gmail.com> | 2020-02-13 10:15:52 -0600 |
commit | 7e5c0c969c223973335c6fae5432411afc3fb060 (patch) | |
tree | 7f785ba4f692b81806209cb5f0c959e86efdba70 /widgets/cpu.go | |
parent | 4bfe0251a8893ed08654d59b8a8b8182958e907f (diff) |
Fixes the directory structure.
Diffstat (limited to 'widgets/cpu.go')
-rw-r--r-- | widgets/cpu.go | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/widgets/cpu.go b/widgets/cpu.go new file mode 100644 index 0000000..66da81c --- /dev/null +++ b/widgets/cpu.go @@ -0,0 +1,117 @@ +package widgets + +import ( + "fmt" + "log" + "sync" + "time" + + psCpu "github.com/shirou/gopsutil/cpu" + + ui "github.com/cjbassi/gotop/termui" +) + +type CpuWidget struct { + *ui.LineGraph + CpuCount int + ShowAverageLoad bool + ShowPerCpuLoad bool + updateInterval time.Duration + formatString string + updateLock sync.Mutex +} + +func NewCpuWidget(updateInterval time.Duration, horizontalScale int, showAverageLoad bool, showPerCpuLoad bool) *CpuWidget { + cpuCount, err := psCpu.Counts(false) + if err != nil { + log.Printf("failed to get CPU count from gopsutil: %v", err) + } + formatString := "CPU%1d" + if cpuCount > 10 { + formatString = "CPU%02d" + } + self := &CpuWidget{ + LineGraph: ui.NewLineGraph(), + CpuCount: cpuCount, + updateInterval: updateInterval, + ShowAverageLoad: showAverageLoad, + ShowPerCpuLoad: showPerCpuLoad, + formatString: formatString, + } + self.Title = " CPU Usage " + self.HorizontalScale = horizontalScale + + if !(self.ShowAverageLoad || self.ShowPerCpuLoad) { + if self.CpuCount <= 8 { + self.ShowPerCpuLoad = true + } else { + self.ShowAverageLoad = true + } + } + + if self.ShowAverageLoad { + self.Data["AVRG"] = []float64{0} + } + + if self.ShowPerCpuLoad { + for i := 0; i < int(self.CpuCount); i++ { + key := fmt.Sprintf(formatString, i) + self.Data[key] = []float64{0} + } + } + + self.update() + + go func() { + for range time.NewTicker(self.updateInterval).C { + self.update() + } + }() + + return self +} + +func (b *CpuWidget) Scale(i int) { + b.LineGraph.HorizontalScale = i +} + +func (self *CpuWidget) update() { + if self.ShowAverageLoad { + go func() { + percent, err := psCpu.Percent(self.updateInterval, false) + if err != nil { + log.Printf("failed to get average CPU usage percent from gopsutil: %v. self.updateInterval: %v. percpu: %v", err, self.updateInterval, false) + } else { + self.Lock() + defer self.Unlock() + self.updateLock.Lock() + defer self.updateLock.Unlock() + self.Data["AVRG"] = append(self.Data["AVRG"], percent[0]) + self.Labels["AVRG"] = fmt.Sprintf("%3.0f%%", percent[0]) + } + }() + } + + if self.ShowPerCpuLoad { + go func() { + percents, err := psCpu.Percent(self.updateInterval, true) + if err != nil { + log.Printf("failed to get CPU usage percents from gopsutil: %v. self.updateInterval: %v. percpu: %v", err, self.updateInterval, true) + } else { + if len(percents) != int(self.CpuCount) { + log.Printf("error: number of CPU usage percents from gopsutil doesn't match CPU count. percents: %v. self.Count: %v", percents, self.CpuCount) + } else { + self.Lock() + defer self.Unlock() + self.updateLock.Lock() + defer self.updateLock.Unlock() + for i, percent := range percents { + key := fmt.Sprintf(self.formatString, i) + self.Data[key] = append(self.Data[key], percent) + self.Labels[key] = fmt.Sprintf("%3.0f%%", percent) + } + } + } + }() + } +} |