diff --git a/internal/metrics/fold.go b/internal/metrics/fold.go index 3662342..2932b6c 100644 --- a/internal/metrics/fold.go +++ b/internal/metrics/fold.go @@ -1,5 +1,7 @@ package metrics +import "strconv" + // One kept history point is the average of the samples behind it. At the default ten-minute // window that bucket is a single sample and nothing is averaged; at a day it is five minutes // of them, and the difference matters — a graph of the last day drawn from whichever instant @@ -85,13 +87,13 @@ func fold(b []Sample) Sample { temps := avgBy(b, func(s Sample) map[string][]float64 { m := make(map[string][]float64, len(s.Temps)) for _, x := range s.Temps { - m[x.Chip+"/"+x.Label] = []float64{x.C} + m[x.Chip+"/"+x.Label+"/"+strconv.Itoa(x.Pkg)] = []float64{x.C} } return m }) out.Temps = append([]Temp(nil), out.Temps...) for i, x := range out.Temps { - if v, ok := temps[x.Chip+"/"+x.Label]; ok { + if v, ok := temps[x.Chip+"/"+x.Label+"/"+strconv.Itoa(x.Pkg)]; ok { out.Temps[i].C = v[0] } } diff --git a/internal/metrics/sensors.go b/internal/metrics/sensors.go index dc905a3..4a69c54 100644 --- a/internal/metrics/sensors.go +++ b/internal/metrics/sensors.go @@ -96,7 +96,11 @@ func flatten(s Sample, want func(id string) bool) []sensors.Sensor { if x.Crit > 0 { b.crit = sensors.F(x.Crit) } - f.add(sensors.ID("temp", sensors.Seg(x.Chip), sensors.Seg(x.Label)), x.Chip+" "+x.Label, "temperature", "°C", x.C, t, b, "chip", x.Chip, "label", x.Label) + labels := []string{"chip", x.Chip, "label", x.Label} + if x.Chip == "coretemp" { // a two-socket board has a coretemp chip per CPU, both with a "Core 0" + labels = append(labels, "package", strconv.Itoa(x.Pkg)) + } + f.add(sensors.ID("temp", sensors.Seg(x.Chip), sensors.Seg(x.Label)), x.Chip+" "+x.Label, "temperature", "°C", x.C, t, b, labels...) } for _, x := range s.Fans { f.add(sensors.ID("fan", sensors.Seg(x.Chip), sensors.Seg(x.Label)), x.Chip+" "+x.Label, "fan", "rpm", float64(x.RPM), t, none, "chip", x.Chip, "label", x.Label) diff --git a/web/src/sampleAdapter.ts b/web/src/sampleAdapter.ts index 2993b90..62d8e53 100644 --- a/web/src/sampleAdapter.ts +++ b/web/src/sampleAdapter.ts @@ -47,7 +47,7 @@ export function sampleOf(v: Values, cat: Catalog): Sample { t: Date.now(), interval_ms: num(v, 'hamlab.sample_interval'), cpu: num(v, 'cpu.usage'), cores, load: [num(v, 'load.1'), num(v, 'load.5'), num(v, 'load.15')], mem: mem('mem'), swap: mem('swap'), uptime: num(v, 'uptime'), - temps: hw('temp.').map(({ id, s }) => ({ chip: s.labels!.chip, label: s.labels!.label, c: num(v, id), max: s.warn, crit: s.crit })), + temps: hw('temp.').map(({ id, s }) => ({ chip: s.labels!.chip, label: s.labels!.label, c: num(v, id), max: s.warn, crit: s.crit, pkg: s.labels!.package !== undefined ? Number(s.labels!.package) : undefined })), fans: hw('fan.').map(({ id, s }) => ({ chip: s.labels!.chip, label: s.labels!.label, rpm: num(v, id) })), net: [...groups(v, cat, 'net.', 'iface')].map(([iface, p]) => ({ iface, up: v[p + '.up'] === true, rx_bps: num(v, p + '.rx'), tx_bps: num(v, p + '.tx'), rx_total: num(v, p + '.rx_total'), tx_total: num(v, p + '.tx_total') })), disks: [...groups(v, cat, 'disk.', 'device')].map(([name, p]) => ({ name, model: cat.get(p + '.size')?.labels?.model || undefined, size: num(v, p + '.size'), read_bps: num(v, p + '.read'), write_bps: num(v, p + '.write'), util_pct: num(v, p + '.util'), temp: num(v, p + '.temp') || undefined })),