Telemetry and Observability#
DPS publishes operational metrics in Prometheus text format for power, topology, allocation, device, and service state. Use the metrics to observe the control plane, investigate power behavior, and build dashboards and alerts.
This page covers the DPS metrics service and its metric reference. The DPS Power Steering Controller publishes a separate endpoint when it is deployed. Refer to DPS Sample Dashboards for ready-to-import dashboard examples.
Configure and Access Metrics#
Use Prometheus Monitoring to expose and scrape the
DPS metrics service. That guide owns Helm ServiceMonitor configuration,
external Prometheus access, and metrics authentication.
The chart exposes /metrics through the dedicated
<release>-server-metrics Service on port 9090 (service port name
dps-metrics). The direct listener uses HTTP and is separate from the HTTP API
Service. Inspect a release named dps locally:
kubectl -n dps port-forward service/dps-server-metrics 9090:9090
curl -s http://127.0.0.1:9090/metrics
Use the generated Service name when the Helm release has a different name. If
metrics authentication is enabled, use an OIDC Bearer token with the
dps:metrics:read scope as described in Prometheus Monitoring.
Metric labels can include operational identifiers such as hostnames, device IDs, and resource-group names. Restrict endpoint access to the monitoring identity.
Metric Conventions#
The reference lists the metric family names exposed by Prometheus. Counter
metric families end in _total, and histograms use _bucket, _sum, and
_count. For example, query redfish_request_duration_milliseconds_bucket
for a Redfish duration histogram. Dots in OpenTelemetry attribute names
become underscores.
A series can be absent until its collector runs or its related operation occurs. Do not treat absent device or node telemetry as zero; it can indicate an inactive topology, a disabled collector, or a missing source reading.
Zapp-Backed Telemetry and Excursion Detection#
When Zapp-backed telemetry is enabled and configured, DPS receives real-time power readings from Zapp for excursion detection and automated mitigation. Without Zapp-backed telemetry, DPS continues to operate, but features that require live power readings do not receive them.
Note
For setup details, refer to Configure Zapp Telemetry.
Zapp provides a sensor manifest. DPS binds manifest sensor IDs to the configured host set, subscribes to matching sensors, aggregates readings through the topology tree, and compares each device’s power to its configured operational limit.
DPS keeps Zapp-backed telemetry current as hosts and streams change. It resubscribes when the configured host set changes.
DPS Metric Reference#
Most metric families appear only after DPS records related data.
Exporter Metadata#
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Gauge |
None |
|
Shows the service and OpenTelemetry SDK that produced the metrics. The value is |
gRPC API#
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Counter |
None |
|
Shows the request rate and result for each API and method. Source attributes appear only when DPS can determine the request source. |
|
Histogram |
|
|
Shows request latency for each API, method, and result. Source attributes appear only when DPS can determine the request source. |
Topology and Resource Groups#
API metrics appear after DPS runs an operation. The periodic
topology_service_* metrics start after topology activation.
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Histogram |
|
|
Shows how long each topology takes to activate. |
|
Histogram |
|
|
Shows how long each topology takes to deactivate. |
|
Gauge |
None |
|
For an entity with a Redfish hostname, records |
|
Histogram |
|
|
Shows time spent preparing and validating topology activation before device work starts. |
|
Histogram |
|
|
Shows time spent preparing topology deactivation before device work starts. |
|
Histogram |
|
|
Shows the duration of resource-group work identified by |
|
Histogram |
|
|
Shows the total resource-group deactivation time, including device responses and power give-back. |
|
Histogram |
|
|
Shows the total resource-group update time, including device requests and responses. |
|
Histogram |
|
|
Shows how long each resource group takes to create. |
|
Histogram |
|
|
Shows how long DPS takes to add devices to each resource group. |
|
Histogram |
|
|
Shows how long each resource group takes to activate. |
|
Histogram |
|
|
Shows how long each resource-group update takes. |
|
Histogram |
|
|
Shows how long DPS takes to remove devices from each resource group. |
|
Histogram |
|
|
Shows how long each resource group takes to delete. |
|
Gauge |
None |
|
Records a resource group when it is created ( |
|
Gauge |
None |
|
For an inactive resource group, records |
|
Gauge |
None |
|
Shows the number of configured devices of each type. |
|
Gauge |
None |
None |
Shows the number of active devices. |
|
Gauge |
None |
|
Shows whether each topology is active. A value of |
|
Gauge |
None |
None |
Shows the number of active resource groups. |
|
Gauge |
None |
None |
Shows how many active resource groups have Dynamic Power Management enabled. |
|
Gauge |
None |
None |
Shows how many active resource groups have Power Reservation Steering enabled. |
|
Gauge |
None |
None |
Shows the total number of device memberships across resource groups. |
|
Gauge |
None |
None |
Shows the number of policies available to the topology service. |
|
Gauge |
|
None |
Shows how much power is allocated. Compare it with total capacity to find available power. |
|
Gauge |
|
None |
Shows the total power capacity available for allocation. |
|
Gauge |
|
|
Shows the power capacity of each device. |
|
Gauge |
|
|
Shows the allocated power load of each device. |
|
Gauge |
None |
|
Shows each device’s identity, activity, optional power constraint, and power factor. The value is |
|
Gauge |
|
|
Shows power capacity for each device and GPU when detailed data is available. |
|
Gauge |
|
|
Without |
|
Gauge |
None |
|
Shows policy and power-management settings for resource groups tracked by the topology service. The value is |
|
Gauge |
None |
|
Shows each active resource group’s priority. Lower values have higher importance. |
|
Gauge |
None |
|
Shows the desired total capacity and allocated power. The value is |
|
Gauge |
None |
|
Shows the current total capacity and allocated power. The value is |
|
Gauge |
None |
None |
Shows the number of queued topology tasks. |
|
Gauge |
|
None |
Shows how long the oldest queued topology task has waited. |
Reconciler and Control-Loop Phases#
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Gauge |
None |
|
Records a reconciler’s queue size by device type. Reconcilers of the same type share one series. |
|
Gauge |
None |
|
Records a reconciler’s state by device type. The current state is |
|
Counter |
None |
|
Counts errors by type for each device type. |
|
Histogram |
|
|
Shows how long each type of device request takes, including response waits and retries. |
|
Counter |
None |
|
Counts queued requests, sent requests, responses, retries, timeouts, removals, merges, and ignored responses. Ignored GPU policy responses use |
|
Histogram |
|
|
Shows device-controller request phase duration and result. |
|
Histogram |
|
|
Shows the total power give-back time and the result. The |
Device Power and NvGrid#
These metrics appear only when the node or NvGrid collector is enabled and data is available. Component labels depend on the data that each component reports. DPS removes component series for a node that stops returning metrics instead of preserving a stale sample.
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Gauge |
|
|
Shows measured power for each device and its location in the topology. |
|
Gauge |
|
|
Shows how much power each node component uses. |
|
Gauge |
None |
|
Shows the cumulative energy reported by each node component and the reported unit. |
|
Gauge |
|
|
Shows the temperature of each component. |
|
Gauge |
|
|
Shows the set, minimum, and maximum power limits for each component. |
|
Gauge |
|
|
Shows load targets from the previous 24 hours through the next seven days. |
|
Gauge |
|
|
Shows the current scheduled or default load target for each feed. |
|
Gauge |
|
|
Shows the calculated load for each feed. Compare it with the current target. |
|
Gauge |
None |
|
Shows whether a power event is in progress for each feed. A value of |
Redfish and Policy#
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Histogram |
|
|
Shows request time by normalized Redfish route, HTTP status group, retry result, and error type. |
|
Gauge |
None |
|
Shows the current number of Redfish connections for each BMC, connection pool, and direct or proxy target. |
|
Gauge |
None |
|
Shows the highest observed open connection count. The value resets when DPS clears metrics for the target. |
|
Histogram |
|
|
Shows how long DPS takes to apply a power limit and whether the request succeeds, grouped by node and device count. |
|
Histogram |
|
|
Shows how long DPS takes to get default power settings, grouped by node and device count. |
|
Histogram |
|
|
Shows how long DPS takes to get environment readings, grouped by node and device count. |
|
Histogram |
|
|
Shows how long DPS takes to get chassis readings from each node. |
|
Histogram |
|
|
Shows how long DPS takes to apply policies, grouped by node, policy count, and minimum and maximum domain capability. |
|
Histogram |
|
|
Shows how long DPS takes to remove policies from each target domain. |
|
Histogram |
|
|
Shows how long DPS takes to create a policy domain, grouped by node and policy count. |
|
Histogram |
|
|
Shows how long DPS takes to update a policy domain, grouped by node and policy count. |
Authentication#
These metrics never include usernames, tokens, or client addresses.
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Counter |
None |
|
Counts failed authentication attempts by reason. |
|
Counter |
None |
|
Counts requests rejected by the IP or username rate limiter. |
|
Histogram |
|
|
Shows the delays added by the IP and username rate limiters. |
Database Pool#
These metrics appear when the database collector is enabled and a database pool is available.
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Gauge |
None |
None |
Shows the total number of open database connections. |
|
Gauge |
None |
None |
Shows the number of database connections currently in use. |
|
Gauge |
None |
None |
Shows the number of database connections ready for use. |
|
Gauge |
None |
None |
Shows the number of database connections being opened. |
|
Gauge |
None |
None |
Shows the maximum number of database connections allowed. |
|
Counter |
None |
None |
Counts connection requests that found no idle database connection. |
BMC Health#
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Counter |
|
|
Counts completed, failed, and canceled health checks. |
|
Histogram |
|
|
Shows how long each health check takes, grouped by result. |
|
Counter |
|
|
Counts health-check issues by code and severity. |
|
Histogram |
|
|
Shows how long each phase of a node probe takes. |
Tracing#
Metric family |
Type |
Unit |
Attributes |
Usage and availability |
|---|---|---|---|---|
|
Counter |
None |
|
Counts OpenTelemetry trace export failures by error type. |
Common PromQL Queries#
Adapt label values and time ranges to the deployment. These are investigation
queries, not alert thresholds. In the Prometheus expression browser, replace
$__rate_interval with a fixed range such as 5m.
BMC Request Latency#
The redfish_request_duration_milliseconds histogram records the end-to-end
duration of DPS requests to BMCs. Its _sum and _count series calculate the
mean latency in milliseconds:
sum(rate(redfish_request_duration_milliseconds_sum[$__rate_interval]))
/
sum(rate(redfish_request_duration_milliseconds_count[$__rate_interval]))
Use histogram buckets to calculate the 95th-percentile latency across the selected BMC requests:
histogram_quantile(
0.95,
sum by (le) (
rate(redfish_request_duration_milliseconds_bucket[$__rate_interval])
)
)
To keep a BMC or request route in the result, filter on labels that are present
in the local /metrics output and retain those labels in the aggregation. For
example, add the BMC and route labels to sum by (..., le) when calculating a
per-BMC or per-route percentile.
Datacenter Topology Power Utilization#
To chart aggregate observed power in watts by topology and PowerDomain:
sum by (topology_name, power_domain) (device_total_power_watts)
Calculate observed utilization of a selected PowerDomain as its aggregated
power divided by physical capacity. Replace my-topology and PDU-A with the
topology and PowerDomain to investigate.
100 *
sum(device_total_power_watts{
topology_name="my-topology",
device_type="PowerDomain",
device_id="PDU-A"
})
/
sum(topology_service_device_power_capacity_watts{
device_type="PowerDomain",
device_id="PDU-A"
})
The result is a percentage of physical capacity. Query the PowerDomain rather than summing its parent and child device types; topology aggregation would otherwise count the same power more than once.
Provisioned-Load Coverage and Power Pressure#
Provisioned-load coverage shows how much of the PowerDomain’s physical capacity is currently provisioned:
100 *
sum(topology_service_device_instance_power_load_watts{
device_type="PowerDomain",
device_id="PDU-A"
})
/
sum(topology_service_device_power_capacity_watts{
device_type="PowerDomain",
device_id="PDU-A"
})
Observed-versus-provisioned pressure shows whether current measured power is
above or below the provisioned load. A value above 100 means observed power
exceeds the provisioned load.
100 *
sum(device_total_power_watts{
topology_name="my-topology",
device_type="PowerDomain",
device_id="PDU-A"
})
/
sum(topology_service_device_instance_power_load_watts{
device_type="PowerDomain",
device_id="PDU-A"
})
Reconciler Errors#
Count reconciler errors over the last 15 minutes by error kind:
sum by (kind) (increase(reconciler_errors_total[15m]))
For a point-in-time BMC view, use
dpsctl check metrics --nodes <node-name>. Its --effective option reads
enforced limits directly from the BMC and adds one Redfish GET per device.