diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 80a9af3..b964c80 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -888,21 +888,22 @@ func uidName(uid string) string { // ProcTable is the Processes tab payload. type ProcTable struct { - T int64 `json:"t"` - CPU float64 `json:"cpu"` - Cores []float64 `json:"cores"` - CPUHist []float64 `json:"cpu_hist"` // recent total-CPU samples, oldest first - CPUModel string `json:"cpu_model,omitempty"` - CPUMHz float64 `json:"cpu_mhz,omitempty"` - CPUTemp float64 `json:"cpu_temp,omitempty"` - Load [3]float64 `json:"load"` - Mem Mem `json:"mem"` - Swap Mem `json:"swap"` - Net []Net `json:"net"` - Uptime float64 `json:"uptime"` - Procs []Proc `json:"procs"` - Total int `json:"total"` - Running int `json:"running"` + T int64 `json:"t"` + CPU float64 `json:"cpu"` + Cores []float64 `json:"cores"` + CPUHist []float64 `json:"cpu_hist"` // recent total-CPU samples, oldest first + CPUModel string `json:"cpu_model,omitempty"` + CPUMHz float64 `json:"cpu_mhz,omitempty"` + CPUMaxMHz float64 `json:"cpu_max_mhz,omitempty"` + CPUTemp float64 `json:"cpu_temp,omitempty"` + Load [3]float64 `json:"load"` + Mem Mem `json:"mem"` + Swap Mem `json:"swap"` + Net []Net `json:"net"` + Uptime float64 `json:"uptime"` + Procs []Proc `json:"procs"` + Total int `json:"total"` + Running int `json:"running"` } var cpuModel = func() string { @@ -916,6 +917,13 @@ var cpuModel = func() string { return "" }() +var cpuMaxMHz = func() float64 { + if v, ok := readInt("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"); ok { + return float64(v) / 1000 + } + return 0 +}() + func cpuMHz() float64 { var sum float64 n := 0 @@ -1055,7 +1063,7 @@ func (c *Collector) Processes() ProcTable { return procs[i].RSS > procs[j].RSS }) t := ProcTable{T: now.UnixMilli(), Procs: procs, Total: len(procs), Uptime: uptime(), Load: loadavg(), - CPUModel: cpuModel, CPUMHz: round1(cpuMHz()), CPUHist: []float64{}, Net: []Net{}} + CPUModel: cpuModel, CPUMHz: round1(cpuMHz()), CPUMaxMHz: cpuMaxMHz, CPUHist: []float64{}, Net: []Net{}} for _, p := range procs { if p.State == "R" { t.Running++ diff --git a/web/src/Procs.tsx b/web/src/Procs.tsx index 5c4236f..30fae14 100644 --- a/web/src/Procs.tsx +++ b/web/src/Procs.tsx @@ -86,7 +86,7 @@ export default function Procs() { return (
{showTop &&
- +
CPU{pct(t.cpu)}total, all cores
diff --git a/web/src/api.ts b/web/src/api.ts index aa5088a..e91d47f 100644 --- a/web/src/api.ts +++ b/web/src/api.ts @@ -42,7 +42,7 @@ export interface FS { mount: string; type: string; size: number; used: number } export interface UPS { driver: string; model: string; state: string; source: string; on_battery: boolean; in_v: number; out_v: number; battery_pct: number; runtime_min: number; load_w: number; load_pct: number; last_event?: string } export interface Proc { pid: number; ppid: number; name: string; cmd?: string; user: string; cpu: number; cpu_time: number; rss: number; threads: number; state: string; nice: number; started: number } export interface MemInfo { total: number; used: number; avail: number; free?: number; cached?: number; buffers?: number } -export interface ProcTable { t: number; cpu: number; cores: number[]; cpu_hist: number[]; cpu_model?: string; cpu_mhz?: number; cpu_temp?: number; load: [number, number, number]; mem: MemInfo; swap: MemInfo; net: NetIf[]; uptime: number; procs: Proc[]; total: number; running: number } +export interface ProcTable { t: number; cpu: number; cores: number[]; cpu_hist: number[]; cpu_model?: string; cpu_mhz?: number; cpu_max_mhz?: number; cpu_temp?: number; load: [number, number, number]; mem: MemInfo; swap: MemInfo; net: NetIf[]; uptime: number; procs: Proc[]; total: number; running: number } export interface Sample { t: number; interval_ms: number; cpu: number; cores: number[]; load: [number, number, number] mem: { total: number; used: number; avail: number }; swap: { total: number; used: number; avail: number }