Metrics#
Build with --features metrics to expose engine metrics over HTTP. Each
accepted public request counts once, including each alias of a merged owner.
The legacy READ/WRITE counters still count merged owners on the final route.
Physical attempts count each transport submission, including retries and
remote-staging CROSS children. A two-alias READ recovered from RDMA to TCP
records two successful public requests, one failed RDMA attempt and one
successful TCP attempt.
Configure the endpoint#
With the feature enabled, each engine defaults to 0.0.0.0:9100. Set
http_host to 127.0.0.1 for a loopback-only endpoint. Give engines on the
same host distinct ports. If the port is occupied, the engine keeps recording
and logging. metrics().http_port() on the enabled handle returns zero in
that case. Set enabled to false at construction to omit the listener,
periodic reporter and recording cells.
Key (under |
Default |
|---|---|
|
|
|
|
|
|
|
|
|
|
Use typed EngineConfig.metrics or the OrbiTE loader.
There are no per-field environment aliases or secondary metrics files. Unknown
fields and wrong types fail. The host accepts an IP literal or DNS hostname;
ports range from 1 to 65535 and the bounded HTTP pool has 1–64 threads.
The orbite_ namespace retains the recording types, labels and bucket boundaries.
{"metrics":{"http_host":"127.0.0.1","http_port":9101,"report_interval_seconds":0}}
curl -fsS http://127.0.0.1:9101/health
curl -fsS http://127.0.0.1:9101/metrics
curl -fsS http://127.0.0.1:9101/metrics/json
/metrics returns Prometheus text. /metrics/json aggregates label values.
Histogram JSON contains the count, sum and disjoint counts at the finite
boundaries. Prometheus uses cumulative buckets through +Inf. A sub-microsecond
sample can have a zero sum and still increments the count. /metrics/summary
returns the summary available via the log facade.
A successful 64-byte TCP READ contributes the following samples.
orbite_read_bytes_total{transport="tcp"} 64
orbite_transport_attempts_total{transport="tcp",operation="read"} 1
Transfer metrics#
Each entry with {read,write} denotes two separate families. Supported
transport values are tcp, hp_tcp, shm, rdma, nvlink, mnnvl, io_uring and gds. Failure
reasons are submit, poll, timeout and canceled.
Family |
Type |
Labels and meaning |
|---|---|---|
|
Counter |
|
|
Counter |
|
|
Counter |
|
|
Counter |
|
|
Counter |
|
|
Counter, gauge |
|
|
Counter |
|
|
Counter |
|
|
Counter |
|
|
Counter |
|
|
Counter |
Unlabelled. Abandoned batches entering quarantine. |
|
Gauge |
|
|
Histogram |
|
|
Histogram |
|
|
Histogram |
|
|
Histogram |
|
The removed FABRIC transport has no metric label or owner series.
io_uring uses the published memory without registering it with the provider. Host memory can also take a GDS or pinned NVLink path without creating a cuFile buffer registration or CUDA IPC export. Those operations contribute transfer metrics. The buffer gauge counts direct RDMA registrations, NVLink-exportable device ranges, successful CUDA GDS registrations and TCP-published bytes.
Histogram boundaries#
Each finite upper bound is inclusive.
Domain |
Upper bounds |
|---|---|
Logical and attempt latency (µs) |
100, 500, 1000, 5000, 10000, 50000, 100000, 500000, 1000000 |
Size (bytes) |
1024, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216, 67108864, 268435456, 1073741824 |
Deadline MLU (per mille) |
100, 250, 500, 750, 900, 1000, 1250, 1500, 2000, 5000 |
Stage latency (µs) |
10, 50, 100, 500, 1000, 5000, 10000, 50000, 100000, 500000 |
Runtime resource totals use an orbite_ prefix. The engine reports live
batches, requester workers and bytes. Configured owners also report queued
and dispatching owners and bytes, deadline drops, QoS inflight reservations,
active and reserved receiver credits, and RDMA rail errors, probes, recoveries
and open rails. The scrape carries no peer identity, raw addresses or keys.
OrbiTE owner series |
Type and unit |
|---|---|
|
Successful native CUDA MRs by registration route (counters), sampled from the existing RDMA owner; neither a live-MR gauge nor a retirement receipt |
|
Live smart-selection bytes (gauge) and lifetime assigned slice bytes (counter), including paused NICs |
|
Sender balances across retained bindings (gauges) |
|
Receiver sessions (live gauge and retired counter) |
|
Capacity committed to receiver-issued windows (gauges) |
|
Physical Pin owners and the subset with unconfirmed cleanup (gauges) |
TENT’s qos_metrics.cpp calculates goodput, Jain fairness and isolation
leakage from benchmark class samples. Those quantities need an experiment with
class timings, weights and isolated throughput and have no live exporter series.
For example, orbite_dispatching_owners and orbite_dispatching_bytes
show the live dispatch window. orbite_qos_inflight_requests and
orbite_receiver_credit_reserved_owners can distinguish a QoS charge from
a sender waiting on a receiver grant. orbite_queue_deadline_drops_total
counts rejected queue dispatches. orbite_rdma_open_rails is a gauge, while
orbite_rdma_rail_errors_total, orbite_rdma_rail_probes_total and
orbite_rdma_rail_recoveries_total are cumulative.
On an initialized handle, set_enabled(false) pauses new starts. A start
recorded before the toggle still closes its outcome, latency and gauge.
A start while paused adds neither half of a pair. Outcomes are success,
failed, timeout and canceled. An accepted but unexecuted suffix after
a failed predecessor counts as failed, unless its owner was canceled.
Rejected submissions leave both public and attempt starts untouched. Legacy
byte counters and registered-buffer gauges retain their original semantics.
Exporter health#
These families appear before the first transfer and remain visible while
sampling is paused. engine.metrics_status() also reads them on an engine
configured off at startup, without creating a listener or recorder.
Family |
Type |
Labels and meaning |
|---|---|---|
|
Gauge |
|
|
Gauges |
Sampling enabled and endpoint listening. |
|
Counter |
Failed server starts on this engine. |
|
Counters |
|
|
Gauge |
Unix seconds per format. Zero until the first successful serialization. |
A serialization error returns HTTP 500. The next successful scrape includes
the failure. /health reports HTTP liveness independently of serialization
and transport state.