Skip to content

ebpf_exporter - Custom Kernel Metrics for Prometheus Cheatsheet

ebpf_exporter - Custom Kernel Metrics for Prometheus Cheatsheet

ebpf_exporter (by Cloudflare) bridges eBPF and Prometheus. Standard exporters surface counters the kernel already publishes; ebpf_exporter lets you attach custom eBPF programs to kernel probes and export whatever they measure as Prometheus metrics — disk I/O latency histograms, TCP retransmit causes, scheduler run-queue delay, page-cache behavior. It turns deep, ad-hoc kernel questions into continuously-scraped time series.

Requirements

  • Linux kernel with BPF + BTF (5.x recommended)
  • Root / CAP_BPF privileges
  • Prometheus to scrape the endpoint

Installation

MethodCommand
BinaryDownload from GitHub Releases
Dockerdocker run --privileged -p 9435:9435 cloudflare/ebpf_exporter
From sourcegit clone https://github.com/cloudflare/ebpf_exporter && make
Runsudo ebpf_exporter --config.dir=examples --config.names=biolatency
Metricshttp://localhost:9435/metrics

Running with Bundled Examples

# Export block I/O latency histograms
sudo ./ebpf_exporter --config.dir=examples --config.names=biolatency

# Multiple programs at once
sudo ./ebpf_exporter --config.dir=examples \
  --config.names=biolatency,tcp-syn-backlog,run-queue-latency
FlagPurpose
--config.dirDirectory of program configs
--config.namesWhich programs to load (comma-separated)
--web.listen-addressBind address (default :9435)
--debugVerbose loading/diagnostics

Bundled Programs (examples)

ProgramMeasures
biolatencyBlock I/O latency histogram
bio-tracepointsDisk I/O by device/operation
run-queue-latencyScheduler delay before a task runs
tcp-syn-backlogSYN backlog depth
tcp-window-clampsTCP window clamping events
timersTimer/softirq behavior
cachestatPage cache hit/miss
oomkillOOM kill events

Config Structure

A program pairs a compiled eBPF object with metric definitions:

metrics:
  histograms:
    - name: bio_latency_seconds
      help: Block IO latency histogram
      bucket_type: exp2
      bucket_multiplier: 0.000001   # microseconds → seconds
      bucket_min: 0
      bucket_max: 26
      labels:
        - name: device
          size: 32
          decoders:
            - name: string
        - name: bucket
          size: 8
          decoders:
            - name: uint
FieldPurpose
counters / histogramsMetric type to export
bucket_typeexp2 / linear histogram bucketing
bucket_multiplierScale raw kernel units to seconds
labelsMap BPF map keys to Prometheus labels
decodersConvert raw bytes (string, uint, ksym, cgroup…)

Useful Decoders

DecoderConverts
stringByte array → label string
uintRaw integer
ksymKernel address → symbol name
majorminorDevice numbers → sda, nvme0n1
cgroupcgroup ID → path
static_mapNumeric enum → readable label

Querying in Prometheus

# p99 block I/O latency by device
histogram_quantile(0.99,
  sum(rate(bio_latency_seconds_bucket[5m])) by (le, device))

# Scheduler run-queue delay p95 (CPU saturation signal)
histogram_quantile(0.95,
  sum(rate(run_queue_latency_seconds_bucket[5m])) by (le))

When to Reach for It

QuestionStandard exportersebpf_exporter
”Is the disk busy?”Yes (node_exporter)
“What is the distribution of I/O latency?”NoYes
”How long do tasks wait to be scheduled?”NoYes
”Why are TCP retransmits happening?”PartiallyYes
”Which cgroup caused this?”NoYes (cgroup decoder)
ToolModel
ebpf_exporterContinuous eBPF metrics → Prometheus
bpftraceAd-hoc, interactive eBPF one-liners
bcc-toolsPrebuilt eBPF diagnostic tools
node_exporterStandard kernel-published metrics
bpftopOverhead of running eBPF programs

Use bpftrace to explore a question interactively, then encode the answer as a permanent ebpf_exporter metric.

Resources