Metrics and dashboards#
domyn-swarm can run a Prometheus instance next to the load balancer, scrape every vLLM replica, and give you a dashboard over the result.
This page covers tokens per second, queue depth, and GPU utilization. For health failures, see Monitoring and troubleshooting.
Monitoring is off by default and supports only Slurm. It uses sidecars on the load-balancer node, which the Lepton backend does not have.
Turning it on#
backend:
type: slurm
endpoint:
monitoring:
enabled: true
prometheus_image: /path/to/prometheus.sif
nginx_exporter_image: /path/to/nginx-prometheus-exporter.sif
retention: 12h
enabled is the master switch. When it is off, the load balancer ignores all
other monitoring fields.
Container mode runs Prometheus and nginx-prometheus-exporter as two sidecars.
The exporter converts the Nginx status page into metrics. To use host binaries
instead of containers:
monitoring:
enabled: true
mode: binary
prometheus_binary: /path/to/prometheus
nginx_exporter_binary: /path/to/nginx-prometheus-exporter
Both binaries default to being looked up on PATH by name, so if they are
already installed cluster-wide, mode: binary alone is enough.
What gets scraped#
Job |
Target |
Source |
|---|---|---|
|
every replica’s |
discovered from a file the supervisor keeps current |
|
|
static |
|
each node’s GPU exporter |
only with |
|
|
only with |
|
each node’s Ray metrics port |
only with |
Slurm determines each replica host and port after placement. Each replica writes
a replica-<id>.head file in the swarm serving directory. The load-balancer
supervisor uses these files for Nginx upstreams and Prometheus targets. A new
replica becomes a scrape target without manual configuration.
Every series is labeled swarm with the swarm’s name, from Prometheus’s
external_labels.
Reaching it#
Prometheus is served through the load balancer at route_prefix on the same
endpoint URL as the model:
http://<endpoint>/prometheus
The port field defaults to 9090 and controls the Prometheus listener on the
load-balancer node. Clients connect through the proxy instead of this port.
Warning
CAUTION: Keep /prometheus inside the cluster. The route has no authentication,
so any endpoint client can read metrics from every replica.
The database is local to the load-balancer node and ends with its job.
retention defaults to 12h and limits only the current run. To keep metrics
after the swarm stops, use an external Prometheus server to federate the route.
The route uses the Prometheus HTTP API and works with any compatible viewer. See Viewing the metrics.
Viewing the metrics#
The service uses the standard Prometheus API. Any compatible client can read it. You can use Grafana or the terminal client.
Your own Grafana#
Add the swarm’s /prometheus URL as a Prometheus data source in an existing
Grafana and build or import whatever dashboards you like. The dashboards
domyn-swarm bundles are ordinary Grafana JSON, so you can import them directly:
Dashboard |
Package path |
|---|---|
vLLM and Nginx |
|
GPU, nvidia_smi vocabulary |
|
GPU, DCGM vocabulary |
|
Ray panels, appended to another dashboard |
|
Use this option when Grafana already runs in the cluster or when dashboards must outlive a swarm. The endpoint is available only inside the cluster. Federate metrics that must persist after the load-balancer job ends.
In the terminal#
domyn-swarm monitor my-swarm-name
This command resolves the Prometheus URL from the swarm state. It passes the URL and bundled vLLM dashboard to grafatui, a terminal interface for Prometheus. The command replaces the current process with grafatui.
grafatui is a separate project and is not installed with domyn-swarm. Its
installation guide
documents brew, install.sh, and cargo methods.
If grafatui is not on PATH, the command exits with status 127 and prints the
Prometheus URL. You can use this URL with Grafana.
The command also uses these exit codes:
Exit |
Meaning |
|---|---|
|
Monitoring is not enabled. Enable it and deploy the swarm again. |
|
|
|
|
Exit 1 requires a new deployment because the load-balancer job starts monitoring services during submission.
grafatui flags#
domyn-swarm monitor my-swarm --range 1h --step 15s
domyn-swarm monitor my-swarm -d ./my-dashboard.json
domyn-swarm monitor my-swarm --prometheus-url http://other-host:9090
domyn-swarm monitor my-swarm --var replicas=8
--range and --step pass straight through to grafatui. --prometheus-url
overrides the resolved URL, which is how you point at a swarm’s Prometheus from
outside the cluster or through a tunnel.
Dashboard variables#
monitor fills two variables in the bundled dashboard. vllm_job contains the
Prometheus job name, and replicas drives the Replicas down panel. Use repeated
--var KEY=VALUE arguments to override or add variables.
monitor does not fill these variables:
swarm: Each swarm has a separate Prometheus server, so a swarm filter is redundant.model: vLLM uses the full resolved model path as the metric label. Pass the label with--varif the dashboard uses it.
GPU metrics#
Per-node GPU metrics come from a separate exporter, enabled underneath
monitoring:
backend:
endpoint:
monitoring:
enabled: true
gpu_exporter:
enabled: true
kind: nvidia_smi
image: /shared/images/gpu_exporter_nvidia_smi.sif
Then:
domyn-swarm monitor my-swarm-name --gpu
The command loads the bundled dashboard that matches the configured kind.
Choosing a kind#
nvidia_smi(the default)A small static binary that shells out to
nvidia-smi. Portable, runs unprivileged anywherenvidia-smiexists.dcgmNVIDIA’s Data Center GPU Manager, emitting the standard
DCGM_FI_*series. It uses the 3.x line because 4.x aborts when run unprivileged. Driver-to-DCGM compatibility varies by site. Use this exporter when you need the standard metric names and your driver supports it.
Both exporters run without privileges inside the job GPU cgroup. They report
memory, utilization, power, temperature, clocks, and throttle reasons. Profiling
counters (DCGM_FI_PROF_*) require root and are not available.
Images and modes#
Build from the recipes shipped in images/:
sudo singularity build gpu_exporter_nvidia_smi.sif images/gpu_exporter_nvidia_smi.def
sudo singularity build gpu_exporter_dcgm.sif images/gpu_exporter_dcgm.def
The exporter follows monitoring.mode, and the two kinds do not support the same
modes. The configuration rejects invalid combinations at load time instead of
failing on the node:
nvidia_smiwithmode: containerneeds an explicitgpu_exporter.image. There is no default image. Omitting it raises nvidia_smi container mode needs an explicit gpu_exporter.image.dcgmonly works withmode: container, because it is launched throughsingularity exec. Asking formode: binaryraises dcgm exporter is only supported in container mode.dcgmwithmode: containerand no image falls back to a public NVIDIA image.
mode: binary therefore means kind: nvidia_smi, with binary defaulting to
nvidia_gpu_exporter on PATH.
Which replica owns which GPU#
An exporter runs once per node, but a node can host several replicas. Each replica records the UUIDs of its GPUs. The supervisor renders these UUIDs as a join metric:
dswarm_gpu_owner{uuid="GPU-...", UUID="GPU-...", replica="0"} 1
The ownership metric includes both label spellings. The nvidia_smi exporter
uses uuid, while DCGM uses UUID. One series can join data from
either exporter.
Prometheus scrapes this from /gpu_ownership on the endpoint, served by the same
Nginx that fronts the model.
Ray metrics#
For multi-node replicas, Prometheus scrapes Ray ray_* metrics from every node.
This needs no configuration: ray_metrics.enabled resolves itself to true when
monitoring is on and the deployment requires Ray, and to false otherwise.
Set it explicitly to false to opt out, or true to force it on. An explicit
value is always respected, and after validation the field is never left unset.
monitoring:
enabled: true
ray_metrics:
enabled: false # scrape vLLM but not Ray
When Ray metrics are active, domyn-swarm monitor adds Ray panels to the bundled
vLLM dashboard. Passing --dashboard disables this addition and uses the given
dashboard without changes.
ray_metrics.port (default 8090) is Ray’s --metrics-export-port. It is fixed
rather than ephemeral so that the per-node files Prometheus discovers have stable
contents.
What monitoring does not do#
Monitoring does not replace health checks. Prometheus reports performance, while the watchdog reports health. See Watchdog and collector.
Monitoring data does not persist after the load-balancer job unless an external service federates it.
Monitoring does not deploy Alertmanager or alert rules.
The metrics do not require
domyn-swarm monitor. That command provides a terminal viewer for the Prometheus data.
Full field reference#
Every field, with types and defaults, is generated from the models:
MonitoringConfig, GpuExporterConfig and RayMetricsConfig in
Configuration.