Skip to content

eBPF Profiler

The OpenTelemetry eBPF profiler runs once per host and samples every process on it, not just one instrumented application. It’s the option to reach for when a service isn’t written in one of KloudMate’s supported languages, or when you want whole-system visibility (including native binaries, statically linked Go, and other runtimes the SDKs above can’t reach) without touching application code.

  • A Linux host with a kernel new enough for eBPF (4.19+; 5.x recommended) and privileged access to load BPF programs (CAP_SYS_ADMIN/CAP_BPF, typically run as root or in a privileged container).
  • The ingest endpoint: https://otel.kloudmate.com/v1/profiles/pyroscope
  • An API key — go to Settings → API Keys, click Add New, and create an Ingest Key – Backend. Copy it immediately; KloudMate shows it only once.

The project ships a container image, so the fastest path is running it directly with Docker. It needs --privileged (to attach eBPF programs) and --pid=host (to see every process on the host, not just its own container):

docker run --privileged --pid=host \
  -v /sys/kernel/debug:/sys/kernel/debug:ro \
  otel/opentelemetry-ebpf-profiler:latest \
  -collection-agent=https://otel.kloudmate.dev/v1/profiles/pyroscope \
  -secret-token=YOUR_API_KEY \
  -environment=my-environment

Swap YOUR_API_KEY for the key you copied above, and my-environment for a name that identifies this host or cluster.

To run it on every node of a Kubernetes cluster instead of a single host, deploy it as a DaemonSet — the repo’s deploy directory has Kubernetes manifests to start from.

Open Profiling → All Services, select cpu from the profile type dropdown, and give it a minute. The host (or one of the processes running on it) appears as a service with a live chart as soon as the first samples land.

If nothing shows up, confirm the container actually started — a missing --privileged flag or an unreadable /sys/kernel/debug mount fails at eBPF-program load time, before it ever tries to reach KloudMate.

  • Supported Languages — per-language SDKs, if you’d rather profile one application than a whole host.
  • Flame Graph — where this data ends up once it’s flowing.