Skip to content

feat(observoor): eBPF profiling into the engine OTel ClickHouse - #1416

Open
qu0b wants to merge 2 commits into
ethpandaops:mainfrom
qu0b:qu0b/profiling-pprof-modernize
Open

feat(observoor): eBPF profiling into the engine OTel ClickHouse#1416
qu0b wants to merge 2 commits into
ethpandaops:mainfrom
qu0b:qu0b/profiling-pprof-modernize

Conversation

@qu0b

@qu0b qu0b commented Jun 9, 2026

Copy link
Copy Markdown
Member

What

Adds production-ready, low-overhead performance profiling as a single, focused addition — and exposes it for agents to consume as context.

observoor additional_service

A privileged, host-PID observoor eBPF agent that collects kernel-level metrics — CPU (per-core), memory (RSS/VM), disk I/O, network I/O (with port labels), TCP RTT/cwnd, scheduler latency, syscalls, page faults, FDs, context switches — for every Ethereum client process, with zero client modifications.

It ships data to the single engine OTel ClickHouse on the Docker host (the same stack otel tracing uses), writing to its own observoor database over the native protocol. No second ClickHouse, no extra backend collector. Enabling observoor discovers the engine ClickHouse and triggers nothing else — in particular it does not turn on per-client tracing.

pprof

Adds a shared PPROF_PORT_ID (6060) and exposes the Go clients' pprof endpoint: geth, erigon (--pprof), and prysm (port id renamed for consistency). Caplin intentionally excluded.

Removed

Pyroscope is removed entirely (server-only mode couldn't pull pprof; observoor supersedes it), along with superseded in-enclave ClickHouse/Vector/eth-debug WIP.

Companion change

Requires the engine OTel ClickHouse to publish its native port and carry single-node cluster config so observoor's ReplicatedReplacingMergeTree/ON CLUSTER schema can be created. That's a small kurtosis otel change: kurtosis-tech/kurtosis#3141. See docs/observoor/ for the exact config + rationale.

Verification (local, Docker)

  • Ran the package with additional_services: [observoor]; engine-OTel discovery found the host ClickHouse, observoor connected over native TCP at gateway:19000, ran its migrations, and streamed metrics for geth + lighthouseno observoor-clickhouse container in the enclave.
  • 38 observoor tables created in the shared ClickHouse's observoor database (alongside otel).
  • Separately verified the companion kurtosis config brings ClickHouse up healthy with both otel and observoor DBs and accepts observoor's replicated ON CLUSTER DDL over the published native port.

Scope

Target clients only — EL: geth, besu, nimbus-eth1, ethrex, erigon, nethermind; CL: lighthouse, lodestar, nimbus, prysm, teku. Caplin excluded. Coverage will expand in follow-ups; this lays the basic rails.

qu0b added 2 commits June 9, 2026 18:31
Add a shared PPROF_PORT_ID ("pprof", 6060) and wire it into the Go-based
clients so their net/http/pprof endpoint is reachable:

- geth, erigon: --pprof --pprof.addr=0.0.0.0 --pprof.port=6060 + port reg
- prysm: rename PROFILING_PORT_ID -> PPROF_PORT_ID for consistency

Caplin is intentionally excluded.
Add 'observoor' as an additional_service: a privileged, host-PID eBPF agent
that collects kernel-level performance metrics (CPU, memory, disk/net I/O,
scheduler latency, syscalls) for every Ethereum client process with zero
client modifications.

It ships data to the single engine OTel ClickHouse on the Docker host (the
same stack 'otel' tracing uses) over the native protocol, writing to its own
'observoor' database — no second ClickHouse. main.star now discovers the
engine ClickHouse native endpoint (gateway:19000) and passes it to observoor;
enabling observoor triggers discovery but does NOT turn on per-client tracing.

Replaces the earlier Pyroscope approach, which is removed entirely.

Requires the engine OTel ClickHouse to publish its native port and carry
single-node cluster config (see docs/observoor/ and the companion kurtosis
change kurtosis-tech/kurtosis#3141).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant