1package resourceusage 2 3import ( 4 "fmt" 5 "math" 6 "time" 7 8 "code.cloudfoundry.org/bytefmt" 9 "github.com/rivo/tview" 10 "github.com/shirou/gopsutil/cpu" 11 "github.com/shirou/gopsutil/mem" 12 "github.com/wtfutil/wtf/view" 13) 14 15var started = false 16var ok = true 17 18// Widget define wtf widget to register widget later 19type Widget struct { 20 view.BarGraph 21 22 app *tview.Application 23 settings *Settings 24} 25 26// NewWidget Make new instance of widget 27func NewWidget(app *tview.Application, settings *Settings) *Widget { 28 widget := Widget{ 29 BarGraph: view.NewBarGraph(app, settings.common.Name, settings.common, false), 30 31 app: app, 32 settings: settings, 33 } 34 35 widget.View.SetWrap(false) 36 widget.View.SetWordWrap(false) 37 38 return &widget 39} 40 41/* -------------------- Exported Functions -------------------- */ 42 43// MakeGraph - Load the dead drop stats 44func MakeGraph(widget *Widget) { 45 cpuStats, err := cpu.Percent(time.Duration(0), true) 46 if err != nil { 47 return 48 } 49 50 var stats = make([]view.Bar, len(cpuStats)+2) 51 52 for i, stat := range cpuStats { 53 // Stats sometimes jump outside the 0-100 range, possibly due to timing 54 stat = math.Min(100, stat) 55 stat = math.Max(0, stat) 56 57 bar := view.Bar{ 58 Label: fmt.Sprint(i), 59 Percent: int(stat), 60 ValueLabel: fmt.Sprintf("%d%%", int(stat)), 61 } 62 63 stats[i] = bar 64 } 65 66 memInfo, err := mem.VirtualMemory() 67 if err != nil { 68 return 69 } 70 71 memIndex := len(cpuStats) 72 73 usedMemLabel := bytefmt.ByteSize(memInfo.Used) 74 totalMemLabel := bytefmt.ByteSize(memInfo.Total) 75 76 if usedMemLabel[len(usedMemLabel)-1] == totalMemLabel[len(totalMemLabel)-1] { 77 usedMemLabel = usedMemLabel[:len(usedMemLabel)-1] 78 } 79 80 stats[memIndex] = view.Bar{ 81 Label: "Mem", 82 Percent: int(memInfo.UsedPercent), 83 ValueLabel: fmt.Sprintf("%s/%s", usedMemLabel, totalMemLabel), 84 } 85 86 swapIndex := len(cpuStats) + 1 87 swapUsed := memInfo.SwapTotal - memInfo.SwapFree 88 var swapPercent float64 89 if memInfo.SwapTotal > 0 { 90 swapPercent = float64(swapUsed) / float64(memInfo.SwapTotal) 91 } 92 93 usedSwapLabel := bytefmt.ByteSize(swapUsed) 94 totalSwapLabel := bytefmt.ByteSize(memInfo.SwapTotal) 95 96 if usedSwapLabel[len(usedSwapLabel)-1] == totalMemLabel[len(totalSwapLabel)-1] { 97 usedSwapLabel = usedSwapLabel[:len(usedSwapLabel)-1] 98 } 99 100 stats[swapIndex] = view.Bar{ 101 Label: "Swp", 102 Percent: int(swapPercent * 100), 103 ValueLabel: fmt.Sprintf("%s/%s", usedSwapLabel, totalSwapLabel), 104 } 105 106 widget.BarGraph.BuildBars(stats[:]) 107 108} 109 110// Refresh & update after interval time 111func (widget *Widget) Refresh() { 112 113 if widget.Disabled() { 114 return 115 } 116 117 widget.View.Clear() 118 119 widget.app.QueueUpdateDraw(func() { 120 display(widget) 121 }) 122} 123 124/* -------------------- Unexported Functions -------------------- */ 125 126func display(widget *Widget) { 127 MakeGraph(widget) 128} 129