Skip to content

feat(observability): derive OTLP IDs from Relay UUIDs#453

Merged
rapids-bot[bot] merged 2 commits into
NVIDIA:mainfrom
willkill07:wkk_feat/relay-491-otlp-ids
Jul 16, 2026
Merged

feat(observability): derive OTLP IDs from Relay UUIDs#453
rapids-bot[bot] merged 2 commits into
NVIDIA:mainfrom
willkill07:wkk_feat/relay-491-otlp-ids

Conversation

@willkill07

@willkill07 willkill07 commented Jul 16, 2026

Copy link
Copy Markdown
Member

Overview

  • Derive OpenTelemetry and OpenInference trace and span identifiers from Relay event UUIDs.

  • I confirm this contribution is my own work, or I have the right to submit it under this project's license.

  • I searched existing issues and open pull requests, and this does not duplicate existing work.

Details

  • Map the full root Relay UUID to the OTLP trace ID and the lower 64 bits of each Relay UUID to its OTLP span ID.
  • Apply the mapping to lifecycle spans and all generated orphan or tool-projected mark spans.
  • Cover root, child, orphan, and zero-byte conversion behavior for both exporters.

Where should the reviewer start?

Review crates/core/src/observability/mod.rs for the shared conversions, then the OTel and OpenInference event processors and their deterministic mapping tests.

Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)

  • Closes RELAY-491

Summary by CodeRabbit

  • Enhancements

    • OpenTelemetry and OpenInference tracing now deterministically derive trace/span identifiers from Relay event UUIDs, producing consistent IDs across agent, model/tool-projection, and orphan checkpoint spans (including scenarios without parent linkage).
  • Tests

    • Updated observability unit tests to use fixed Relay UUIDs and validate byte-level trace/span derivation and expected span linkage.
    • Adjusted exporter parity test expectations to ensure OTEL and OpenInference session traces correlate with matching trace IDs.

@willkill07
willkill07 requested a review from a team as a code owner July 16, 2026 12:56
@github-actions github-actions Bot added size:L PR is large Feature a new feature lang:rust PR changes/introduces Rust code labels Jul 16, 2026
@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 11cc8559-af84-426e-b77a-df80e78e2603

📥 Commits

Reviewing files that changed from the base of the PR and between ddd1abe and bd0419e.

📒 Files selected for processing (1)
  • crates/core/tests/unit/observability/exporter_parity_tests.rs
📜 Recent review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (12)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

When changing the core Rust runtime or Rust-facing API surface, format Rust code with cargo fmt (rustfmt defaults), keep cargo clippy -- -D warnings clean, and satisfy cargo deny check per deny.toml.

**/*.rs: If any Rust code changed, always run just test-rust.
If any Rust code changed, also run cargo fmt --all.
If any Rust code changed, also run cargo clippy --workspace --all-targets -- -D warnings.
For Rust changes headed for review, run cargo fmt --all and cargo clippy --workspace --all-targets -- -D warnings even if relying on pre-commit.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
{crates/core,crates/adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Changes to crates/core or crates/adaptive must run the full language matrix

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
crates/core/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

If the change touched crates/core or shared runtime semantics, also use validate-change for broader validation

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
**/*.{rs,py}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions in Rust and Python: use snake_case.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
**/*.{rs,py,js,mjs,cjs,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,py,js,mjs,cjs,ts,tsx}: Use Json = serde_json::Value in Rust-facing runtime APIs where the existing code expects JSON payloads.
Use Result<T> with FlowError in core runtime paths, and keep errors explicit and binding-appropriate at the wrapper layer.
Keep async behavior on the existing tokio-based model; bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
**/*.{rs,py,go,js,ts,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use language-appropriate naming conventions: Rust snake_case, C FFI exports prefixed nemo_relay_, Go PascalCase, Node.js camelCase, and Python snake_case.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
**/*.{rs,go,js,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Add the SPDX license header to all Rust, Go, JavaScript, and TypeScript source files using the corresponding // comment form.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*: Format changed files with the language-native formatter before the final lint/test pass.
If dynamic plugin behavior changed, use maintain-dynamic-plugins and include the native SDK, worker protocol, Python SDK, docs, packaging, and Codecov surfaces in the validation plan.
If code changes alter APIs, bindings, commands, paths, packaging behavior, observability/adaptive semantics, or documented best practices, update any dependent maintainer or consumer skills in the same branch.
During iteration, prefer uv run pre-commit run --files <changed files...>.
Before review or handoff, run uv run pre-commit run --all-files.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
crates/{core,adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If crates/core or crates/adaptive changed, run the full validation matrix across Rust, Python, Go, and Node.js.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
**/*.{rs,py,go,js,ts}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If a language surface changed, always run that language's test target even when Rust core did not change.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
crates/{core,adaptive}/**/*.rs

⚙️ CodeRabbit configuration file

crates/{core,adaptive}/**/*.rs: Review the Rust runtime for async correctness, scope isolation, middleware ordering, and event lifecycle regressions.
Pay close attention to task-local/thread-local scope propagation, callback lifetimes, stream finalization, and root_uuid isolation.
Public API changes should preserve existing behavior unless tests and docs show the intended migration path.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/core/tests/unit/observability/exporter_parity_tests.rs
🔇 Additional comments (1)
crates/core/tests/unit/observability/exporter_parity_tests.rs (1)

822-880: 📐 Maintainability & Code Quality

Run the required validation before handoff.

The updated assertion matches the shared Relay UUID trace-ID contract. Because this is a Rust change under crates/core, run cargo fmt --all, cargo clippy --workspace --all-targets -- -D warnings, just test-rust, validate-change, the full Rust/Python/Go/Node validation matrix, and uv run pre-commit run --all-files.

Source: Coding guidelines


Walkthrough

Relay UUIDs are converted into OpenTelemetry TraceId and SpanId values. OTEL and OpenInference processors apply these identifiers to start, orphan mark, and tool-projected mark spans, with tests covering deterministic IDs, parent linkage, and exporter trace correlation.

Changes

Deterministic OpenTelemetry IDs

Layer / File(s) Summary
Relay UUID conversion helpers
crates/core/src/observability/mod.rs
Adds gated UUID-to-TraceId and UUID-to-SpanId helpers, plus nil-UUID conversion coverage.
Processor span identity wiring
crates/core/src/observability/openinference.rs, crates/core/src/observability/otel.rs
Sets Relay-derived trace and span identifiers for lifecycle spans, orphan marks, and tool-projected marks.
Deterministic identity and parity tests
crates/core/tests/unit/observability/openinference_tests.rs, crates/core/tests/unit/observability/otel_tests.rs, crates/core/tests/unit/observability/exporter_parity_tests.rs
Uses fixed UUIDs to verify byte-level IDs, child parent linkage, orphan spans, and matching OTEL/OpenInference trace IDs.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant RelayEvent
  participant OtelEventProcessor
  participant OpenInferenceEventProcessor
  participant SpanBuilder
  RelayEvent->>OtelEventProcessor: process_start or process_mark with UUID
  RelayEvent->>OpenInferenceEventProcessor: Start or Mark with UUID
  OtelEventProcessor->>SpanBuilder: set UUID-derived trace_id and span_id
  OpenInferenceEventProcessor->>SpanBuilder: set UUID-derived trace_id and span_id
  SpanBuilder-->>OtelEventProcessor: emit span
  SpanBuilder-->>OpenInferenceEventProcessor: emit span
Loading

Possibly related PRs

  • NVIDIA/NeMo-Relay#403: Updates OpenInference tool-projected mark attributes in the same processing path.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title follows Conventional Commits and accurately summarizes the main observability identifier change.
Description check ✅ Passed The description matches the template with Overview, Details, reviewer start, checklist items, and related issue reference.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@willkill07 willkill07 changed the title feat: derive OTLP IDs from Relay UUIDs feat(observability): derive OTLP IDs from Relay UUIDs Jul 16, 2026
@willkill07
willkill07 force-pushed the wkk_feat/relay-491-otlp-ids branch from 9b45eee to 66eeb7e Compare July 16, 2026 13:00
@github-actions github-actions Bot added size:M PR is medium and removed size:L PR is large labels Jul 16, 2026
@willkill07 willkill07 added this to the 0.6 milestone Jul 16, 2026
@willkill07 willkill07 self-assigned this Jul 16, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🤖 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/core/src/observability/mod.rs`:
- Around line 576-589: Remove the inline tests module from observability/mod.rs
and relocate relay_id_conversions_preserve_zero_bytes into
crates/core/tests/unit/observability. Wire the relocated test into the crate
using the existing #[path] inclusion pattern used by openinference_tests.rs,
otel_tests.rs, and related observability tests, preserving access to
relay_trace_id and relay_span_id.

In `@crates/core/src/observability/openinference.rs`:
- Around line 745-746: Update the trace and span ID assignment in the
event-processing flow around relay_trace_id and relay_span_id to preserve the
same precedence behavior required by process_start: ensure relay-derived IDs do
not override the event’s existing IDs when those are already available, while
retaining relay IDs as the fallback.
- Around line 709-710: Update the trace and span ID assignment in the
event-building flow around relay_trace_id and relay_span_id to preserve the same
precedence behavior required by process_start: use the event’s existing IDs when
present and only fall back to relay-derived IDs when absent. Keep the current
builder flow unchanged apart from correcting this precedence.
- Around line 638-639: Update the span-building chain around with_trace_id and
with_span_id to apply relay_trace_id(event.uuid()) only when is_trace_root is
true. Leave child spans without an explicit trace_id so they inherit the parent
trace ID, while preserving the existing root and span ID behavior.

In `@crates/core/src/observability/otel.rs`:
- Around line 703-704: Update the trace and span ID assignment in the
event-processing flow to preserve the intended precedence, matching the
correction applied to otel.rs process_start and openinference.rs. Ensure
relay_trace_id and relay_span_id do not overwrite higher-priority existing
identifiers.
- Around line 731-732: Update the trace and span ID assignment in the
surrounding observability event builder to preserve the intended precedence,
matching the correction applied to openinference.rs and the otel.rs
process_start path. Adjust the .with_trace_id and .with_span_id calls so
relay-derived IDs cannot incorrectly override the intended existing IDs.
🪄 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: ASSERTIVE

Plan: Enterprise

Run ID: 0cc7e4bf-267a-410c-9ed9-4bec9071a222

📥 Commits

Reviewing files that changed from the base of the PR and between 0c654b4 and 9b45eee.

⛔ Files ignored due to path filters (1)
  • crates/core/tests/fixtures/native_plugin/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (5)
  • crates/core/src/observability/mod.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (14)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

When changing the core Rust runtime or Rust-facing API surface, format Rust code with cargo fmt (rustfmt defaults), keep cargo clippy -- -D warnings clean, and satisfy cargo deny check per deny.toml.

**/*.rs: If any Rust code changed, always run just test-rust.
If any Rust code changed, also run cargo fmt --all.
If any Rust code changed, also run cargo clippy --workspace --all-targets -- -D warnings.
For Rust changes headed for review, run cargo fmt --all and cargo clippy --workspace --all-targets -- -D warnings even if relying on pre-commit.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
{crates/core,crates/adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Changes to crates/core or crates/adaptive must run the full language matrix

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
crates/core/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

If the change touched crates/core or shared runtime semantics, also use validate-change for broader validation

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
**/*.{rs,py}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions in Rust and Python: use snake_case.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
**/*.{rs,py,js,mjs,cjs,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,py,js,mjs,cjs,ts,tsx}: Use Json = serde_json::Value in Rust-facing runtime APIs where the existing code expects JSON payloads.
Use Result<T> with FlowError in core runtime paths, and keep errors explicit and binding-appropriate at the wrapper layer.
Keep async behavior on the existing tokio-based model; bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
**/*.{rs,py,go,js,ts,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use language-appropriate naming conventions: Rust snake_case, C FFI exports prefixed nemo_relay_, Go PascalCase, Node.js camelCase, and Python snake_case.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
**/*.{rs,go,js,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Add the SPDX license header to all Rust, Go, JavaScript, and TypeScript source files using the corresponding // comment form.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*: Format changed files with the language-native formatter before the final lint/test pass.
If dynamic plugin behavior changed, use maintain-dynamic-plugins and include the native SDK, worker protocol, Python SDK, docs, packaging, and Codecov surfaces in the validation plan.
If code changes alter APIs, bindings, commands, paths, packaging behavior, observability/adaptive semantics, or documented best practices, update any dependent maintainer or consumer skills in the same branch.
During iteration, prefer uv run pre-commit run --files <changed files...>.
Before review or handoff, run uv run pre-commit run --all-files.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
crates/{core,adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If crates/core or crates/adaptive changed, run the full validation matrix across Rust, Python, Go, and Node.js.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
**/*.{rs,py,go,js,ts}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If a language surface changed, always run that language's test target even when Rust core did not change.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
crates/{core,adaptive}/**/*.rs

⚙️ CodeRabbit configuration file

crates/{core,adaptive}/**/*.rs: Review the Rust runtime for async correctness, scope isolation, middleware ordering, and event lifecycle regressions.
Pay close attention to task-local/thread-local scope propagation, callback lifetimes, stream finalization, and root_uuid isolation.
Public API changes should preserve existing behavior unless tests and docs show the intended migration path.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/otel.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
{crates/**/src/**/*.rs,python/**/*.py}

📄 CodeRabbit inference engine (.agents/skills/maintain-dynamic-plugins/SKILL.md)

Do not add tests under src; Rust tests belong in crate tests/ trees, and Python SDK tests belong under python/tests.

Files:

  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/mod.rs
  • crates/core/src/observability/otel.rs
crates/core/src/observability/{atif,otel,openinference}.rs

📄 CodeRabbit inference engine (.agents/skills/maintain-observability/SKILL.md)

When changing the core event model, emitted fields, exporter behavior, subscriber config, or lifecycle, keep the ATIF, OpenTelemetry, and OpenInference implementations in sync.

Files:

  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
🔇 Additional comments (6)
crates/core/src/observability/mod.rs (1)

75-86: LGTM!

crates/core/src/observability/openinference.rs (1)

28-29: LGTM!

crates/core/src/observability/otel.rs (2)

25-29: LGTM!


631-632: 🗄️ Data Integrity & Integration

Keep ATIF aligned with this identity change. If atif.rs has an equivalent event identifier, wire event.uuid() through it too; otherwise make the ATIF exemption explicit.

crates/core/tests/unit/observability/openinference_tests.rs (1)

2364-2374: LGTM!

Solid deterministic coverage of root, child, and orphan derivation with byte-level assertions and parent-linkage checks. As per path instructions, this "prefer[s] assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests."

Also applies to: 2404-2416, 2425-2455

Source: Path instructions

crates/core/tests/unit/observability/otel_tests.rs (1)

1052-1062: LGTM!

Also applies to: 1092-1104, 1113-1143

Comment thread crates/core/src/observability/mod.rs
Comment thread crates/core/src/observability/openinference.rs
Comment thread crates/core/src/observability/openinference.rs
Comment thread crates/core/src/observability/openinference.rs
Comment thread crates/core/src/observability/otel.rs
Comment thread crates/core/src/observability/otel.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 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/core/src/observability/mod.rs`:
- Around line 75-85: Ensure nil UUIDs are rejected or replaced before they reach
relay_trace_id and relay_span_id, preventing zero-valued OpenTelemetry IDs from
being produced. Add the guard at the event boundary when event UUIDs are
handled, or map nil values to an established non-zero fallback while preserving
normal UUID conversion.

In `@crates/core/tests/unit/observability/openinference_tests.rs`:
- Around line 2366-2370: The orphan-mark tests currently use
MarkProjection::Tool and bypass the normal process_mark path. In
crates/core/tests/unit/observability/openinference_tests.rs at lines 2366-2370,
add a default-projection orphan-mark case using MarkProjection::default() and
assert the Relay-derived trace/span bytes; add the equivalent assertion in
crates/core/tests/unit/observability/otel_tests.rs at lines 1054-1058.
🪄 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: ASSERTIVE

Plan: Enterprise

Run ID: 0ccb2a9d-b404-4097-8de8-ceeb8b522b7d

📥 Commits

Reviewing files that changed from the base of the PR and between 9b45eee and 66eeb7e.

📒 Files selected for processing (5)
  • crates/core/src/observability/mod.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (14)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

When changing the core Rust runtime or Rust-facing API surface, format Rust code with cargo fmt (rustfmt defaults), keep cargo clippy -- -D warnings clean, and satisfy cargo deny check per deny.toml.

**/*.rs: If any Rust code changed, always run just test-rust.
If any Rust code changed, also run cargo fmt --all.
If any Rust code changed, also run cargo clippy --workspace --all-targets -- -D warnings.
For Rust changes headed for review, run cargo fmt --all and cargo clippy --workspace --all-targets -- -D warnings even if relying on pre-commit.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
{crates/core,crates/adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Changes to crates/core or crates/adaptive must run the full language matrix

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
crates/core/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

If the change touched crates/core or shared runtime semantics, also use validate-change for broader validation

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
**/*.{rs,py}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions in Rust and Python: use snake_case.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
**/*.{rs,py,js,mjs,cjs,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,py,js,mjs,cjs,ts,tsx}: Use Json = serde_json::Value in Rust-facing runtime APIs where the existing code expects JSON payloads.
Use Result<T> with FlowError in core runtime paths, and keep errors explicit and binding-appropriate at the wrapper layer.
Keep async behavior on the existing tokio-based model; bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
**/*.{rs,py,go,js,ts,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use language-appropriate naming conventions: Rust snake_case, C FFI exports prefixed nemo_relay_, Go PascalCase, Node.js camelCase, and Python snake_case.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
**/*.{rs,go,js,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Add the SPDX license header to all Rust, Go, JavaScript, and TypeScript source files using the corresponding // comment form.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
{crates/**/src/**/*.rs,python/**/*.py}

📄 CodeRabbit inference engine (.agents/skills/maintain-dynamic-plugins/SKILL.md)

Do not add tests under src; Rust tests belong in crate tests/ trees, and Python SDK tests belong under python/tests.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*: Format changed files with the language-native formatter before the final lint/test pass.
If dynamic plugin behavior changed, use maintain-dynamic-plugins and include the native SDK, worker protocol, Python SDK, docs, packaging, and Codecov surfaces in the validation plan.
If code changes alter APIs, bindings, commands, paths, packaging behavior, observability/adaptive semantics, or documented best practices, update any dependent maintainer or consumer skills in the same branch.
During iteration, prefer uv run pre-commit run --files <changed files...>.
Before review or handoff, run uv run pre-commit run --all-files.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
crates/{core,adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If crates/core or crates/adaptive changed, run the full validation matrix across Rust, Python, Go, and Node.js.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
**/*.{rs,py,go,js,ts}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If a language surface changed, always run that language's test target even when Rust core did not change.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
crates/{core,adaptive}/**/*.rs

⚙️ CodeRabbit configuration file

crates/{core,adaptive}/**/*.rs: Review the Rust runtime for async correctness, scope isolation, middleware ordering, and event lifecycle regressions.
Pay close attention to task-local/thread-local scope propagation, callback lifetimes, stream finalization, and root_uuid isolation.
Public API changes should preserve existing behavior unless tests and docs show the intended migration path.

Files:

  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
crates/core/src/observability/{atif,otel,openinference}.rs

📄 CodeRabbit inference engine (.agents/skills/maintain-observability/SKILL.md)

When changing the core event model, emitted fields, exporter behavior, subscriber config, or lifecycle, keep the ATIF, OpenTelemetry, and OpenInference implementations in sync.

Files:

  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
🔇 Additional comments (2)
crates/core/src/observability/mod.rs (2)

576-589: Duplicate: relocate this inline unit test.

As per coding guidelines, “Do not add tests under src; Rust tests belong in crate tests/ trees.”

Source: Coding guidelines


75-85: 📐 Maintainability & Code Quality

Run the required crates/core validation matrix.

Please provide successful output for cargo fmt --all, strict Clippy, just test-rust, cargo deny check, validate-change, uv run pre-commit run --all-files, and the Rust/Python/Go/Node matrix. As per coding guidelines, “Changes to crates/core or crates/adaptive must run the full language matrix.”

Source: Coding guidelines

Comment thread crates/core/src/observability/mod.rs
Comment thread crates/core/tests/unit/observability/openinference_tests.rs
@github-actions

Copy link
Copy Markdown

Signed-off-by: Will Killian <wkillian@nvidia.com>
@willkill07
willkill07 force-pushed the wkk_feat/relay-491-otlp-ids branch from 66eeb7e to ddd1abe Compare July 16, 2026 13:26

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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/core/src/observability/mod.rs`:
- Around line 81-84: Update relay_span_id to guard against UUIDs whose low 64
bits are zero, preventing creation of SpanId::INVALID; make the conversion
reject or return a fallible result and update callers such as with_span_id
accordingly. Also ensure nil UUIDs cannot produce invalid OpenTelemetry context
IDs.
🪄 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: ASSERTIVE

Plan: Enterprise

Run ID: b6e15c18-6c81-493d-bd23-5f08d52eac53

📥 Commits

Reviewing files that changed from the base of the PR and between 66eeb7e and ddd1abe.

📒 Files selected for processing (5)
  • crates/core/src/observability/mod.rs
  • crates/core/src/observability/openinference.rs
  • crates/core/src/observability/otel.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (14)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

When changing the core Rust runtime or Rust-facing API surface, format Rust code with cargo fmt (rustfmt defaults), keep cargo clippy -- -D warnings clean, and satisfy cargo deny check per deny.toml.

**/*.rs: If any Rust code changed, always run just test-rust.
If any Rust code changed, also run cargo fmt --all.
If any Rust code changed, also run cargo clippy --workspace --all-targets -- -D warnings.
For Rust changes headed for review, run cargo fmt --all and cargo clippy --workspace --all-targets -- -D warnings even if relying on pre-commit.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
{crates/core,crates/adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Changes to crates/core or crates/adaptive must run the full language matrix

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
crates/core/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

If the change touched crates/core or shared runtime semantics, also use validate-change for broader validation

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
**/*.{rs,py}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions in Rust and Python: use snake_case.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
**/*.{rs,py,js,mjs,cjs,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,py,js,mjs,cjs,ts,tsx}: Use Json = serde_json::Value in Rust-facing runtime APIs where the existing code expects JSON payloads.
Use Result<T> with FlowError in core runtime paths, and keep errors explicit and binding-appropriate at the wrapper layer.
Keep async behavior on the existing tokio-based model; bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
**/*.{rs,py,go,js,ts,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use language-appropriate naming conventions: Rust snake_case, C FFI exports prefixed nemo_relay_, Go PascalCase, Node.js camelCase, and Python snake_case.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
**/*.{rs,go,js,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Add the SPDX license header to all Rust, Go, JavaScript, and TypeScript source files using the corresponding // comment form.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
{crates/**/src/**/*.rs,python/**/*.py}

📄 CodeRabbit inference engine (.agents/skills/maintain-dynamic-plugins/SKILL.md)

Do not add tests under src; Rust tests belong in crate tests/ trees, and Python SDK tests belong under python/tests.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/src/observability/openinference.rs
crates/core/src/observability/{atif,otel,openinference}.rs

📄 CodeRabbit inference engine (.agents/skills/maintain-observability/SKILL.md)

When changing the core event model, emitted fields, exporter behavior, subscriber config, or lifecycle, keep the ATIF, OpenTelemetry, and OpenInference implementations in sync.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/openinference.rs
**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*: Format changed files with the language-native formatter before the final lint/test pass.
If dynamic plugin behavior changed, use maintain-dynamic-plugins and include the native SDK, worker protocol, Python SDK, docs, packaging, and Codecov surfaces in the validation plan.
If code changes alter APIs, bindings, commands, paths, packaging behavior, observability/adaptive semantics, or documented best practices, update any dependent maintainer or consumer skills in the same branch.
During iteration, prefer uv run pre-commit run --files <changed files...>.
Before review or handoff, run uv run pre-commit run --all-files.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
crates/{core,adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If crates/core or crates/adaptive changed, run the full validation matrix across Rust, Python, Go, and Node.js.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
**/*.{rs,py,go,js,ts}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If a language surface changed, always run that language's test target even when Rust core did not change.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
crates/{core,adaptive}/**/*.rs

⚙️ CodeRabbit configuration file

crates/{core,adaptive}/**/*.rs: Review the Rust runtime for async correctness, scope isolation, middleware ordering, and event lifecycle regressions.
Pay close attention to task-local/thread-local scope propagation, callback lifetimes, stream finalization, and root_uuid isolation.
Public API changes should preserve existing behavior unless tests and docs show the intended migration path.

Files:

  • crates/core/src/observability/otel.rs
  • crates/core/src/observability/mod.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/src/observability/openinference.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
🔇 Additional comments (6)
crates/core/src/observability/mod.rs (2)

577-589: Move this test to the crate test tree.

As per coding guidelines, “Do not add tests under src; Rust tests belong in crate tests/ trees, and Python SDK tests belong under python/tests.”

Source: Coding guidelines


75-85: 📐 Maintainability & Code Quality

Provide the required core-runtime validation results.

Run cargo fmt --all, cargo clippy --workspace --all-targets -- -D warnings, just test-rust, cargo deny check, validate-change, and the Rust/Python/Go/Node matrix before handoff.

As per coding guidelines, “If the change touched crates/core or shared runtime semantics, also use validate-change for broader validation” and “If crates/core or crates/adaptive changed, run the full validation matrix across Rust, Python, Go, and Node.js.”

Source: Coding guidelines

crates/core/src/observability/openinference.rs (1)

28-29: LGTM!

Also applies to: 638-639, 709-710, 745-746

crates/core/src/observability/otel.rs (1)

28-29: LGTM!

Also applies to: 631-632, 703-704, 731-732

crates/core/tests/unit/observability/openinference_tests.rs (1)

2372-2455: LGTM!

crates/core/tests/unit/observability/otel_tests.rs (1)

1060-1143: LGTM!

Comment thread crates/core/src/observability/mod.rs
Signed-off-by: Will Killian <wkillian@nvidia.com>

@mnajafian-nv mnajafian-nv 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.

Great direction overall. I left two focused comments on the OTLP ID derivation edge case so we can make sure the new exporter contract stays valid for all caller-supplied Relay UUIDs.

Comment thread crates/core/src/observability/mod.rs
Comment thread crates/core/src/observability/mod.rs

@mnajafian-nv mnajafian-nv 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.

Thanks, conditional approval. The helper thread still has one suggestion ready for your review.

@willkill07

Copy link
Copy Markdown
Member Author

/merge

@rapids-bot
rapids-bot Bot merged commit bdf9dd7 into NVIDIA:main Jul 16, 2026
69 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Feature a new feature lang:rust PR changes/introduces Rust code size:M PR is medium

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants