Skip to content

change: hw-health universal stage support#2938

Open
yoks wants to merge 5 commits into
NVIDIA:mainfrom
yoks:hw-health-refactoring
Open

change: hw-health universal stage support#2938
yoks wants to merge 5 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

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: e0befac7-10e0-436a-8f3d-da5c3aaf34f9

📥 Commits

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

📒 Files selected for processing (8)
  • crates/health/benches/collector_pipeline.rs
  • crates/health/src/collectors/entity_metrics.rs
  • crates/health/src/collectors/runtime.rs
  • crates/health/src/collectors/sensors.rs
  • crates/health/src/discovery/spawn.rs
  • crates/health/src/lib.rs
  • crates/health/src/processor/health_report.rs
  • crates/health/src/sink/otlp.rs
🚧 Files skipped from review as they are similar to previous changes (6)
  • crates/health/src/collectors/runtime.rs
  • crates/health/src/processor/health_report.rs
  • crates/health/src/collectors/entity_metrics.rs
  • crates/health/src/discovery/spawn.rs
  • crates/health/src/sink/otlp.rs
  • crates/health/benches/collector_pipeline.rs

Summary by CodeRabbit

  • New Features
    • Unified, synchronous health-event pipeline across metrics, logs, firmware, and health reports with scrape batch lifecycle boundaries and richer event types (including inventory updates).
  • Bug Fixes
    • Improved shutdown/cleanup signaling for removed endpoints across discovery and collectors.
    • More predictable health report emission behavior (including configurable empty-report handling and dedup/suppression).
  • Refactor
    • Migrated collectors, sinks, and processors from the older collector-event model to the new sync event-node model; updated event-graph wiring and OTLP conversion.
  • Chores
    • Updated benchmarks and logging/export test harnesses; refined collector runtime event routing.

Walkthrough

The PR replaces the health crate’s collector, processor, and sink split with a unified HealthEvent, SyncEventNode, and EventGraph model. Collector orchestration, sink/export wiring, NVUE transport, and benchmarks were updated to emit, route, and consume the new event types.

Changes

Health Event Graph Refactor

Layer / File(s) Summary
Event contracts and graph core
crates/health/src/sink/events.rs, crates/health/src/sink/mod.rs, crates/health/src/sink/composite.rs, crates/health/src/processor/mod.rs, crates/health/src/lib.rs, crates/health/Cargo.toml, crates/health/src/collectors/inventory.rs
CollectorEvent and DataSink are replaced by HealthEvent and SyncEventNode, the composite sink becomes CompositeSyncEventNode, EventGraph handles event propagation and top-level sink composition, and the shared inventory dependency is removed.
Health report and aggregation processors
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/rack_leak.rs
HealthReportProcessor, BmcIntrusionSyncEventNode, LeakSyncEventNode, and RackLeakProcessor now consume HealthEvent inputs and emit HealthReportProduced outputs through SyncEventNode implementations.
Runtime and discovery wiring
crates/health/src/discovery/..., crates/health/src/collectors/runtime.rs, crates/health/src/collectors/mod.rs
CollectorState drops shared inventory bookkeeping, periodic collectors expose event mailboxes, endpoint spawning composes SyncEventNode graphs, and the collector module drops the shared inventory re-export.
Collector implementations
crates/health/src/collectors/discovery.rs, crates/health/src/collectors/entity_metrics.rs, crates/health/src/collectors/firmware.rs, crates/health/src/collectors/sensors.rs, crates/health/src/collectors/leak_detector.rs, crates/health/src/collectors/nmxt.rs, crates/health/src/collectors/logs/..., crates/health/src/collectors/nvue/...
Discovery, metrics, sensor, firmware, leak detector, NMXT, log, and NVUE collectors now emit HealthEvent variants and update local inventory and attribute state instead of shared inventory snapshots and collector-specific events.
Sink nodes and OTLP export
crates/health/src/sink/..., crates/health/src/otlp/...
Concrete sinks and OTLP export now consume HealthEvent through SyncEventNode, with log, report, Prometheus, tracing, and dedup routing updated.
Benchmark migration
crates/health/benches/collector_pipeline.rs, crates/health/benches/processor_pipeline.rs, crates/health/benches/sink_pipeline.rs
The collector, processor, and sink benchmarks now build and emit HealthEvent through SyncEventNode, CompositeSyncEventNode, and EventGraph.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • NVIDIA/infra-controller#2782: This PR also touches crates/health/src/processor/intrusion_events.rs, where the current change switches the processor contract and emitted event type.

Suggested labels

rack health

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 47.73% 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 accurately reflects the broad refactor to a universal health-stage model.
Description check ✅ Passed The description is clearly aligned with the refactor and mentions the intended dispatcher integration.
Linked Issues check ✅ Passed The PR replaces collector/processor/sink roles with SyncEventNode graph composition and adds scrape-event routing, matching issue #2937.
Out of Scope Changes check ✅ Passed The changes stay within the universal stage refactor and related event-routing work, with no obvious unrelated additions.
✨ 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 285 6 26 102 7 144
machine-validation-runner 744 32 188 267 36 221
machine_validation 744 32 188 267 36 221
machine_validation-aarch64 744 32 188 267 36 221
nvmetal-carbide 744 32 188 267 36 221
TOTAL 3267 134 778 1176 151 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 added 2 commits June 26, 2026 19:11
Signed-off-by: ianisimov <ianisimov@nvidia.com>
Signed-off-by: ianisimov <ianisimov@nvidia.com>
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