e4b0d9b9f6
Lightweight: - GPU collection moves to a dedicated worker thread that owns the gfxinfo handle for the process lifetime. gfxinfo's active_gpu() runs a full NVML init/teardown (~20ms, blocking) and we were paying it on the async runtime for every collect — measured at ~80% of the agent's entire active CPU on a GPU machine. The handle holds Rc<Nvml> (not Send), so a thread + mpsc/oneshot channel pair confines it; a zero-total-VRAM reply is treated as a dead session (driver reload) and re-probed. - journalctl now runs via tokio::process instead of blocking one of the two runtime workers for the duration of the subprocess. - TtlCell (state.rs) replaces the four hand-rolled static TTL caches; a cached negative result now counts as fresh, so hosts with no matching temp sensor or GPU stop rescanning every request. Single lock+clone on the GPU cache hit path (was two). Correctness: - Process/child CPU times are now microseconds as documented; they were milliseconds, rendering 1000x too small next to (correct) thread times. - Non-Linux per-process CPU%% clamps AFTER dividing by core count; a 4-cores-busy process on an 8-core box reported 12.5% instead of 50%. - Journal timestamps are real RFC 3339 UTC plus an additive timestamp_us field (sorting is now numeric); the old strings were Debug-formatted SystemTime mangled by string replace. - Partition detection uses /sys/block on Linux: whole-disk filesystems on names like nvme0n1 or zram1 are no longer misclassified as partitions. One shared parent_disk_name() replaces two inline copies. - New sampled_at_ms on the metrics payload (additive) records when the snapshot was actually collected, so clients can compute exact rates across the agent's TTL cache. Security/robustness: - key.pem is created 0600 (was umask default 0644, world-readable) and pre-1.51 keys are tightened on startup. - Per-PID detail/journal caches now evict (60s max age, 64 entries max); they previously grew without bound under PID-walking clients. - The two per-PID ws handlers collapse into one generic helper. - /proc/<pid>/stat parsing unified in one comm-safe module. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
68 lines
2.5 KiB
TOML
68 lines
2.5 KiB
TOML
[package]
|
|
name = "socktop_agent"
|
|
version = "1.50.2"
|
|
authors = ["Jason Witty <jasonpwitty+socktop@proton.me>"]
|
|
description = "Socktop agent daemon. Serves host metrics over WebSocket."
|
|
edition = "2024"
|
|
license = "MIT"
|
|
readme = "README.md"
|
|
homepage = "https://github.com/jasonwitty/socktop"
|
|
repository = "https://github.com/jasonwitty/socktop"
|
|
|
|
[dependencies]
|
|
# Tokio: minimal features instead of "full" to reduce binary size.
|
|
# rt-multi-thread (runtime), net (WebSocket), sync (Mutex/oneshot),
|
|
# macros (#[tokio::test]), process (async journalctl).
|
|
tokio = { version = "1", features = ["rt-multi-thread", "net", "sync", "macros", "process"] }
|
|
axum = { version = "0.7", features = ["ws", "macros"] }
|
|
sysinfo = { version = "0.37", features = ["network", "disk", "component"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
flate2 = { version = "1", default-features = false, features = ["rust_backend"] }
|
|
futures-util = "0.3.31"
|
|
tracing = { version = "0.1", optional = true }
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"], optional = true }
|
|
gfxinfo = { version = "0.1.2", optional = true }
|
|
once_cell = "1.19"
|
|
axum-server = { version = "0.7", features = ["tls-rustls"] }
|
|
rustls = { version = "0.23", features = ["aws-lc-rs"] }
|
|
rustls-pemfile = "2.1"
|
|
rcgen = "0.13"
|
|
anyhow = "1"
|
|
hostname = "0.3"
|
|
prost = { workspace = true }
|
|
time = { version = "0.3", default-features = false, features = ["formatting", "macros", "parsing" ] }
|
|
|
|
[features]
|
|
default = ["gpu"]
|
|
gpu = ["gfxinfo"]
|
|
logging = ["tracing", "tracing-subscriber"]
|
|
|
|
[build-dependencies]
|
|
prost-build = "0.13"
|
|
tonic-build = { version = "0.12", default-features = false, optional = true }
|
|
protoc-bin-vendored = "3"
|
|
|
|
[dev-dependencies]
|
|
assert_cmd = "2.0"
|
|
tempfile = "3.10"
|
|
tokio-tungstenite = "0.21"
|
|
|
|
[package.metadata.deb]
|
|
maintainer = "Jason Witty <jasonpwitty+socktop@proton.me>"
|
|
copyright = "2024, Jason Witty <jasonpwitty+socktop@proton.me>"
|
|
license-file = ["../LICENSE", "4"]
|
|
extended-description = """\
|
|
socktop_agent is the daemon component that runs on remote hosts to collect \
|
|
and serve system metrics over WebSocket. It gathers CPU, memory, disk, network, \
|
|
GPU, and process information that can be monitored remotely by the socktop TUI client."""
|
|
depends = "$auto"
|
|
section = "admin"
|
|
priority = "optional"
|
|
assets = [
|
|
["target/release/socktop_agent", "usr/bin/", "755"],
|
|
["../README.md", "usr/share/doc/socktop_agent/", "644"],
|
|
]
|
|
maintainer-scripts = "debian/"
|
|
systemd-units = { unit-name = "socktop-agent", unit-scripts = ".", enable = false }
|