Monitor your benchmarks (over ssh, or locally).
obmon is a single binary that assumes two things:
- You are running
omnibenchmark >= 0.6with telemetry support enabled. - If they run on a remote server, you can ssh into that machine.
From there, it will get the traces from your benchmark executor and help you browsing those traces (including logs) from the comfort of your own laptop. This means you don't need external infrastructure 24/7, but you need to be able to run docker (or podman) on your own machine.
Need to collaborate with coworkers? No problem! obmon also allows you to
share a trace of a particular run, so you can safely send the execution
traces to other devices. See docs/collaboration.md.
curl -fsSL https://raw.githubusercontent.com/omnibenchmark/obmon/main/install.sh | shSee INSTALL.md for other installation methods.
Start the dashboard (Aspire OTel UI at http://localhost:18888):
obmon dashboardob run --telemetry-output /path/to/telemetry.jsonl benchmark.yaml
In a separate terminal:
obmon stream /path/to/telemetry.jsonl
You run the benchmark on the server, writing telemetry to a known path:
ob run --telemetry-output /data/omnibenchmark/telemetry.jsonl benchmark.yaml
And then, from your local machine, with a server configured in ~/.ssh/config:
obmon stream myserver:/data/omnibenchmark/telemetry.jsonlThis will start the Aspire dashboard if not already running (see obmon dashboard), deploy the agent to the remote host if needed, and stream telemetry to http://localhost:18888.
Starts the Aspire OTel dashboard container if it is not already running, then exits.
obmon dashboard| Flag | Default | Description |
|---|---|---|
--otlp |
localhost:4317 |
OTLP gRPC address to wait on before returning |
Dashboard UI is available at http://localhost:18888 once running.
Streams telemetry.jsonl to the local Aspire dashboard via OTLP gRPC. For remote targets, opens an SSH tunnel and deploys obmon-agent to the remote host if not present. For local targets, tails the file directly — no SSH, no agent. Starts Aspire automatically if not running.
obmon stream [user@]host:path [flags] # remote
obmon stream <local-path> [flags] # localA target is treated as local when it is absolute (/foo), explicitly relative (./foo, ../foo, ~/foo), or contains no : separator. Otherwise it is parsed as scp-style [user@]host:path.
Examples:
# host alias from ~/.ssh/config
obmon stream myserver:/data/omnibenchmark/telemetry.jsonl
# explicit user and host
obmon stream alice@remote.example.com:/data/omnibenchmark/telemetry.jsonl
# with a non-default SSH key
obmon stream myserver:/data/omnibenchmark/telemetry.jsonl --identity ~/.ssh/id_ed25519
# local file (absolute or relative)
obmon stream /data/omnibenchmark/telemetry.jsonl
obmon stream ./telemetry.jsonluser, hostname, port, and identity file are resolved from ~/.ssh/config when not provided. Local runs are recorded in the cache under host local.
| Flag | Default | Description |
|---|---|---|
--identity |
~/.ssh/config |
Path to SSH private key |
--aspire |
localhost:4317 |
Local Aspire OTLP gRPC endpoint |
--agent-path |
~/.obmon/bin/obmon-agent |
Path to obmon-agent on remote |