Observability
This page covers the day-to-day observability actions for a running Dynamo deployment: turning each signal on or off per deployment, loading the Grafana dashboards, and querying the results. It assumes the monitoring stack (kube-prometheus-stack, DCGM exporter, and the Loki + Alloy logging stack) is already installed — see Observability in the Installation section for those one-time steps.
For what each metric, label, and variable means, see the reference: Metrics Catalog, Metric Labels, Environment Variables, and Operator Metrics.
Enable signals per deployment
Metrics
Metrics are on by default. The operator adds a PodMonitor and labels every pod nvidia.com/metrics-enabled: "true", so Prometheus discovers and scrapes frontend and worker /metrics endpoints with no deployment-level field required. Both components expose OpenMetrics-format metrics: the frontend on its HTTP port, workers on their system port.
To opt a deployment out of metrics collection, set the nvidia.com/enable-metrics: "false" annotation:
NIXL telemetry
To add NIXL transfer metrics (populated only during disaggregated serving or multimodal embedding transfers), set NIXL_TELEMETRY_ENABLE: "y" on the worker component. NIXL exposes its metrics on a separate port (NIXL_TELEMETRY_PROMETHEUS_PORT, default 19090). See Environment Variables for the full NIXL variable set.
Logging
To emit structured JSONL logs (required for the Loki logging stack), set the logging variables on the DGD. Graph-level spec.envs applies to every component; a per-component env entry overrides it. See Environment Variables for the full set and their meanings.
Traces and logs export
To export traces to Tempo and logs to Loki via OTLP, set the OpenTelemetry variables on the DGD. OTEL_EXPORT_ENABLED is the master switch — without it, traces and logs never leave the process. See Environment Variables.
Use signal-specific endpoints only when traces and logs have different collectors. The logs endpoint does not fall back to the traces endpoint. For HTTP/protobuf, set OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf; Dynamo appends signal paths only to the generic endpoint.
To export chat payload records through the same collector, also set DYN_REQUEST_TRACE_RECORDS=request_payload and DYN_REQUEST_TRACE_SINKS=otel. See Request Trace Reference.
Forward Pass Metrics Trace Files
Forward Pass Metrics (FPM) tracing records backend scheduler telemetry to rotating gzip JSONL files. To retain the files across pod replacement, mount a persistent volume on each worker and set the output prefix inside that mount:
Replace VllmWorker with each worker service that should write a trace. The PVC must already exist
when create: false. Dynamo writes a separate producer-specific file sequence for every worker, so
size retention for the number of replicas and old producer IDs that can remain on the volume.
Graceful shutdown flushes accepted records. SIGKILL, node loss, queue pressure, and upstream
transport loss can still create gaps. Treat the files as observability data, not as a durable event
plane or replay input. See
Forward Pass Metrics Trace Reference
for topology support, configuration, schema, and rotation behavior.
View dashboards
Load the dashboards
Load each dashboard by applying its ConfigMap. Each is labeled grafana_dashboard: "1", so the Grafana sidecar (included in kube-prometheus-stack) discovers and imports it automatically.
The application dashboard includes panels for frontend request rates, time to first token, inter-token latency, request duration, input/output sequence lengths, GPU utilization (via DCGM), node CPU and system load, and per-pod CPU and memory.
Open Grafana and Prometheus
Visit http://localhost:3000 and find the Dynamo dashboards under Dashboards. To query Prometheus directly:
Visit http://localhost:9090 and use the queries below.
To view logs, open Home > Dashboards > Dynamo Logs in Grafana. The dashboard filters by DynamoGraphDeployment, namespace, and component type (frontend, worker, and so on).
Useful queries
Application metrics
Derived signals
These cluster-wide totals combine per-stage frontend gauges into the signals operators most often want. dynamo_frontend_stage_requests has no model label, so these cannot be split by model; add by (pod) or by (instance) for per-pod visibility. See Stage values for what each stage covers.
Operator metrics
Operator metrics use the dynamo_operator_* prefix and are scraped via a ServiceMonitor (created by the Helm chart), separate from the application PodMonitor. See Operator Metrics for the full catalog and label sets.
Troubleshooting
Metrics not appearing in Prometheus
-
Check the monitor exists —
PodMonitorfor application metrics,ServiceMonitorfor operator metrics: -
Confirm Prometheus discovered the target: in the Prometheus UI, go to Status → Targets and look for the Dynamo job in state
UP. -
Check the Prometheus selector configuration. The discovery of monitors outside the Prometheus release requires
podMonitorSelectorNilUsesHelmValues=false(and the equivalent for ServiceMonitors), set during kube-prometheus-stack installation:
Prometheus metric families are registered lazily: each label set is created the first time it fires, so a freshly-started process shows empty metric families until the first relevant request. An idle cluster does not mean scraping is broken.
Dashboard not appearing in Grafana
-
Confirm the ConfigMap was created and carries the discovery label:
-
Confirm the Grafana dashboard sidecar is watching for that label:
-
Restart Grafana to force a refresh: