Skip to content

change: hw-health universal stage support#2938

Closed
yoks wants to merge 7 commits into
NVIDIA:mainfrom
yoks:hw-health-refactoring
Closed

change: hw-health universal stage support#2938
yoks wants to merge 7 commits into
NVIDIA:mainfrom
yoks:hw-health-refactoring

Conversation

@yoks

@yoks yoks commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Refactored HW health to support universal stage.

Opens road to TelemetryService handling as well as nv-redfish dispatcher integration.

Related issues

Closes #2937

Type of Change

  • Add - New feature or capability
  • Change - Changes in existing functionality
  • Fix - Bug fixes
  • Remove - Removed features or deprecated functionality
  • Internal - Internal changes (refactoring, tests, docs, etc.)

Breaking Changes

  • This PR contains breaking changes

Testing

  • Unit tests added/updated
  • Integration tests added/updated
  • Manual testing performed
  • No testing required (docs, internal refactor, etc.)

Additional Notes

Signed-off-by: ianisimov <ianisimov@nvidia.com>
@yoks yoks requested a review from a team as a code owner June 26, 2026 23:41
@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 941c1ff5-8804-4230-a714-42fd7d15f20b

📥 Commits

Reviewing files that changed from the base of the PR and between fc7c56a and 1850076.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (20)
  • crates/health/benches/collector_pipeline.rs
  • crates/health/benches/processor_pipeline.rs
  • crates/health/benches/sink_pipeline.rs
  • crates/health/src/collectors/nmxt.rs
  • crates/health/src/collectors/nvue/gnmi/sample_processor.rs
  • crates/health/src/collectors/nvue/gnmi/subscriber.rs
  • crates/health/src/collectors/nvue/rest/client.rs
  • crates/health/src/collectors/nvue/rest/collector.rs
  • crates/health/src/collectors/sensors.rs
  • crates/health/src/discovery/spawn.rs
  • crates/health/src/otlp/convert.rs
  • crates/health/src/otlp/metrics_drain.rs
  • crates/health/src/processor/health_report.rs
  • crates/health/src/sink/events.rs
  • crates/health/src/sink/health_report.rs
  • crates/health/src/sink/log_file.rs
  • crates/health/src/sink/mod.rs
  • crates/health/src/sink/otlp.rs
  • crates/health/src/sink/prometheus.rs
  • crates/health/src/sink/tracing.rs
💤 Files with no reviewable changes (16)
  • crates/health/src/otlp/metrics_drain.rs
  • crates/health/src/sink/events.rs
  • crates/health/src/collectors/nvue/gnmi/subscriber.rs
  • crates/health/src/otlp/convert.rs
  • crates/health/src/sink/prometheus.rs
  • crates/health/src/collectors/nvue/rest/client.rs
  • crates/health/src/collectors/nvue/gnmi/sample_processor.rs
  • crates/health/src/collectors/nvue/rest/collector.rs
  • crates/health/src/sink/health_report.rs
  • crates/health/src/sink/log_file.rs
  • crates/health/src/sink/tracing.rs
  • crates/health/src/sink/mod.rs
  • crates/health/src/processor/health_report.rs
  • crates/health/src/collectors/sensors.rs
  • crates/health/src/sink/otlp.rs
  • crates/health/src/discovery/spawn.rs
🚧 Files skipped from review as they are similar to previous changes (4)
  • crates/health/src/collectors/nmxt.rs
  • crates/health/benches/collector_pipeline.rs
  • crates/health/benches/sink_pipeline.rs
  • crates/health/benches/processor_pipeline.rs

Summary by CodeRabbit

  • New Features

    • Introduced a unified health event flow across collectors, processors, and sinks.
    • Added support for richer event types like scrape lifecycle, inventory updates, firmware, logs, and health reports.
  • Bug Fixes

    • Improved collector shutdown and cleanup behavior for removed endpoints.
    • Updated health report generation to better handle empty batches and in-flight state.
  • Refactor

    • Streamlined event routing and sink composition for more consistent health data handling.
    • Modernized several health collectors to use the new event model.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 55.79% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately reflects the PR’s universal health-stage refactor.
Description check ✅ Passed The description matches the changeset and correctly frames it as an internal refactor toward universal stage support.
Linked Issues check ✅ Passed The refactor collapses collector/processor/sink into SyncEventNode graphs and updates event routing, aligning with the linked issue.
Out of Scope Changes check ✅ Passed The visible changes stay within the health refactor, tests, and supporting plumbing; no unrelated scope stands out.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
crates/health/src/lib.rs (1)

179-190: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Enable report-producing processors for OTLP/tracing consumers too.

OtlpSink consumes HealthReportProduced, but HealthReportProcessor is not installed for OTLP-only configs. Similarly, intrusion-derived health reports are suppressed unless the Carbide health-report sink is enabled.

Proposed fix
-    if config.sinks.tracing.is_enabled()
+    let emits_health_reports = config.sinks.tracing.is_enabled()
         || config.sinks.health_report.is_enabled()
+        || config.sinks.otlp.is_enabled()
         || config.sinks.power_shelf_health_report.is_enabled()
         || config.sinks.switch_health_report.is_enabled()
-        || config.processors.leak_detection.is_enabled()
-    {
+        || config.processors.leak_detection.is_enabled();
+
+    if emits_health_reports {
         nodes.push(Arc::new(HealthReportProcessor::new()));
     }
 
-    if config.sinks.health_report.is_enabled() {
+    if config.sinks.health_report.is_enabled()
+        || config.sinks.tracing.is_enabled()
+        || config.sinks.otlp.is_enabled()
+    {
         nodes.push(Arc::new(BmcIntrusionSyncEventNode::new()));
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/health/src/lib.rs` around lines 179 - 190, The node setup in
HealthReportProcessor/BmcIntrusionSyncEventNode currently only enables report
generation when the tracing or health-report sinks are enabled, which leaves
OTLP-only consumers without HealthReportProduced events. Update the condition
that pushes HealthReportProcessor so it also activates for OtlpSink consumers,
and adjust the BmcIntrusionSyncEventNode gating so intrusion-derived health
reports are installed whenever any report-producing consumer needs them, not
only when config.sinks.health_report is enabled. Ensure the logic in this
initialization block uses the existing config.sinks and processor symbols
consistently.
crates/health/src/collectors/sensors.rs (1)

159-180: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep derived metrics on the shared metrics path. These samples are now emitted only from SensorCollector::run_iteration, so disabling sensors while leaving metrics enabled will silently drop drive/PSU derived metrics. Move this emission into the metrics collector or make the dependency explicit.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/health/src/collectors/sensors.rs` around lines 159 - 180, The
derived-metric emission in SensorCollector::emit_derived_metrics is wired only
through SensorCollector::run_iteration, so it disappears when sensors are
disabled even if metrics remain enabled. Move this MeasurementObserved emission
into the shared metrics collection path (for example, the metrics collector that
already handles other MetricSample output) or add an explicit dependency so
derived metrics still flow whenever metrics are enabled. Keep the existing
MetricSample construction and entity-derived labels, but ensure the triggering
path is no longer tied solely to sensors.
🧹 Nitpick comments (1)
crates/health/src/sink/otlp.rs (1)

219-238: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Replace the _ wildcard with explicit variants to preserve compile-time exhaustiveness.

This sink is the lone holdout: both TracingSink::handle_event and convert_event enumerate every HealthEvent variant, so adding a new event forces the compiler to flag every handler. Here the trailing _ => return Vec::new() will silently swallow any future variant that ought to be exported, which is precisely the class of bug an exhaustive match prevents. Given this PR is actively expanding the event taxonomy toward universal stage support, I'd recommend spelling out the no-op variants.

♻️ Suggested change
-            _ => return Vec::new(),
+            HealthEvent::MeasurementObserved(_)
+            | HealthEvent::ScrapeRequested { .. }
+            | HealthEvent::InventoryDiscovered { .. }
+            | HealthEvent::InventoryUpdated { .. }
+            | HealthEvent::ScrapeBatchStarted
+            | HealthEvent::ScrapeBatchFinished
+            | HealthEvent::NodeRemoved => return Vec::new(),
         };

As per coding guidelines: "Prefer designs that are hard to misuse. The more the compiler can catch bugs, the better."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/health/src/sink/otlp.rs` around lines 219 - 238, The match in the
sink’s event handling is using a wildcard fallback that can silently ignore
future HealthEvent variants. Update the match in the otlp sink’s
event-processing path to enumerate the known no-op variants explicitly instead
of using “_ => return Vec::new()”, matching the exhaustiveness style already
used by TracingSink::handle_event and convert_event. This keeps compile-time
coverage intact when new HealthEvent variants are added and makes any missing
export handling visible to the compiler.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/health/src/collectors/runtime.rs`:
- Around line 276-281: The mailbox routing in `interested_in` is still
hard-coded to `HealthEvent::InventoryDiscovered`, so collectors using
`PeriodicCollector::handle_event` for `ScrapeRequested`, `InventoryUpdated`, or
other universal-stage events will be filtered out. Update the event matching in
`PeriodicCollector::interested_in` to route all events that the collector can
actually handle based on its configured stages/collector behavior, rather than
only inventory events, and keep the endpoint_key check only where it applies.

---

Outside diff comments:
In `@crates/health/src/collectors/sensors.rs`:
- Around line 159-180: The derived-metric emission in
SensorCollector::emit_derived_metrics is wired only through
SensorCollector::run_iteration, so it disappears when sensors are disabled even
if metrics remain enabled. Move this MeasurementObserved emission into the
shared metrics collection path (for example, the metrics collector that already
handles other MetricSample output) or add an explicit dependency so derived
metrics still flow whenever metrics are enabled. Keep the existing MetricSample
construction and entity-derived labels, but ensure the triggering path is no
longer tied solely to sensors.

In `@crates/health/src/lib.rs`:
- Around line 179-190: The node setup in
HealthReportProcessor/BmcIntrusionSyncEventNode currently only enables report
generation when the tracing or health-report sinks are enabled, which leaves
OTLP-only consumers without HealthReportProduced events. Update the condition
that pushes HealthReportProcessor so it also activates for OtlpSink consumers,
and adjust the BmcIntrusionSyncEventNode gating so intrusion-derived health
reports are installed whenever any report-producing consumer needs them, not
only when config.sinks.health_report is enabled. Ensure the logic in this
initialization block uses the existing config.sinks and processor symbols
consistently.

---

Nitpick comments:
In `@crates/health/src/sink/otlp.rs`:
- Around line 219-238: The match in the sink’s event handling is using a
wildcard fallback that can silently ignore future HealthEvent variants. Update
the match in the otlp sink’s event-processing path to enumerate the known no-op
variants explicitly instead of using “_ => return Vec::new()”, matching the
exhaustiveness style already used by TracingSink::handle_event and
convert_event. This keeps compile-time coverage intact when new HealthEvent
variants are added and makes any missing export handling visible to the
compiler.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: a6fc8e4a-b40c-4329-92c6-b016ccd55161

📥 Commits

Reviewing files that changed from the base of the PR and between 45cb7a1 and 7bab2ab.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (43)
  • crates/health/Cargo.toml
  • crates/health/benches/collector_pipeline.rs
  • crates/health/benches/processor_pipeline.rs
  • crates/health/benches/sink_pipeline.rs
  • crates/health/src/collectors/discovery.rs
  • crates/health/src/collectors/entity_metrics.rs
  • crates/health/src/collectors/firmware.rs
  • crates/health/src/collectors/inventory.rs
  • crates/health/src/collectors/leak_detector.rs
  • crates/health/src/collectors/logs/periodic.rs
  • crates/health/src/collectors/logs/sse.rs
  • crates/health/src/collectors/mod.rs
  • crates/health/src/collectors/nmxt.rs
  • crates/health/src/collectors/nvue/gnmi/on_change_processor.rs
  • crates/health/src/collectors/nvue/gnmi/sample_processor.rs
  • crates/health/src/collectors/nvue/gnmi/subscriber.rs
  • crates/health/src/collectors/nvue/rest/client.rs
  • crates/health/src/collectors/nvue/rest/collector.rs
  • crates/health/src/collectors/runtime.rs
  • crates/health/src/collectors/sensors.rs
  • crates/health/src/discovery/cleanup.rs
  • crates/health/src/discovery/context.rs
  • crates/health/src/discovery/iteration.rs
  • crates/health/src/discovery/spawn.rs
  • crates/health/src/lib.rs
  • crates/health/src/otlp/convert.rs
  • crates/health/src/otlp/drain.rs
  • crates/health/src/processor/health_report.rs
  • crates/health/src/processor/intrusion_events.rs
  • crates/health/src/processor/leak_events.rs
  • crates/health/src/processor/mod.rs
  • crates/health/src/processor/rack_leak.rs
  • crates/health/src/sink/composite.rs
  • crates/health/src/sink/events.rs
  • crates/health/src/sink/health_report.rs
  • crates/health/src/sink/log_file.rs
  • crates/health/src/sink/mod.rs
  • crates/health/src/sink/otlp.rs
  • crates/health/src/sink/power_shelf_health_report.rs
  • crates/health/src/sink/prometheus.rs
  • crates/health/src/sink/rack_health_report.rs
  • crates/health/src/sink/switch_health_report.rs
  • crates/health/src/sink/tracing.rs
💤 Files with no reviewable changes (3)
  • crates/health/src/discovery/cleanup.rs
  • crates/health/Cargo.toml
  • crates/health/src/collectors/mod.rs

Comment thread crates/health/src/collectors/runtime.rs Outdated
@github-actions

github-actions Bot commented Jun 27, 2026

Copy link
Copy Markdown

🔍 Container Scan Summary

Service Total Critical High Medium Low Other
boot-artifacts-aarch64 3 0 0 3 0 0
boot-artifacts-x86_64 3 0 0 3 0 0
forge-admin-cli-x86_64 302 6 30 114 8 144
machine-validation-runner 765 30 194 283 37 221
machine_validation 765 30 194 283 37 221
machine_validation-aarch64 765 30 194 283 37 221
nvmetal-carbide 765 30 194 283 37 221
TOTAL 3368 126 806 1252 156 1028

Per-CVE detail lives in the per-service grype-* artifacts (JSON + SARIF). Severity counts only — no CVE IDs published here.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
crates/health/src/collectors/runtime.rs (1)

292-315: 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

Make workload scrape delivery lossless under mailbox backpressure.

ScrapeRequested is routed into the bounded mailbox, but try_send drops it when the queue is full. Inventory refreshes may self-heal; a workload scrape request can be one-shot, so losing it breaks the dispatcher-driven scrape path. Split coalescable inventory updates from command-like scrape requests, or use a lossless/coalesced command path for ScrapeRequested.

Also applies to: 353-355

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/health/src/collectors/runtime.rs` around lines 292 - 315, The mailbox
send path in runtime collector handling drops one-shot ScrapeRequested events
under backpressure, so split the handling in interested_in/handle_event between
coalescable inventory events and command-like scrape requests. Keep
InventoryDiscovered and InventoryUpdated on the bounded, droppable path if
needed, but make ScrapeRequested lossless by routing it through a non-dropping
or coalesced command path in RuntimeCollector and the event dispatcher so scrape
requests are never silently lost.
crates/health/src/sink/otlp.rs (1)

237-239: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Avoid deduping distinct firmware observations by component name only.

Line 238 keys firmware OTLP entries by info.component, which is populated from the Redfish firmware display name in the collector. If an endpoint reports multiple firmware inventory records with the same component name, save_latest will silently replace earlier records before export. Include at least info.version, or preferably a stable firmware inventory id if available.

Minimal safer key
-                let key = format!("{}|firmware|{}", context.endpoint_key, info.component);
+                let key = format!(
+                    "{}|firmware|{}|{}",
+                    context.endpoint_key, info.component, info.version
+                );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/health/src/sink/otlp.rs` around lines 237 - 239, The firmware OTLP
dedup key in HealthEvent::FirmwareObserved is only using info.component, which
can collapse multiple inventory records with the same display name. Update the
key generation in the sink logic to include a more stable disambiguator such as
info.version, or a firmware inventory identifier if one is available from the
event payload, so save_latest keeps distinct firmware observations separate
before export.
crates/health/src/collectors/inventory.rs (1)

134-137: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Preserve the processor metric label contract.

Line 134 still reads processor_type, but Line 136 now exports it as node_type. That makes the metric semantically misleading and can break dashboards/alerts expecting the previous processor_type label.

Suggested fix
-                    attrs.push((
-                        Cow::Borrowed("node_type"),
-                        node_type.to_snake_case().to_string(),
-                    ));
+                    attrs.push((
+                        Cow::Borrowed("processor_type"),
+                        node_type.to_snake_case().to_string(),
+                    ));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/health/src/collectors/inventory.rs` around lines 134 - 137, The
inventory collector is renaming the processor metric label from processor_type
to node_type, which breaks the existing label contract. Update the attribute key
in the relevant branch of inventory.rs so the collector continues to emit
processor_type while still deriving the value from entity.raw().processor_type
in the inventory collector path. Keep the change localized around the attrs.push
call in the collector logic so dashboards and alerts using the Processor metric
label remain compatible.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@crates/health/src/collectors/inventory.rs`:
- Around line 134-137: The inventory collector is renaming the processor metric
label from processor_type to node_type, which breaks the existing label
contract. Update the attribute key in the relevant branch of inventory.rs so the
collector continues to emit processor_type while still deriving the value from
entity.raw().processor_type in the inventory collector path. Keep the change
localized around the attrs.push call in the collector logic so dashboards and
alerts using the Processor metric label remain compatible.

In `@crates/health/src/collectors/runtime.rs`:
- Around line 292-315: The mailbox send path in runtime collector handling drops
one-shot ScrapeRequested events under backpressure, so split the handling in
interested_in/handle_event between coalescable inventory events and command-like
scrape requests. Keep InventoryDiscovered and InventoryUpdated on the bounded,
droppable path if needed, but make ScrapeRequested lossless by routing it
through a non-dropping or coalesced command path in RuntimeCollector and the
event dispatcher so scrape requests are never silently lost.

In `@crates/health/src/sink/otlp.rs`:
- Around line 237-239: The firmware OTLP dedup key in
HealthEvent::FirmwareObserved is only using info.component, which can collapse
multiple inventory records with the same display name. Update the key generation
in the sink logic to include a more stable disambiguator such as info.version,
or a firmware inventory identifier if one is available from the event payload,
so save_latest keeps distinct firmware observations separate before export.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 3ea15a8b-6009-46e9-92f1-139a2e98590c

📥 Commits

Reviewing files that changed from the base of the PR and between 7bab2ab and 7a46ece.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (25)
  • crates/health/src/collectors/discovery.rs
  • crates/health/src/collectors/entity_metrics.rs
  • crates/health/src/collectors/firmware.rs
  • crates/health/src/collectors/inventory.rs
  • crates/health/src/collectors/leak_detector.rs
  • crates/health/src/collectors/nmxt.rs
  • crates/health/src/collectors/nvue/rest/client.rs
  • crates/health/src/collectors/nvue/rest/collector.rs
  • crates/health/src/collectors/runtime.rs
  • crates/health/src/collectors/sensors.rs
  • crates/health/src/discovery/context.rs
  • crates/health/src/discovery/spawn.rs
  • crates/health/src/lib.rs
  • crates/health/src/otlp/convert.rs
  • crates/health/src/otlp/drain.rs
  • crates/health/src/otlp/metrics_drain.rs
  • crates/health/src/processor/health_report.rs
  • crates/health/src/processor/intrusion_events.rs
  • crates/health/src/processor/leak_events.rs
  • crates/health/src/processor/mod.rs
  • crates/health/src/processor/rack_leak.rs
  • crates/health/src/sink/composite.rs
  • crates/health/src/sink/events.rs
  • crates/health/src/sink/mod.rs
  • crates/health/src/sink/otlp.rs
✅ Files skipped from review due to trivial changes (1)
  • crates/health/src/otlp/metrics_drain.rs
🚧 Files skipped from review as they are similar to previous changes (17)
  • crates/health/src/otlp/drain.rs
  • crates/health/src/sink/events.rs
  • crates/health/src/discovery/context.rs
  • crates/health/src/processor/intrusion_events.rs
  • crates/health/src/collectors/nvue/rest/client.rs
  • crates/health/src/collectors/firmware.rs
  • crates/health/src/collectors/nmxt.rs
  • crates/health/src/otlp/convert.rs
  • crates/health/src/collectors/leak_detector.rs
  • crates/health/src/lib.rs
  • crates/health/src/sink/composite.rs
  • crates/health/src/collectors/discovery.rs
  • crates/health/src/collectors/nvue/rest/collector.rs
  • crates/health/src/discovery/spawn.rs
  • crates/health/src/processor/leak_events.rs
  • crates/health/src/processor/rack_leak.rs
  • crates/health/src/processor/health_report.rs

@yoks

yoks commented Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

Lets wait for #2945 before this one.

@github-actions

Copy link
Copy Markdown

@yoks

yoks commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

Decided to move health service into nv-redfish crate. Refactoring will live there.

@yoks yoks closed this Jul 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

change: refacto hw-health for generic compossible stages

1 participant