Skip to content

Metrics Reference ​

All metric names and attributes follow the OpenTelemetry semantic conventions for hardware and system metrics.

GPU Hardware Telemetry ​

Collected for each detected GPU on Linux and Windows. Availability depends on vendor, OS, and GPU model.

Metrics ​

MetricTypeUnitDescriptionNVIDIAAMDIntel
hw.gpu.utilizationGauge1GPU compute/encoder/decoder utilization (0.0–1.0)YesYesYes*
hw.gpu.memory.utilizationGauge1Memory controller utilization (0.0–1.0)YesYes-
hw.gpu.memory.limitUpDownCounterByTotal GPU memoryYesYesYes*
hw.gpu.memory.usageUpDownCounterByUsed GPU memoryYesYesYes*
hw.gpu.memory.freeUpDownCounterByFree GPU memoryYesYesYes*
hw.gpu.temperatureGaugeCelDie or memory temperatureYesYesYes
hw.gpu.fan_speedGauge{rpm}Fan speed-†YesYes*
hw.gpu.power.drawGaugeWCurrent power drawYesYesYes
hw.gpu.power.limitGaugeWPower limit/capYesYesYes
hw.gpu.energy.consumedCounterJCumulative energy consumedYesYesYes
hw.gpu.clock.graphicsGaugeMHzGraphics/SM clock frequencyYesYesYes*
hw.gpu.clock.memoryGaugeMHzMemory clock frequencyYesYes-
hw.gpu.upGauge11 when the device was successfully scrapedYesYesYes
hw.gpu.allocatedGauge11 when process memory or util ≥ thresholdYesYesYes
hw.gpu.idleGauge1Idle ratio (1 - utilization) when util knownYesYesYes*
hw.gpu.pcie.throughputGaugeBy/sPCIe RX/TX throughputYesYes¶Soft‡
hw.gpu.interconnect.throughputGaugeBy/sNVLink / XGMI aggregate throughputYes§Yes¶-
hw.gpu.throttledGauge11 when thermal/power throttle is activeYesYes¶Yes*
hw.errorsCounter{error}ECC, PCIe, XID, and RAS error countsYesYes (RAS + PCIe replay¶)-

* Intel device util/VRAM/power/throttle/media use Level Zero Sysman when available (Linux/Windows); otherwise DRM/hwmon/PDH subset. Encoder/decoder util comes from media engine groups or Windows PDH VideoEncode/VideoDecode.

† NVIDIA NVML exposes fan speed as a percentage, not RPM, so hw.gpu.fan_speed is not emitted for NVIDIA.

‡ Soft-omitted when the vendor library/driver path does not expose the counter. Core util/memory/power still collect without those libraries. Windows AMD has no PCIe/XGMI throughput API (ADL).

§ NVLink on Linux and Windows NVIDIA when the GPU exposes enabled NVLink links (rates after the second sample).

¶ AMD Linux via libamd_smi (amdsmi_get_gpu_pci_throughput, amdsmi_get_link_metrics, amdsmi_get_violation_status) when present; soft-omitted on VMs/consumer cards without those counters. AMD media util (MmActivity) is exported as hw.gpu.task=encoder when the driver only exposes a combined VCN counter (decoder stays unset).

Attributes ​

All GPU metrics carry these base attributes:

AttributeDescriptionExample
hw.idUnique device identifier (required by spec)GPU-a1b2c3d4-5678-...
hw.nameProduct nameNVIDIA A100-SXM4-80GB
hw.vendorVendor namenvidia, amd, intel
gpu.indexZero-based device index0, 1
gpu.pci_addressPCI bus address0000:01:00.0

Additional per-metric attributes:

MetricAttributeValues
hw.gpu.utilizationhw.gpu.taskgeneral, encoder, decoder
hw.gpu.temperaturesensordie, memory
hw.gpu.pcie.throughputnetwork.io.directionreceive, transmit
hw.gpu.interconnect.throughputnetwork.io.directionreceive, transmit
hw.gpu.interconnect.throughputhw.gpu.interconnect.typenvlink, xgmi, other
hw.gpu.throttledhw.gpu.throttle_reasonscomma-separated reason labels
hw.errorserror.typecorrected, uncorrected, pcie_replay, xid, ras_corrected, ras_uncorrected
hw.errorshw.typegpu
MIG devicesgpu.mig.enabled, gpu.mig.device_id, gpu.parent.uuid, gpu.mig.instance_id, gpu.mig.profileLinux NVIDIA only (MIG is not available on Windows)

System Metrics ​

Collected on all platforms (Linux, macOS, Windows) via gopsutil. Follows the OTel semantic conventions for system metrics.

MetricTypeUnitDescriptionAttributes
system.cpu.utilizationGauge1CPU utilization per logical core (0.0–1.0)cpu.logical_number
system.cpu.logical.countUpDownCounter{cpu}Number of logical CPU cores
system.memory.usageUpDownCounterByMemory bytes by statesystem.memory.state=
system.memory.utilizationGauge1Memory utilization (0.0–1.0)
system.disk.ioCounterByDisk I/O bytessystem.device, disk.io.direction=
system.disk.operationsCounter{operation}Disk I/O operationssystem.device, disk.io.direction=
system.filesystem.usageUpDownCounterByFilesystem space by statesystem.device, system.filesystem.mountpoint, system.filesystem.type, system.filesystem.state=
system.filesystem.utilizationGauge1Filesystem utilization (0.0–1.0)system.device, system.filesystem.mountpoint, system.filesystem.type
system.network.ioCounterByNetwork I/O bytesnetwork.interface.name, network.io.direction=
system.network.errorsCounter{error}Network errorsnetwork.interface.name, network.io.direction=

INFO

system.memory.state values cached and buffers are only reported on Linux. Loopback interfaces (lo, lo0) are excluded from network metrics.


Process Metrics ​

Self-monitoring of the collector process. Follows the OTel semantic conventions for process metrics.

MetricTypeUnitDescriptionAttributes
process.cpu.timeCountersCumulative CPU timecpu.mode=
process.cpu.utilizationGauge1CPU utilization (0.0–1.0)
process.memory.usageUpDownCounterByResident memory (RSS)
process.memory.virtualUpDownCounterByVirtual memory size
process.thread.countUpDownCounter{thread}OS thread count
process.unix.file_descriptor.countUpDownCounter{file_descriptor}Open file descriptors (Linux/macOS)
process.runtime.go.goroutinesGauge{goroutine}Go goroutine count
process.runtime.go.mem.heap_allocGaugeByGo heap memory allocated

Per-process / per-pod GPU attribution ​

Collected on each scrape from NVML (NVIDIA) or DRM fdinfo (AMD/Intel). Requires host PID visibility — Docker --pid=host / Compose pid: host, or Kubernetes hostPID: true — so /proc shows workload PIDs. Without it, device-level hw.gpu.* metrics still work, but per-process cmdline, state (including zombies), and GPU process metrics will be missing or incomplete.

These attributes support views like zombie-process triage: filter process.state == "zombie" and show process.command_line, process.pid, process.owner, and process.uptime (age).

MetricTypeUnitDescriptionNVIDIAAMDIntel
process.gpu.memory.usageUpDownCounterByGPU memory used by a process on a deviceYesYesYes
process.gpu.utilizationGauge1Per-process GPU utilization (0.0–1.0)YesYesYes
process.uptimeGaugesProcess uptime for GPU-attributed PIDsYesYesYes

Attributes ​

AttributeDescription
process.pidHost process ID
process.executable.nameShort name from /proc/<pid>/comm (or Windows image basename)
process.command_lineTruncated command line (see OTEL_GPU_PROCESS_CMDLINE)
process.staterunning, sleeping, zombie, stopped, dead, unknown
process.owner / process.owner.useridUsername and UID/SID
process.workload.kindllm_inference, llm_training, or other
process.workload.frameworkvllm, ollama, llama.cpp, sglang, tgi, triton, ray, pytorch, unknown
hw.id, hw.name, hw.vendor, gpu.index, gpu.pci_addressSame device attrs as hw.gpu.*
hw.gpu.taskOn utilization only: general, encoder, decoder
k8s.pod.uidFrom cgroup path when present
k8s.pod.name, k8s.namespace.name, k8s.container.nameVia kubelet PodResources (GPU device join) and/or pod API lookup
container.idRuntime container ID when resolvable

INFO

process.start_time is not exported as a metric attribute (cardinality). Use process.uptime for lifetime. On MIG devices, NVML often provides memory only (no per-process SM util). Process util may not sum to device util (time-slicing / sampling windows differ). Use process.state == zombie to find defunct processes still holding GPU contexts.


eBPF CUDA Metrics ​

Enable with OTEL_GPU_EBPF_ENABLED (on by default on Linux). Soft-fails without caps. Discovers libcudart.so* from common install paths and from /proc/*/maps (with Docker --pid=host / Kubernetes hostPID: true), so fleet DaemonSets do not need a CUDA toolkit mount. Attaches uprobes/uretprobes for launches, alloc/free, memcpy, stream/device sync, and cudaSetDevice. AMD/Intel do not use this path — their per-process metrics come from DRM fdinfo.

Activity metrics ​

MetricTypeUnitDescriptionAttributes
gpu.kernel.launch.callsCounter{call}CUDA kernel launch countprocess.pid, process.executable.name, cuda.kernel.name, hw.id / gpu.index when known
gpu.kernel.grid.sizeHistogram{thread}Total threads in grid per launchsame
gpu.kernel.block.sizeHistogram{thread}Threads per block per launchsame
gpu.kernel.shared_memoryHistogramByDynamic shared memory per launch (cudaLaunchKernel sharedMem)same
gpu.memory.allocationsCounterByBytes allocated via cudaMallocprocess.pid, process.executable.name, hw.id / gpu.index when known
gpu.memory.copiesHistogramByBytes per cudaMemcpyAsyncprocess.pid, cuda.memcpy.kind, hw.id / gpu.index when known

hw.id is set after cudaSetDevice for that thread, or immediately on single-GPU hosts. On multi-GPU hosts before cudaSetDevice, join via process.pid as before. Linux/NVIDIA (CUDA) only — same eBPF path for Kubernetes and non-Kubernetes when host PID is visible. AMD/Intel use device/process metrics via DRM fdinfo, not these kernel series.

Stream-sync occupancy (Datadog-parity model) ​

These are CPU-side model estimates, not hardware SM occupancy (warps resident / max warps). Spans run from kernel launch to sync API return; thread-seconds are clamped to NVML CUDA core count and normalized so multi-process totals do not exceed device capacity.

MetricTypeUnitDescription
process.gpu.core.usageGauge{cores}Normalized avg CUDA cores from launch→sync thread-seconds
process.gpu.sm_activeGauge1Fraction of interval with any launch→sync span for the process
gpu.core.limitGauge{cores}NVML CUDA core count
gpu.sm_activeGauge1Device-wide union of launch→sync spans

Prefer NVML process.gpu.utilization for sampled SM%. Use occupancy metrics when correlating with Datadog Agent stream-sync behavior or when NVML process util is unavailable.

Known limits: no GPU completion signal (late sync inflates usage); CUDA Graphs / unhooked launch paths under-report; sync cudaMemcpy and default-stream sync are treated as device-wide (legacy default-stream semantics).


Capability matrix ​

FeatureNVIDIAAMDIntel
Device hw.gpu.*YesYesPartial
process.gpu.memory.usage / utilizationNVMLDRM fdinfoDRM fdinfo
Pod UID on process metricscgroupcgroupcgroup
eBPF activity + occupancyYes (default on Linux)——

Copyright © 2026 elsai foundry.