Docker (recommended)
The easiest way to run the collector. The image is published to GitHub Container Registry and supportslinux/amd64 and linux/arm64.
process.state, owner), run with host PID namespace access: Docker --pid=host, Compose pid: host, or Kubernetes hostPID: true. Device-level hw.gpu.* metrics work without it.
Tags
Pre-built binaries
Download a binary for your platform from the GitHub Releases page. Binaries are available for:GPU device and process metrics work on Linux and Windows (NVIDIA via NVML; AMD/Intel via sysfs on Linux or DXGI+PDH on Windows). eBPF CUDA tracing and occupancy are Linux only. On macOS the binary runs with host and process metrics only.
SHA256SUMS.txt file in the release:
Build from source
Requirements: Go 1.21+, CGO enabled (required for NVML on Linux).Kubernetes DaemonSet
Run one collector per GPU node. Use the OpenTelemetry-recommended pattern: downward API →K8S_NODE_NAME → OTEL_RESOURCE_ATTRIBUTES with host.name and k8s.node.name. On GKE, AKS, and EKS the collector also auto-detects k8s.cluster.name, cloud.provider, and host.type (instance type) from the Kubernetes Node object and/or cloud metadata.
hostPID: true (same role as Docker --pid=host) is required for per-process and per-pod GPU attribution so the collector can see workload PIDs under /proc. Without it, device-level hw.gpu.* metrics still work. nodes/get enables OpenCost-style host.type / cloud.provider discovery from node labels without relying on IMDS (helpful when EKS hop limit is 1). pods/list is what OPENLIT_K8S_POD_LOOKUP uses to turn a process’s cgroup pod UID into k8s.pod.name. The list call is field-selected to this node; the permission is cluster-scoped.Upgrade
Docker
Binary
Download the new binary from the Releases page, replace the existing file, and restart the process.Uninstall
Docker
Binary
Troubleshooting
No GPU metrics - collector starts but reports no hw.gpu.* metrics
No GPU metrics - collector starts but reports no hw.gpu.* metrics
- Confirm the host has a supported GPU:
lspci | grep -E 'VGA|3D|Display' - For NVIDIA: verify
libnvidia-ml.sois present:ldconfig -p | grep nvidia-ml - For Docker: ensure
--gpus all(NVIDIA) or--device /dev/dri(AMD/Intel) is passed - Check logs:
docker logs otel-gpu-collectorfor"discovered GPU"entries
eBPF tracing not working
eBPF tracing not working
- On Linux it is enabled by default; confirm it is not disabled via
OTEL_GPU_EBPF_ENABLED=false - Check kernel version:
uname -r(requires 5.8+) - The process needs
CAP_BPFandCAP_PERFMON, or run as root - For Docker:
--cap-add CAP_BPF --cap-add CAP_PERFMON,--pid=host, and--ulimit memlock=-1:-1(BPF maps need locked memory; no CUDA mount needed) - For Kubernetes:
hostPID: trueplus BPF capabilities (orSYS_ADMIN); raise memlock if map create returns EPERM - If no CUDA process is running yet, the collector rescans
/procevery 30s - Verify a workload has loaded CUDA:
grep -E 'libcudart|libcuda.so' /proc/*/maps 2>/dev/null | head
Connection refused / no data reaching backend
Connection refused / no data reaching backend
- Verify
OTEL_EXPORTER_OTLP_ENDPOINTis reachable from the container:curl http://<endpoint>/health - For Docker networking: use the host IP or service name, not
localhost - Check if gRPC vs HTTP/protobuf matches the backend: set
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuffor HTTP backends (port 4318)
Intel GPU not detected
Intel GPU not detected
- Verify the i915 or Xe driver is loaded:
lsmod | grep -E 'i915|xe' - Check DRM entries exist:
ls /sys/class/drm/ - Requires Linux kernel 5.10+ for sysfs metric exposure
- Fan speed requires kernel 6.16+

