Skip to content

Collector Roadmap

Implemented optional features are documented under Metrics, Configuration, and Semantic conventions.

Plans below are collector-side only — no application SDK, no framework instrumentation dependency. Correlation stays on hw.id, process.pid, time, cgroup/pod attrs, and control-plane artifacts.

ItemHow to enableNotes
Collector modesOTEL_GPU_COLLECTOR_MODESee Modes
Fail loud on faultsalways onInstrument / config faults stop startup; missing libs/caps/OS soft-skip
Prefer blank fallbackOTEL_GPU_DCGM_PREFERNVML fills overlap series until Prefer sample is healthy
gpu.kernel.durationeBPF (serving+)Launch→sync histogram
Uncore / IMC memory IOPMU + memory_bandwidthhw.cpu.memory.io
On-demand Intel PTcontrol APICaps on duration / CPUs / buffer
Multi-node profile fan-outcmd/profile-fanoutDefault control port 1919

Goal: Parity with CUDA eBPF for AMD — launch counts, grid/block, memcpy, stream sync occupancy estimates — without ROCm app SDK hooks.

Approach

  1. Inventory stable userspace symbols in libamdhip64.so / libhsa-runtime64.so (launch, memcpy, stream sync, set-device).
  2. Reuse the existing uprobe tracer skeleton (internal/ebpf) with a HIP event ABI parallel to CUDA EventRecord.
  3. Device resolve via /dev/kfd + DRM minor → UUID/hw.id (same attr contract as NVML).
  4. Occupancy model: launch→sync thread-seconds clamped to device compute-unit count from sysfs/amdsmi (not DCGM SM fields).
  5. Soft attach policy: only when AMD GPUs present; missing HIP libs/caps soft-skip (instrument faults still fatal).

Non-goals: Per-wavefront hardware occupancy; HIP graph per-node expand (phase 2 with CUDA graphs).

Milestones: symbol map + stub tracer → single-GPU occupancy → multi-GPU set-device → docs + DaemonSet caps.

2. True GPU completion (vs launch→sync estimates)

Section titled “2. True GPU completion (vs launch→sync estimates)”

Goal: End spans on device completion, not CPU sync return — without CUPTI/app SDK.

Options (pick one primary)

OptionMechanismProsCons
A. CUDA event pollingInject/observe cudaEventRecord + cudaEventQuery via uprobes; poll in userspaceNo kernel moduleStill needs app/runtime to record events; partial
B. Nouveau/DRM completion (research)Fence / timeline signals in kernelTrue completionDriver-specific; not on proprietary NVIDIA
C. NVML / DCGM activity edgesInfer idle transitionsAlready have DCGMCoarse; not per-kernel
D. Proprietary ioctl trace (last resort)Trace driver submit/completeAccurateFragile across driver versions

Recommended path: A for CUDA when events exist; keep launch→sync as fallback labeled gpu.measurement.source=ebpf_model; never rename to imply hardware SM occupancy.

Exit criteria: Histogram of gpu.kernel.duration with completion=event|sync_fallback attribute; documented error bars.

Goal: Expand cudaGraphLaunch composite span into per-node kernel spans.

Approach

  1. Uprobe cudaGraphGetNodes / instantiate / launch paths; build node-id → kernel-name map at graph instantiate time.
  2. On launch, emit N child spans or N duration samples with cuda.graph.id + cuda.graph.node_id.
  3. Cardinality: hash node names; cap distinct nodes per process (same budget as kernel-name cap).
  4. Without stable instantiate hooks: keep composite span (current behavior).

Non-goals: Replay/capture API coverage in v1; CUPTI graph callbacks.

4. cudaStreamWaitEvent / cross-stream edges

Section titled “4. cudaStreamWaitEvent / cross-stream edges”

Goal: Model wait edges so occupancy does not count blocked wait time as SM-busy.

Approach

  1. Uprobe wait-event + record-event; store event→stream edges in BPF map.
  2. Occupancy engine subtracts wait intervals from active thread-seconds.
  3. Attribute cuda.wait.event on duration samples when edge known.

Risk: Map size under high event churn — bounded LRU + drop counter self-metric.

5. Intel GPU util / memory without XPU Manager

Section titled “5. Intel GPU util / memory without XPU Manager”

Goal: Close Intel util/memory gap using collector-only sources.

Approach

  1. Probe sysfs/hwmon + DRM fdinfo (already used for process mem).
  2. Optional: dynamic load of Level Zero loader for engine utilization if present (dlopen; soft-skip when missing).
  3. Document engine util as extension hw.gpu.engine.utilization with gpu.measurement.source=level0.

Non-goals: Shipping XPU Manager as a dependency.

Goal: Stable hw.cpu.memory.io across EPYC SKUs beyond current uncore_imc* / amd_umc* sysfs discovery.

Approach: Per-family event tables keyed by CPUID; discovery still prefers sysfs; tables fill gaps; self-metric when fallback used.

Goal: Capture PT without shelling out to perf record.

Approach: perf_event_open + AUX mmap in internal/intelpt; keep duration/CPU/buffer caps; decode optional/offline. Fail-closed when PT enabled and open fails.

Goal: Not in scope. Export is OTLP (and optional Prometheus). Fleet warehouses / custom backends stay with the customer’s collector pipeline.

Collector work: Keep resource identity + hw.id joins solid; no proprietary export protocol.

9. Process-side correlation without an SDK

Section titled “9. Process-side correlation without an SDK”

Goal: Richer join keys without instrumenting apps.

Approach (collector-only)

  1. Read /proc/<pid>/environ for TRACEPARENT / OTEL_RESOURCE_ATTRIBUTES when present (best-effort, capped).
  2. Join GPU series to cgroup → pod via existing PodResources path.
  3. Optional: annotate on-demand profile artifacts with pid cmdline + container id only.

Non-goals: Generating W3C trace IDs inside the collector; requiring Shield360 SDK in training/serving jobs.

ItemStatusNotes
Broader AMD DF / UMCTrackedSee plan §6
Native Intel PT AUXTrackedSee plan §7

Two outcomes at init — never conflated:

OutcomeCauseBehavior
UnavailableMissing vendor library, capability, platform, or hardwareLog feature unavailable (info); skip; process stays up
FaultOTel instrument registration bug, control addr misconfiguration, broken embedded BPF objectLog feature fault (error); exit non-zero; cannot be silenced

TPU scrape endpoint misses and DCGM/RDC blank samples are handled at scrape time (self-metrics), not as startup faults.