waveterm/pkg/wshrpc/wshremote/sysinfo.go
Sylvie Crowe a5999aa02a
Plot Sysinfo (#1054)
Expands the cpuplot with memory plots and individual cpu plots. Also
improves the styling and handling of multiple plots.
2024-10-17 15:19:13 -07:00

73 lines
1.8 KiB
Go

// Copyright 2024, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
package wshremote
import (
"log"
"strconv"
"time"
"github.com/shirou/gopsutil/v4/cpu"
"github.com/shirou/gopsutil/v4/mem"
"github.com/wavetermdev/waveterm/pkg/wps"
"github.com/wavetermdev/waveterm/pkg/wshrpc"
"github.com/wavetermdev/waveterm/pkg/wshrpc/wshclient"
"github.com/wavetermdev/waveterm/pkg/wshutil"
)
const BYTES_PER_GB = 1073741824
func getCpuData(values map[string]float64) {
percentArr, err := cpu.Percent(0, false)
if err != nil {
return
}
if len(percentArr) > 0 {
values[wshrpc.TimeSeries_Cpu] = percentArr[0]
}
percentArr, err = cpu.Percent(0, true)
if err != nil {
return
}
for idx, percent := range percentArr {
values[wshrpc.TimeSeries_Cpu+":"+strconv.Itoa(idx)] = percent
}
}
func getMemData(values map[string]float64) {
memData, err := mem.VirtualMemory()
if err != nil {
return
}
values["mem:total"] = float64(memData.Total) / BYTES_PER_GB
values["mem:available"] = float64(memData.Available) / BYTES_PER_GB
values["mem:used"] = float64(memData.Used) / BYTES_PER_GB
values["mem:free"] = float64(memData.Free) / BYTES_PER_GB
}
func generateSingleServerData(client *wshutil.WshRpc, connName string) {
now := time.Now()
values := make(map[string]float64)
getCpuData(values)
getMemData(values)
tsData := wshrpc.TimeSeriesData{Ts: now.UnixMilli(), Values: values}
event := wps.WaveEvent{
Event: wps.Event_SysInfo,
Scopes: []string{connName},
Data: tsData,
Persist: 1024,
}
wshclient.EventPublishCommand(client, event, &wshrpc.RpcOpts{NoResponse: true})
}
func RunSysInfoLoop(client *wshutil.WshRpc, connName string) {
defer func() {
log.Printf("sysinfo loop ended conn:%s\n", connName)
}()
for {
generateSingleServerData(client, connName)
time.Sleep(1 * time.Second)
}
}