Commit Graph
312 Commits
Author SHA1 Message Date
Sven van GinkelandGitHub 4da7d867f2 systemd: include user journals in service logs (#2553) 2026-10-11 13:02:38 -04:00
d324ccc097 feat(agent): support custom WebSocket headers with HUB_HEADERS (#2585)
Co-authored-by: henrygd <hank@henrygd.me>
2026-10-11 11:22:37 -04:00
henrygd 7f2eb90f24 perf(agent): reuse buffer when reading intel_gpu_top samples 2026-10-11 10:44:18 -04:00
yi111andGitHub 7f63e65f22 fix(agent): parse intel_gpu_top -J arrays that omit commas between samples (#2589) 2026-10-11 10:35:56 -04:00
Bharat KauravandGitHub 383e9c7072 fix(agent): widen NVMe unsafe_shutdowns to uint (#2583)
unsafe_shutdowns was uint16, so drives reporting more than 65535 unsafe
shutdowns made json.Unmarshal fail and the entire NVMe SMART record was
discarded with only "no valid SMART data found" in the logs. Widen it
to uint, matching power_cycles (#2484), and log the unmarshal error at
debug level so similar failures are diagnosable.

Fixes #2582
2026-10-11 09:17:17 -04:00
spatiumstasandhank 13bdd05934 fix: handle cached NVMe failures and empty SMART responses 2026-10-09 14:40:55 -04:00
Fuwuwuwuandhank d8b4191975 fix(agent): reset host CPU baseline after counter rollback 2026-10-09 14:16:35 -04:00
017ebb091a feat: surface zpool status messages in pool health (#2509)
Co-authored-by: henrygd <hank@henrygd.me>
2026-10-09 13:57:40 -04:00
b11e361799 fix(agent): prevent network counter underflow on interface removal and container restart (#2574)
Co-authored-by: hank <hank@henrygd.me>
2026-10-09 12:58:05 -04:00
Sven van GinkelandGitHub 5529d2e15e fix(agent): verify systemd on dbus before starting service monitoring (#2573) 2026-10-09 11:39:09 -04:00
bc2278e7e9 feat(agent): Handle update package check for xbps package manager (#2522)
Co-authored-by: hank <hank@henrygd.me>
2026-10-06 12:10:12 -04:00
henrygd 4fe1a0a7a4 refactor(agent): share cgroup path vars and v2 mount lookup
Drop the cpu prefix from the cgroup path vars now that memory
accounting uses them too, and extract cgroupV2Dir() for the v2 mount
lookup previously repeated in CPU, memory and the root cgroup check.
2026-10-05 14:54:29 -04:00
ef840e0e6d feat(agent): support opt-in cgroup CPU and memory accounting (#2505)
Co-authored-by: hank <hank@henrygd.me>
2026-10-05 14:52:40 -04:00
Sven van GinkelandGitHub d89f844a2a feat(monitors): add option to ignore TLS errors for HTTPS monitors (#2500) 2026-10-05 12:01:51 -04:00
Sven van GinkelandGitHub 74c952b879 fix(agent): don't detect zypper-aptitude's apt-get wrapper as apt (#2523) 2026-10-05 11:49:05 -04:00
MarrrrrrrrryandGitHub 36c14e903d fix(agent): stop sending legacy hubs a duplicate stats payload (#2529) 2026-10-05 11:38:33 -04:00
henrygd e597dd94db wifi: add SKIP_WIFI env var to disable signal monitoring 2026-10-02 12:54:22 -04:00
henrygd b115e2aa6a wifi(linux): skip nl80211 when no wireless devices are registered
Check /sys/class/ieee80211 before opening netlink sockets. Looking up
the
nl80211 family while cfg80211 is not loaded makes the kernel run
modprobe,
which loads the module on hosts without wireless hardware, or fails
again
on every poll when the module is unavailable.
2026-10-02 12:47:57 -04:00
01d91728f0 fix(agent): report LXC guest CPU usage from cgroup accounting (#2341)
Inside an LXC guest, lxcfs serves /proc/stat with the counters of the
host cores in the guest's cpuset, so an idle guest sharing a core with a
busy neighbor reported near-100% CPU.

When the agent detects it is running in an LXC guest (lxcfs mounted on
/proc/stat, container=lxc, or /run/systemd/container), derive CPU usage
from the guest's own cgroup instead: cpu.stat on cgroup v2, cpuacct on
v1, read at the cgroup mount root so it covers every process in the
guest. Usage is normalized by the usable cores (the smallest of the
affinity mask, cpuset and CPU quota).

Per-core usage is omitted in this mode, since the per-core /proc/stat
counters describe shared host cores and would contradict the total.
Iowait and steal are not available from cgroup accounting and report as
zero.

Hosts and Docker/Podman agents are unaffected and keep reading
/proc/stat, as does an LXC guest whose cgroup accounting is unreadable.

---------

Co-authored-by: hank <hank@henrygd.me>
2026-10-01 19:33:42 -04:00
Santhi PrakashandGitHub c394a6b5b1 fix(agent): resolve device symlinks so LVM volumes map to disk I/O (#2486) 2026-10-01 18:44:29 -04:00
spatiumstasandhenrygd 4ffd83677d fix(agent): improve WebSocket and SSH fallback handling (#2441)
Make WebSocket reconnect and SSH fallback transitions reliable across asynchronous disconnects, stale callbacks, and overlapping connections. Keep the SSH listener available while disconnected and allow a verified WebSocket connection to take precedence when it recovers.

Co-authored-by: henrygd <hank@henrygd.me>
2026-10-01 13:37:57 -04:00
0b101cc6be fix(agent): use nvethernet MAC counters (#2090)
Co-authored-by: hank <hank@henrygd.me>
2026-10-01 10:58:21 -04:00
Jeroen De WildeandGitHub 2502dd9626 feat: add toggle for log timestamps (#2471) 2026-09-30 21:14:13 -04:00
Santhi PrakashandGitHub 65e3e2e768 fix(agent): count ZFS snapshot reads in pool I/O stats (#2474) 2026-09-30 18:22:51 -04:00
henrygd 266f45f104 fix(agent): skip first disk I/O sample of an interval when its window is too short
Right after agent start the hub requests stats immediately, and the first
sample of the interval was measured from the baseline taken at startup, only
a second or so earlier. A burst of startup I/O was then stored as the rate
for the whole minute, causing large spikes in disk I/O charts.

The first sample of an interval now must span at least half the interval.
Otherwise it only stores the snapshot, and the next sample is measured from it.
2026-09-30 13:02:29 -04:00
henrygd e925fafd7b refactor(agent): label windows wifi interfaces by adapter name instead of GUID 2026-09-30 12:50:17 -04:00
spatiumstasandGitHub 67c5905b36 fix(agent): handle partial NVMe SMART data (#2340) 2026-09-29 12:09:32 -04:00
user01010111andGitHub 68ca6936a7 refactor(agent): avoid deprecated CPU time total helper (#2459) 2026-09-29 08:42:01 -04:00
user01010111andGitHub 130365f5d3 fix(agent): create SSH server configuration per connection (#2451) 2026-09-28 19:22:48 -04:00
user01010111andGitHub c556dc478d test: preserve fixture errors and verify complete certificate pools (#2462) 2026-09-28 18:23:15 -04:00
user01010111andGitHub 62f8a39c8a test: make agent and systemd fixtures portable (#2461) 2026-09-28 18:19:02 -04:00
7626e5e3c8 feat: show systemd service logs in service details (#2440)
Co-authored-by: hank <hank@henrygd.me>
2026-09-28 13:57:36 -04:00
Anand HegdeandGitHub 8613cfe548 feat: list pending package updates on the system page (#2427) 2026-09-27 11:27:13 -04:00
739649a6db Fix: Convert intel gpu top from text to JSON (#2387)
Co-authored-by: hank <hank@henrygd.me>
2026-09-27 10:17:28 -04:00
Sven van GinkelandGitHub 3f20ecae50 fix(agent): keep reconnecting after an async WebSocket handshake failure (#2329, #2326) 2026-09-26 13:30:52 -04:00
henrygd a042e19549 wifi(linux): query associated station directly
mdlayher/wifi only dumps stations, which some full-MAC drivers (e.g.
out-of-tree Realtek USB) answer with an empty list, leaving RSSI
unavailable. Request the associated BSSID's station directly, as
`iw link` does, and parse it with native.ParseStationInfo.
2026-09-25 19:59:18 -04:00
henrygd 24792aa24f wifi: omit empty info snapshot and tidy up
- Info.WiFi uses json "wf" with omitempty so systems without Wi-Fi no
  longer store/broadcast "wifi":null
- move osascript exec into wifi_darwin.go; drop unused commandRunner
- share strongest-connection logic between table cell and sorting
- trim agent/wifi README
2026-09-25 18:43:05 -04:00
henrygd 16e3fbadce store compact RSSI stats and skip real-time collection
Stats.WiFi is now map[string]int8 (json "wf") holding only available
RSSI
readings; SSID and unavailable signals stay in Info.WiFi. Averages are
rounded to whole dBm.

Wi-Fi is collected only on the default 60s interval; real-time requests
reuse the last snapshot to avoid spawning osascript / dumping the BSS
cache every second.
2026-09-25 18:02:34 -04:00
Vito CappelloandGitHub 86ab0fae8b feat: monitor connected Wi-Fi signal per interface (#2367) 2026-09-25 17:43:57 -04:00
henrygd 7bea20e3b6 refactor(agent): remove unused FsStats.Time
The disk I/O seed now reads from diskBaseline, so nothing reads
FsStats.Time anymore.
2026-09-25 13:50:19 -04:00
Ludwig J. MarxandGitHub 433b83800f fix(agent): measure first disk I/O sample of an interval from the full baseline (#2420) 2026-09-25 13:38:04 -04:00
henrygd 3dfe062ee4 fix(agent): promote existing entry when root key is already registered
When the root drive is also listed in EXTRA_FILESYSTEMS, its key is
taken before addPartitionRootFs runs. Returning false there sent the
agent to addLastResortRootFs, which picks the most active device and
could register a different drive as root, overwriting that drive's
extra entry. addPartitionRootFs has already resolved the root device,
so promote the existing entry to root instead.
2026-09-25 13:24:11 -04:00
henrygd 3fb97b800c fix(agent): fall back to last-resort root when root key is taken
addPartitionRootFs reported success even when addFsStat skipped the
registration because the I/O key was already in use, e.g. when the root
drive is also listed in EXTRA_FILESYSTEMS. hasRoot was then set without
any root filesystem, and the last-resort fallback never ran. addFsStat
now reports whether it registered the filesystem and addPartitionRootFs
propagates that.

Also uppercase the drive letter in windowsVolumeName so "c:" and "C:"
normalize to the same key.
2026-09-25 13:15:14 -04:00
yi111andGitHub d708def38f fix(agent): keep Windows volume names intact when matching I/O devices (#2419)
filepath.Base is platform-dependent for a bare volume name: on Windows it
strips the "C:" specifier and returns "\", so every drive letter
normalizes to the same key. findIoDevice's exact match then returns
whichever disk.IOCounters entry the map yielded first, which registers the
root filesystem under a random drive. With EXTRA_FILESYSTEMS=D:,P: the
root disk disappears from the hub, and without it the root can be
registered under another drive's I/O device.

Normalize a bare volume specifier before taking a path base, and stop
taking a path base of the device in addPartitionRootFs, where it mangled
the value before findIoDevice could see it. registerFilesystemStats
already avoided this by only taking a base when the agent is not on
Windows.

Fixes #2417
2026-09-25 13:09:11 -04:00
henrygd f50fb4f8e5 fix(agent): fix pacman update check under systemd sandbox
- store checkupdates' private DB in the agent data dir, since
  ProtectSystem=strict makes /tmp read-only
- sync the private DB every 12h and use `checkupdates -n` in between,
  forcing a sync when the DB is missing so -n never reports a false 0
- set WaitDelay so a timed-out command can't hang on child processes
2026-09-25 12:21:15 -04:00
Anand HegdeandGitHub c25408651f feat: show number of pending package updates (#2357) 2026-09-25 12:13:37 -04:00
Sven van GinkelandGitHub f7528a0208 feat: Add option to define which DNS server a DNS monitor queries (#2389) 2026-09-24 19:01:10 -04:00
Ludwig J. MarxandGitHub b5ef015451 fix(agent): handle 32-bit wrap of disk I/O time counters (#2407) 2026-09-24 17:39:53 -04:00
Miłosz KolberandGitHub 6141b15f03 fix(agent): SKIP_GPU excludes GPU hwmon from temperatures and fans (#2313) 2026-09-24 13:59:52 -04:00
a99fe5e997 feat: add TLS certificate expiry check to HTTPS network monitors (#2401)
Co-authored-by: henrygd <hank@henrygd.me>
2026-09-23 17:07:29 -04:00