v1/bmc_health.proto#
BMC health check service messages.
Defines requests and responses used by the deep BMC pre-requisite health check, which validates Redfish endpoint reachability, firmware inventory, power setting controls, IB/OOB drift, EDPp/WPPS state, and telemetry across cluster nodes.
Messages#
BMCHealthCheckHandle#
BMCHealthCheckHandle is returned immediately from StartBMCHealthCheck. The task continues running in the background on the server; callers poll GetBMCHealthCheckStatus and GetBMCHealthCheckReport using task_id to observe progress and retrieve the final report.
task_id is stable for the lifetime of the task in the server’s task manager. After the task completes it remains queryable for at most –zombie-lifetime (default 10m), after which a status or report lookup returns NotFound. A server restart drops all task state, so callers must re-run on restart.
Field |
Type |
Description |
|---|---|---|
task_id |
|
Unique task identifier; pass back to status / report RPCs. |
name |
|
Human-readable task name (e.g. “bmc_health_check”). |
status |
|
Initial status string from the task manager (e.g. “Started”). |
started_at |
|
Server-side timestamp when the task was started. |
BMCHealthCheckProgress#
BMCHealthCheckProgress reports how far the runner has advanced through the in-scope entities. Both counters reset to zero between runs; they are not durable.
Field |
Type |
Description |
|---|---|---|
nodes_total |
|
Total entities to probe; populated once the task has loaded its entity set from the topology store (zero until then). |
nodes_completed |
|
Entities that have produced a response (real, synthesized timeout, or dispatch error). |
BMCHealthCheckReportRequest#
BMCHealthCheckReportRequest fetches the final report. If the task is still running this returns done=false with no payload; callers should continue polling (or use the dpsctl –wait shortcut).
Field |
Type |
Description |
|---|---|---|
task_id |
|
Task ID returned by StartBMCHealthCheck. |
summary_only |
|
When true, the server strips per-node NodeReport entries from the response and returns only Status, ClusterSummary, and Issues. Useful on large clusters where the full per-node detail (firmware lists, endpoint stats, telemetry samples) inflates the payload past what an operator wants to scroll through, and for scripted polling where only the pass/fail summary matters. The underlying task is unaffected; a subsequent call with summary_only=false returns the full report (until the task exits the zombie window). |
BMCHealthCheckReportResponse#
BMCHealthCheckReportResponse is the response of GetBMCHealthCheckReport.
Field |
Type |
Description |
|---|---|---|
done |
|
True when the underlying task is finished (success or failure). When false the report field is unset; poll again later. |
status |
|
Task manager status string at the time of the lookup (“Started” while running, “Done” / “Failed” once finished). |
report |
|
Cluster-level result. Populated only when done=true and the task did not fail before any data could be collected. |
error_message |
|
Human-readable error string from the task’s terminal error, if any. Empty on a clean run. |
BMCHealthCheckRequest#
BMCHealthCheckRequest is the request for running a deep BMC pre-requisite health check.
Concurrency note: the server enforces an at-most-one gate that is SERVER-WIDE, not topology- or node-scoped. While any BMC health check is in flight, a subsequent StartBMCHealthCheck for a different topology (or a disjoint Nodes subset) is rejected with AlreadyExists and the existing task_id. This is the intended first-version behavior because in practice topologies on the same server have a high node intersection and serializing protects shared BMCs from overlapping load and write-cycle interleaving. A future revision may loosen this to allow disjoint runs to proceed in parallel.
Field |
Type |
Description |
|---|---|---|
topology_name |
|
Name of the topology whose nodes are to be checked. |
nodes |
repeated |
Optional explicit list of node names to check. If empty, all nodes in the topology are checked. |
oneof _samples_per_telemetry.samples_per_telemetry |
optional |
Optional number of telemetry samples to collect per node. |
oneof _concurrency.concurrency |
optional |
Optional maximum number of nodes to check concurrently. |
oneof _skip_writes.skip_writes |
optional |
Optional flag to skip write/restore operations on BMCs. |
oneof _expected_edpp_pct.expected_edpp_pct |
optional |
Expected steady-state EDPp current value, in percent. The screen rule flags a processor whose EDPp current_pct is below this floor. Default (when unset) is 100. Allowed range when set: 1..200. |
oneof _telemetry_interval_ms.telemetry_interval_ms |
optional |
Sleep between telemetry samples on each node, in milliseconds. Zero means no inter-sample delay (samples issued back-to-back). Allowed range when set: 0..60_000 (1 minute). The dpsctl CLI defaults to 500ms; direct API callers that omit the field get the server-side default (no delay, matching the legacy back-to-back semantics). |
oneof _write_resolution_timeout_ms.write_resolution_timeout_ms |
optional |
Per-PATCH readback window for the write-cycle probe, in milliseconds. After each PATCH on PowerLimitWatts.SetPoint the probe polls the readback on a small backoff schedule until the value matches or this ceiling elapses. Zero (or unset) uses the bmcprobe default (1s). Operators on very slow BMC fleets can raise this, but values much above 5s tend to amplify failures on already-stuck BMCs rather than recover them. Allowed range when set: 0..60_000 (60s). |
per_node_timeout |
|
Optional cumulative timeout for the complete health check of each node, including all telemetry samples. Redfish request and operation timeouts continue to bound each individual HTTP call. When unset, the server uses the current 5-minute default. Allowed range when set: 5 minutes..48 hours. |
oneof _prs_latency_check.prs_latency_check |
optional |
Optional PRS-to-BMC roundtrip latency check (DO-007). Its presence is the opt-in: when set, the server patches the PRS scheduler interval (if interval_override is set), runs the BMC probe, then observes the PRS cluster_apply histogram over the window and stores the latency artifact in BMCHealthCheckResponse.prs_latency_artifact_json. A nil message skips the observation entirely. |
BMCHealthCheckResponse#
BMCHealthCheckResponse contains the results of a BMC pre-requisite health check.
Field |
Type |
Description |
|---|---|---|
status |
|
none |
node_reports |
repeated |
none |
cluster_summary |
|
none |
issues |
repeated |
none |
prs_latency_artifact_json |
|
JSON-encoded latencyacceptance.Artifact from the DO-007 PRS latency check. Present only when the request set prs_latency_check. |
BMCHealthCheckStatus#
BMCHealthCheckStatus is the response of GetBMCHealthCheckStatus.
Field |
Type |
Description |
|---|---|---|
task_id |
|
Echoes the looked-up task_id. |
name |
|
Task name (constant for the lifetime of the task). |
status |
|
Task manager status string: “Init”, “Started”, “Done”, “Failed”. |
started_at |
|
Time the task was started. |
completed_at |
|
Time the task completed; unset while running. |
diag_message |
|
Diagnostic message when the task panicked. Empty otherwise. |
progress |
|
Coarse progress counters. Available even before completion. |
done |
|
True when the task has reached a terminal state (success, failure, or cancellation) and the report is ready to fetch via GetBMCHealthCheckReport. |
error_message |
|
Human-readable error string from the task’s terminal error, if any (e.g. a loadData failure). Empty when no error was recorded. |
BMCHealthCheckStatusRequest#
BMCHealthCheckStatusRequest queries the current status of a previously started BMC health check.
Field |
Type |
Description |
|---|---|---|
task_id |
|
Task ID returned by StartBMCHealthCheck. |
ClusterSummary#
ClusterSummary aggregates pass/fail counts and latency statistics across the cluster.
Field |
Type |
Description |
|---|---|---|
total_nodes |
|
Nodes in the topology scope at run start (the full set of entities the task intended to probe). Populated by the aggregator from its input view count, independent of how many entries actually carried a usable NodeReport. |
passed |
|
none |
failed |
|
none |
endpoint_latency_ms |
|
none |
telemetry_latency_ms |
|
none |
power_get_latency_ms |
|
Aggregate latency, in milliseconds, for power-limit GETs across all nodes/processors. |
power_set_latency_ms |
|
Aggregate latency, in milliseconds, for power-limit SETs across all nodes/processors. |
edpp_get_latency_ms |
|
Aggregate latency, in milliseconds, for EDPp percent reads across all nodes/processors. |
wpps_get_latency_ms |
|
Aggregate latency, in milliseconds, for WPPS endpoint reads across all nodes. |
nodes_attempted |
|
Nodes the runner actually invoked a probe against, i.e. entries that reached the screening pass with a non-nil NodeReport. May be smaller than total_nodes if the aggregator dropped malformed entries. |
nodes_unreachable |
|
Nodes for which probing failed before any sample was collected (BMC unreachable, auth, etc.). |
DurationStats#
DurationStats captures latency statistics, in milliseconds.
Field |
Type |
Description |
|---|---|---|
count |
|
none |
min_ms |
|
none |
max_ms |
|
none |
avg_ms |
|
none |
p50_ms |
|
none |
p95_ms |
|
none |
p99_ms |
|
none |
EDPpRead#
EDPpRead captures the EDPp reading for a processor.
Field |
Type |
Description |
|---|---|---|
processor |
|
none |
current_pct |
|
none |
reference_pct |
|
none |
reference_available |
|
none |
EndpointStat#
EndpointStat records request statistics for a single Redfish endpoint+method pair.
Field |
Type |
Description |
|---|---|---|
endpoint |
|
none |
method |
|
none |
attempts |
|
none |
successes |
|
none |
failures |
|
none |
duration |
|
none |
FirmwareEntry#
FirmwareEntry describes a single firmware inventory entry from the BMC.
The node attribution is denormalized onto every entry (rather than only living on the enclosing NodeReport) so the firmware list is usable when flattened across the cluster – e.g. when correlating firmware versions against failing-node Issues, or when emitting a per-node firmware summary into structured logs without re-walking the parent report.
Field |
Type |
Description |
|---|---|---|
id |
|
Inventory ID as reported by the BMC (e.g. “BMC_0”, “HMC_0”, “ERoT_BMC_0”). Stable across probe runs. |
version |
|
Version string returned by the BMC. Empty when the inventory item existed but its version field could not be parsed. |
node |
|
Node name the firmware was read from. Always set by probeFirmware so consumers can filter the cluster’s firmware list by node without joining back to the parent NodeReport. |
IBOOBDrift#
IBOOBDrift captures the drift between in-band and out-of-band power values.
Field |
Type |
Description |
|---|---|---|
component |
|
none |
set_point_w |
|
none |
oneshot_w |
|
none |
drift |
|
none |
Issue#
Issue describes a single problem detected during the health check.
Field |
Type |
Description |
|---|---|---|
severity |
|
none |
code |
|
none |
node |
|
none |
resource |
|
none |
observed |
|
none |
threshold |
|
none |
message |
|
none |
NodeReport#
NodeReport summarizes the BMC pre-requisite health check results for a single node.
Field |
Type |
Description |
|---|---|---|
node |
|
none |
reachable |
|
none |
error_msg |
|
none |
firmware |
repeated |
none |
endpoint_stats |
repeated |
none |
power_settings |
repeated |
none |
power_writes |
repeated |
none |
ib_oob_drift |
repeated |
none |
edpp |
repeated |
none |
wpps |
repeated |
none |
telemetry_samples |
|
Number of telemetry samples requested for this node. This is not the number completed. See the device.StdMetrics endpoint_stats entry for the actual attempt, success, and failure counts. |
telemetry |
repeated |
none |
telemetry_samples_completed |
|
Number of device.StdMetrics calls actually attempted. This includes successful and failed reads. |
telemetry_completion_reason |
|
Why telemetry sampling stopped. Older agents leave this unspecified; the server infers it from device.StdMetrics endpoint statistics. |
PRSLatencyCheck#
PRSLatencyCheck configures the optional DO-007 PRS-to-BMC roundtrip latency observation run alongside a BMC health check.
Field |
Type |
Description |
|---|---|---|
metrics_url |
|
Prometheus /metrics URL on the PRS controller. When empty, the server derives it from the configured PRS controller host. |
interval_override |
|
When set, overrides the PRS scheduler interval_seconds for the duration of the check and restores the original value on exit. Accelerates sample accumulation on low-traffic clusters. |
window |
|
Observation window for PRS cluster_apply histogram samples. Zero uses the server default (5 minutes). |
min_samples |
|
Minimum PRS cluster_apply histogram sample count required over the window. Zero uses the server default (1200). |
actuation_p99_max |
|
Inclusive upper bound for PRS cluster_apply p99 actuation latency. Zero uses the server default (1s). |
metrics_step |
|
PRS controller operation histogram step. Empty uses “cluster_apply” (PRS SET→DPS response wall time). Use “pipeline” for the full iteration. |
PowerSettingRead#
PowerSettingRead captures the readable power setting state for a component.
Field |
Type |
Description |
|---|---|---|
component |
|
none |
set_point_w |
|
none |
allowable_max_w |
|
none |
default_set_point_w |
|
none |
power_w |
|
none |
PowerWriteCycleStat#
PowerWriteCycleStat captures the results of an exercised power write/restore cycle.
Field |
Type |
Description |
|---|---|---|
component |
|
none |
original_w |
|
none |
decrement_cycles |
|
Number of decrement-by-1W iterations the probe attempted. |
mismatches |
|
Total readback / set mismatches observed across all decrement and increment iterations plus the final restore readback. |
restored |
|
none |
restored_value_w |
|
none |
restore_error |
|
none |
increment_cycles |
|
Number of increment-by-1W iterations the probe attempted as part of walking the SetPoint back up to the captured original. |
TelemetryComponentStat#
TelemetryComponentStat summarizes telemetry samples for a single component.
Field |
Type |
Description |
|---|---|---|
component |
|
none |
power_w |
|
none |
ValueStats#
ValueStats captures statistics over a numeric value (e.g. telemetry power).
Field |
Type |
Description |
|---|---|---|
count |
|
none |
min |
|
none |
max |
|
none |
mean |
|
none |
p50 |
|
none |
p95 |
|
none |
p99 |
|
none |
WPPSRead#
WPPSRead captures the workload power profile state for a processor.
Field |
Type |
Description |
|---|---|---|
processor |
|
none |
accessible |
|
none |
enforced_mask |
|
none |
requested_mask |
|
none |
supported_mask |
|
none |
available_profile_ids |
repeated |
none |
error_msg |
|
none |
was_active |
|
True when EnforcedProfileMask was non-zero on probe – i.e. one or more workload power profiles were active on this processor at probe time. Lights-on validation requires no active profiles; the screen pass converts this into a WPPS_PROFILES_ACTIVE Issue. |
active_profile_ids |
repeated |
The profile IDs decoded from the original EnforcedProfileMask, in ascending order. Empty when was_active is false. Captured before any remediation so operators always see exactly what was active at probe time, even if the reset succeeded. |
reset_attempted |
|
True when the probe attempted to disable the active profiles. False when no profiles were active or when –skip-writes was set. |
reset_succeeded |
|
True when the post-reset re-read confirmed EnforcedProfileMask is now zero. Meaningful only when reset_attempted is true. |
reset_error |
|
Diagnostic message when reset_attempted is true and reset_succeeded is false. Empty otherwise. |
Enums#
Severity#
Severity classifies the impact level of an Issue raised during the health check.
Name |
Number |
Description |
|---|---|---|
SEVERITY_UNSPECIFIED |
0 |
none |
SEVERITY_WARNING |
1 |
none |
SEVERITY_ERROR |
2 |
none |
TelemetrySamplingCompletionReason#
TelemetrySamplingCompletionReason describes whether the requested telemetry sampling loop ran to completion. Failed reads do not make the loop incomplete when every requested device.StdMetrics call was attempted.
Name |
Number |
Description |
|---|---|---|
TELEMETRY_SAMPLING_COMPLETION_REASON_UNSPECIFIED |
0 |
none |
TELEMETRY_SAMPLING_COMPLETION_REASON_COMPLETED |
1 |
none |
TELEMETRY_SAMPLING_COMPLETION_REASON_BEST_EFFORT |
2 |
none |
TELEMETRY_SAMPLING_COMPLETION_REASON_TIMED_OUT |
3 |
none |
TELEMETRY_SAMPLING_COMPLETION_REASON_CANCELED |
4 |
none |
TELEMETRY_SAMPLING_COMPLETION_REASON_INCOMPLETE |
5 |
none |
Scalar Value Types#
.proto Type |
Notes |
C++ Type |
Java Type |
Python Type |
|---|---|---|---|---|
double |
double |
double |
float |
|
float |
float |
float |
float |
|
int32 |
Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. |
int32 |
int |
int |
int64 |
Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. |
int64 |
long |
int/long |
uint32 |
Uses variable-length encoding. |
uint32 |
int |
int/long |
uint64 |
Uses variable-length encoding. |
uint64 |
long |
int/long |
sint32 |
Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. |
int32 |
int |
int |
sint64 |
Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. |
int64 |
long |
int/long |
fixed32 |
Always four bytes. More efficient than uint32 if values are often greater than 2^28. |
uint32 |
int |
int |
fixed64 |
Always eight bytes. More efficient than uint64 if values are often greater than 2^56. |
uint64 |
long |
int/long |
sfixed32 |
Always four bytes. |
int32 |
int |
int |
sfixed64 |
Always eight bytes. |
int64 |
long |
int/long |
bool |
bool |
boolean |
boolean |
|
string |
A string must always contain UTF-8 encoded or 7-bit ASCII text. |
string |
String |
str/unicode |
bytes |
May contain any arbitrary sequence of bytes. |
string |
ByteString |
str |