node-probe

Bitcoin observatory — kernel signals and chain facts in one dashboard.

Watch your Bitcoin Core node through two lenses: live JSON-RPC semantics (height, peers, mempool, recent blocks) and optional eBPF tracing of bitcoind syscalls and file I/O. Built with Elixir, Phoenix LiveView, and a Rust Aya loader.

Dashboard

  • Overview — Chain height, peer counts, mempool size and min fee, fee-rate histogram from the latest block.
  • Recent blocks — Rolling history with fees and transaction counts.
  • Peers — Address, version, ping, bytes sent/receive, inbound/outbound.
  • Mempool — Transaction count, size, and a short history sparkline.
  • Kernel I/O (bitcoind) — When eBPF is enabled: syscall counts, path-prefix buckets, read/write latency histograms, and recent file paths (requires tracefs permissions for the loader).

The app is served under /node-probe/ on this host (reverse proxy to Phoenix). This page is only the landing copy — use Open node-probe for the live UI.

Operations

JSON-RPC

Polls getblockchaininfo, getpeerinfo, getmempoolinfo, and getblock (verbosity 2) on a timer — same facts you would query with bitcoin-cli.

eBPF loader

Optional Rust process attaches to bitcoind’s PID for syscall and VFS latency probes; events aggregate into in-memory metrics so the UI stays responsive.

Lite mode

CPU sampler and heavy taps can be disabled on small hardware; the RPC dashboard still runs.

How it works

RpcCollector publishes chain, peer, mempool, and block snapshots on an internal pub/sub channel; Aggregator forwards them to LiveView subscribers. EbpfCollector reads NDJSON from the loader and records counters/histograms in ETS so high-frequency kernel events do not flood the LiveView mailbox. Production here uses nginx with WebSockets on the /node-probe/ prefix.