diff --git a/beszel/internal/entities/system/system.go b/beszel/internal/entities/system/system.go index d3f2626..03aa90d 100644 --- a/beszel/internal/entities/system/system.go +++ b/beszel/internal/entities/system/system.go @@ -6,23 +6,26 @@ import ( ) type Stats struct { - Cpu float64 `json:"cpu"` - Mem float64 `json:"m"` - MemUsed float64 `json:"mu"` - MemPct float64 `json:"mp"` - MemBuffCache float64 `json:"mb"` - MemZfsArc float64 `json:"mz,omitempty"` // ZFS ARC memory - Swap float64 `json:"s,omitempty"` - SwapUsed float64 `json:"su,omitempty"` - DiskTotal float64 `json:"d"` - DiskUsed float64 `json:"du"` - DiskPct float64 `json:"dp"` - DiskReadPs float64 `json:"dr"` - DiskWritePs float64 `json:"dw"` - NetworkSent float64 `json:"ns"` - NetworkRecv float64 `json:"nr"` - Temperatures map[string]float64 `json:"t,omitempty"` - ExtraFs map[string]*FsStats `json:"efs,omitempty"` + Cpu float64 `json:"cpu"` + PeakCpu float64 `json:"pcpu,omitempty"` + Mem float64 `json:"m"` + MemUsed float64 `json:"mu"` + MemPct float64 `json:"mp"` + MemBuffCache float64 `json:"mb"` + MemZfsArc float64 `json:"mz,omitempty"` // ZFS ARC memory + Swap float64 `json:"s,omitempty"` + SwapUsed float64 `json:"su,omitempty"` + DiskTotal float64 `json:"d"` + DiskUsed float64 `json:"du"` + DiskPct float64 `json:"dp"` + DiskReadPs float64 `json:"dr"` + DiskWritePs float64 `json:"dw"` + NetworkSent float64 `json:"ns"` + PeakNetworkSent float64 `json:"pns,omitempty"` + NetworkRecv float64 `json:"nr"` + PeakNetworkRecv float64 `json:"pnr,omitempty"` + Temperatures map[string]float64 `json:"t,omitempty"` + ExtraFs map[string]*FsStats `json:"efs,omitempty"` } type FsStats struct { diff --git a/beszel/internal/records/records.go b/beszel/internal/records/records.go index 0292df8..a4b89e6 100644 --- a/beszel/internal/records/records.go +++ b/beszel/internal/records/records.go @@ -153,6 +153,11 @@ func (rm *RecordManager) AverageSystemStats(records []*models.Record) system.Sta // use different counter for temps in case some records don't have them tempCount := float64(0) + // peak values + peakCpu := float64(0) + peakNs := float64(0) + peakNr := float64(0) + var stats system.Stats for _, record := range records { record.UnmarshalJSONField("stats", &stats) @@ -171,6 +176,10 @@ func (rm *RecordManager) AverageSystemStats(records []*models.Record) system.Sta sum.DiskWritePs += stats.DiskWritePs sum.NetworkSent += stats.NetworkSent sum.NetworkRecv += stats.NetworkRecv + // set peak values + peakCpu = max(peakCpu, stats.PeakCpu, stats.Cpu) + peakNs = max(peakNs, stats.PeakNetworkSent, stats.NetworkSent) + peakNr = max(peakNr, stats.PeakNetworkRecv, stats.NetworkRecv) // add temps to sum if stats.Temperatures != nil { tempCount++ @@ -196,21 +205,24 @@ func (rm *RecordManager) AverageSystemStats(records []*models.Record) system.Sta } stats = system.Stats{ - Cpu: twoDecimals(sum.Cpu / count), - Mem: twoDecimals(sum.Mem / count), - MemUsed: twoDecimals(sum.MemUsed / count), - MemPct: twoDecimals(sum.MemPct / count), - MemBuffCache: twoDecimals(sum.MemBuffCache / count), - MemZfsArc: twoDecimals(sum.MemZfsArc / count), - Swap: twoDecimals(sum.Swap / count), - SwapUsed: twoDecimals(sum.SwapUsed / count), - DiskTotal: twoDecimals(sum.DiskTotal / count), - DiskUsed: twoDecimals(sum.DiskUsed / count), - DiskPct: twoDecimals(sum.DiskPct / count), - DiskReadPs: twoDecimals(sum.DiskReadPs / count), - DiskWritePs: twoDecimals(sum.DiskWritePs / count), - NetworkSent: twoDecimals(sum.NetworkSent / count), - NetworkRecv: twoDecimals(sum.NetworkRecv / count), + Cpu: twoDecimals(sum.Cpu / count), + PeakCpu: twoDecimals(peakCpu), + Mem: twoDecimals(sum.Mem / count), + MemUsed: twoDecimals(sum.MemUsed / count), + MemPct: twoDecimals(sum.MemPct / count), + MemBuffCache: twoDecimals(sum.MemBuffCache / count), + MemZfsArc: twoDecimals(sum.MemZfsArc / count), + Swap: twoDecimals(sum.Swap / count), + SwapUsed: twoDecimals(sum.SwapUsed / count), + DiskTotal: twoDecimals(sum.DiskTotal / count), + DiskUsed: twoDecimals(sum.DiskUsed / count), + DiskPct: twoDecimals(sum.DiskPct / count), + DiskReadPs: twoDecimals(sum.DiskReadPs / count), + DiskWritePs: twoDecimals(sum.DiskWritePs / count), + NetworkSent: twoDecimals(sum.NetworkSent / count), + PeakNetworkSent: twoDecimals(peakNs), + NetworkRecv: twoDecimals(sum.NetworkRecv / count), + PeakNetworkRecv: twoDecimals(peakNr), } if len(sum.Temperatures) != 0 { diff --git a/beszel/site/src/types.d.ts b/beszel/site/src/types.d.ts index 146cbcf..4c6f84f 100644 --- a/beszel/site/src/types.d.ts +++ b/beszel/site/src/types.d.ts @@ -35,6 +35,8 @@ export interface SystemInfo { export interface SystemStats { /** cpu percent */ cpu: number + /** peak cpu */ + pcpu?: number /** total memory (gb) */ m: number /** memory used (gb) */ @@ -61,8 +63,12 @@ export interface SystemStats { dw: number /** network sent (mb) */ ns: number + /** peak network sent (mb) */ + pns?: number /** network received (mb) */ nr: number + /** peak network received (mb) */ + pnr?: number /** temperatures */ t?: Record /** extra filesystems */