OxiPulse: Host metrics to any OTLP backend
A small Rust agent that collects CPU, memory, disk, network, load and uptime from your servers and pushes them over OTLP/gRPC to your own collector, Prometheus/Grafana stack or any OpenTelemetry vendor. No account needed.
OxiPulse 0.3.14 at the default 30 s interval, 5 minutes of steady state on a GitHub Actions Ubuntu 24.04 runner: 11.4 MB RSS (3.5 MB private), against 24 MB for node_exporter and 204 MB for the OpenTelemetry Collector with hostmetrics in the same run. On Windows 11: 15.5 MB private memory, 0.07 % of one core. Method and script
system_cpu_utilization_ratio{host_name="web-01"} 0.1029
system_memory_usage_bytes{host_name="web-01",state="used"} 2.33e+10
system_filesystem_usage_bytes{host_name="web-01",device="/dev/sda1",state="used"} 4.60e+10
system_network_io_bytes_total{host_name="web-01",device="eth0",direction="receive"} 8.39e+09
system_cpu_load_average_1m{host_name="web-01"} 0.14
system_uptime_seconds{host_name="web-01"} 350986What it does
One job: get host metrics from your servers into the OpenTelemetry backend you already use.
Speaks OpenTelemetry
Pushes standard OTLP over gRPC. Point it at an OpenTelemetry Collector, Grafana Alloy, SigNoz, OpenObserve, Uptrace, VictoriaMetrics or any OTLP vendor. An optional Bearer token covers backends that need auth.
Survives outages
When the backend is unreachable it keeps every export, up to 72 h at the default 30 s interval, and sends them in order with their original timestamps when the connection comes back. No gaps in your graphs.
Updates itself, if you want
Checks GitHub Releases once a day and restarts through systemd or the Windows service manager. Set auto_update = false to pin the version.
Private by default
With your own backend it connects only to your endpoint, GitHub Releases (unless self-update is off) and a latency target you can change. Every outbound connection is listed in SECURITY.md.
Four steps, one binary
The whole agent is about a thousand lines of Rust. Read it on GitHub.
Collect
Every 30 s by default, reads CPU, memory, swap, disk, network, load and uptime from the OS through the sysinfo crate (/proc and /sys on Linux).
Buffer
Keeps snapshots in an in-memory ring buffer while the backend is unreachable, with exponential backoff between retries.
Export
Sends OTLP metrics over gRPC with host attributes (host.name, OS, kernel, CPU model). TLS for https endpoints, optional Bearer token.
Update
Optionally checks GitHub Releases once a day and restarts through the service manager. Off with auto_update = false.
How it compares
OxiPulse does less than the established tools, on purpose. Pick it when core host metrics over OTLP are all you need.
| Capability | OxiPulse | node_exporter | OpenTelemetry Collector |
|---|---|---|---|
| How metrics move | Push over OTLP/gRPC | Pull (Prometheus scrapes it) | Push or pull, many protocols |
| Memory on Linux (RSS) | 11 MB | 24 MB | 204 MB (hostmetrics receiver) |
| CPU at a 30 s interval | 0.01 % of one core | 0.04 % | 0.06 % |
| Linux x86_64 download | 4.0 MB | 12.2 MB (v1.12.1) | 37.3 MB (otelcol v0.162.0) |
| Metric coverage | Core host set (CPU, memory, swap, disk, network, load, uptime) | Very broad, dozens of collectors | Very broad, plus logs and traces |
| Buffer while backend is down | Built in (72 h default) | Not applicable (pull) | Yes, with sending queue / storage config |
| Self-update | Optional, daily | No | No |
| Configuration | One TOML file, only endpoint required | Flags | YAML pipelines |