ebpf_exporter - Prometheus 用カスタム カーネル メトリクス チートシート
ebpf_exporter (Cloudflare 製) はeBPF と Prometheusを橋渡し。標準エクスポーター はカーネル が既に公開するカウンター をサーフェス;ebpf_exporter は、カスタム eBPF プログラム をカーネル プローブ に接続し、それが測定する任意のもの を Prometheus メトリクス として公開 — ディスク I/O レイテンシ ヒストグラム、TCP 再送信 の原因、スケジューラー 実行キュー 遅延、ページ キャッシュ 動作。それは深いアドホック カーネル 質問を継続的にスクレイプされる 時系列に変わる。
要件
- eBPF + BTF 付き Linux カーネル (5.x 推奨)
- ルート /
CAP_BPF 権限
- メトリクス をスクレイプ する Prometheus
インストール
| 方法 | コマンド |
|---|
| バイナリ | GitHub Releases からダウンロード |
| Docker | docker run --privileged -p 9435:9435 cloudflare/ebpf_exporter |
| ソースから | git clone https://github.com/cloudflare/ebpf_exporter && make |
| 実行 | sudo ebpf_exporter --config.dir=examples --config.names=biolatency |
| メトリクス | http://localhost:9435/metrics |
バンドル された例 で実行
# ブロック I/O レイテンシ ヒストグラム をエクスポート
sudo ./ebpf_exporter --config.dir=examples --config.names=biolatency
# 複数のプログラム を一度に
sudo ./ebpf_exporter --config.dir=examples \
--config.names=biolatency,tcp-syn-backlog,run-queue-latency
| フラグ | 目的 |
|---|
--config.dir | プログラム コンフィギュレーション のディレクトリ |
--config.names | ロード するプログラム (カンマ区切り) |
--web.listen-address | バインド アドレス (デフォルト :9435) |
--debug | 冗長 ロード/診断 |
バンドル されたプログラム (例)
| プログラム | 測定 |
|---|
biolatency | ブロック I/O レイテンシ ヒストグラム |
bio-tracepoints | デバイス/操作別ディスク I/O |
run-queue-latency | タスク が実行 される前のスケジューラー 遅延 |
tcp-syn-backlog | SYN バックログ 深さ |
tcp-window-clamps | TCP ウィンドウ クランピング イベント |
timers | タイマー/softirq 動作 |
cachestat | ページ キャッシュ ヒット/ミス |
oomkill | OOM キル イベント |
コンフィギュレーション 構造
プログラム はコンパイル された eBPF オブジェクトをメトリクス 定義とペア:
metrics:
histograms:
- name: bio_latency_seconds
help: Block IO latency histogram
bucket_type: exp2
bucket_multiplier: 0.000001 # マイクロ秒 → 秒
bucket_min: 0
bucket_max: 26
labels:
- name: device
size: 32
decoders:
- name: string
- name: bucket
size: 8
decoders:
- name: uint
| フィールド | 目的 |
|---|
counters / histograms | エクスポート するメトリクス タイプ |
bucket_type | exp2 / linear ヒストグラム バケッティング |
bucket_multiplier | 生カーネル ユニット をスケール秒 へ |
labels | eBPF マップ キー を Prometheus ラベル にマッピング |
decoders | 生バイト を変換 (string、uint、ksym、cgroup…) |
便利なデコーダー
| デコーダー | 変換 |
|---|
string | バイト 配列 → ラベル 文字列 |
uint | 生整数 |
ksym | カーネル アドレス → シンボル 名 |
majorminor | デバイス 番号 → sda、nvme0n1 |
cgroup | cgroup ID → パス |
static_map | 数値列挙 → 読み取り可能なラベル |
Prometheus でクエリ
# デバイス 別 p99 ブロック I/O レイテンシ
histogram_quantile(0.99,
sum(rate(bio_latency_seconds_bucket[5m])) by (le, device))
# スケジューラー 実行キュー 遅延 p95 (CPU 飽和 シグナル)
histogram_quantile(0.95,
sum(rate(run_queue_latency_seconds_bucket[5m])) by (le))
いつ到達するか
| 質問 | 標準エクスポーター | ebpf_exporter |
|---|
| 「ディスクは ビジー か?」 | はい (node_exporter) | — |
| 「I/O レイテンシー の分布は何か?」 | いいえ | はい |
| 「タスク がスケジュール される前にどのくらい待つ か?」 | いいえ | はい |
| 「TCP 再送信 がなぜ 発生するのか?」 | 部分的に | はい |
| 「どの cgroup これを引き起こしたのか?」 | いいえ | はい (cgroup デコーダー) |
ebpf_exporter vs 関連ツール
| ツール | モデル |
|---|
| ebpf_exporter | 継続的 eBPF メトリクス → Prometheus |
| bpftrace | アドホック、対話型 eBPF ワンライナー |
| bcc-tools | プリビルト eBPF 診断ツール |
| node_exporter | 標準カーネル 発行メトリクス |
| bpftop | 実行中 eBPF プログラム のオーバーヘッド |
bpftraceを使用して質問を対話的に探索してから、答えを永続的な ebpf_exporter メトリクス としてエンコード。
リソース