Rust + eBPF runtime observability

Evidence-first signals for Linux and Kubernetes.

E-Navigator collects node-local runtime observations, attributes them to workloads, derives bounded metrics and spans, and keeps every public claim tied to explicit proof.

  • Static Rust pipeline
  • eBPF sources
  • Versioned signals
  • Public preview 0.3.1
E-Navigator compass and Kubernetes signal logo

Capabilities

Runtime signals without application SDKs.

The current foundation captures process, network, DNS, HTTP/1, HTTP/2, extension-free WebSocket metadata, and gRPC-Web metadata at runtime, optionally discovers uniquely identifiable supported plaintext protocols on arbitrary TCP ports, correlation-matches Kafka and MongoDB, and matches MySQL, NATS, PostgreSQL, Redis, and gRPC requests to their responses for real latency and status, reads TLS plaintext at the userspace library boundary through OpenSSL, GnuTLS, and version-gated unstripped Linux/amd64 Go crypto/tls uprobes (interception, not on-the-wire decryption), accounts for TCP retransmits, resets, and state transitions, samples and symbolizes periodic CPU, scheduler off-CPU, and futex-wait lock profiles with bounded Alloy-compatible C++ demangling, with separately bounded opt-in kernel frames that retain user and interpreter frames, and turns resource, trace, peer-aware directional L4 bytes, and security observations into bounded native E-Navigator signals. A disabled-by-default plaintext HTTP/1 path can inject a child W3C traceparent, preserve valid inbound tracestate, and handle bounded exact Content-Length, or chunked framing only when every byte in the current syscall is captured, when complete headers fit one contiguous captured prefix. It length-accounts as many as 40 iovecs while capturing only the first three 96-byte prefixes. TLS, HTTP/2, HTTP/3, headers segmented across syscalls, multiple pipelined requests, pre-existing connections, and async continuation remain explicit non-claims. An optional capture filter scopes which workloads are probed by Kubernetes namespace and label on unified cgroup v2 nodes. Bounded inotify discovery wakes the controller for new cgroups, while a 2-second polling reconciliation remains as a recovery path. Five homelab runs per mode measured a 0.463 ms event-driven median versus 1,148.131 ms with polling for the scoped new-Pod exec workload. Legacy and hybrid layouts force deny before probe attachment instead of guessing a hierarchy. Supported kernels use BPF ring buffers with explicit producer-loss accounting; a separately built perf-event path remains for older kernels and strict diagnostics. BTF-capable kernels also use preflighted fexit hooks for scalar network read/write accounting, with syscall tracepoints retained as the strict compatibility path. An opt-in Linux 6.6 reduced-capability profile removes SYS_ADMIN, retaining only BPF, PERFMON, and SYS_PTRACE for the complete source set proven on the homelab.

Pipeline

Source -> Processor -> Generator -> Sink

Static module registration keeps runtime behavior inspectable and testable.

Attribution

Host, process, container, Kubernetes

Signals carry context when evidence exists and warnings when it does not.

Export

JSON, Prometheus, OTLP, pprof

JSON stdout is the default. Prometheus, OTLP, and a local pprof profile endpoint are opt-in, bounded, and family-selectable.

Scope control

Namespace and label capture filter

Opt-in cgroup-id filtering uses bounded event-driven discovery on unified cgroup v2 nodes; homelab p95 fell from 1,216.842 ms with polling to 0.487 ms for the scoped new-Pod exec workload.

Kernel transport

RingBuf with fail-closed fallback

Feature-probed RingBuf delivery and the old-kernel perf path expose one aggregate loss surface without claiming an unmeasured speedup.

Kernel hooks

Measured BTF fexit fast path

Scalar network read/write accounting uses preflighted fexit where supported; a homelab A/B measured 7.971% more operations per second than tracepoints for that narrow workload.

Profiling domains

Kernel and user frames stay distinct

Opt-in kernel stacks use an independent frame budget, address-free restricted-symbol fallback, and explicit pprof and OTLP frame domains. A local aarch64 Linux VM smoke passed; production-target portability and overhead proof remain pending.

Privilege posture

Reduced profile, exact boundary

Linux 6.6 homelab proof removed SYS_ADMIN: core Aya sources used BPF and PERFMON, TLS and cross-UID CPU symbols added SYS_PTRACE, and host resources used none.

Boundaries

No hidden production claims

Storage, UI, broad collector compatibility, rootless and cross-kernel privilege portability stay non-claims. The scoped homelab head-to-head measured higher E-Navigator CPU and RSS, so no lower-overhead claim is made.

Runtime intelligence

See applications, infrastructure, and security as one system.

E-Navigator converts Linux and Kubernetes runtime activity into workload-aware metrics, traces, profiles, dependency topology, and security signals, without application SDKs or source-code changes.

Automatic application visibility

Correlate HTTP/1, HTTP/2, gRPC, extension-free WebSocket frame metadata, gRPC-Web, Kafka, MongoDB, MySQL, NATS, PostgreSQL, and Redis requests with responses within the bounded wire forms documented for each protocol, surfacing latency, status, errors, and service dependencies. Disabled-by-default arbitrary-port discovery classifies only unique bounded plaintext signatures; explicit port mappings remain authoritative and ambiguous traffic fails closed. Kafka uses bounded wire correlation keys. MongoDB also handles out-of-order replies, no-response requests, moreToCome/exhaust continuations, and write outcomes without exporting reply documents. MySQL uses sequence-checked logical-packet state for result sets, prepares, cursors, LOCAL INFILE, and 16 MiB continuations; protocol-v10 negotiation enables exact bounded zlib decoding only after authentication succeeds and both server/client capability messages were observed, while client-only evidence, zstd, and ambiguous state fail closed. PostgreSQL owns startup/authentication as one private connection operation, retains multi-message SQLSTATE outcomes through readiness, and preserves the initiating query across extended-pipeline and COPY-in control traffic. Redis keeps RESP3 push/attribute frames out of the FIFO command/reply queue and does the same for RESP2 Pub/Sub delivery shapes only after a valid request-matched confirmation establishes RESP2 subscriber state; malformed, null-named, and impossible zero-count subscribe acknowledgements cannot advance it. A matched successful RESET exits that mode, while zero-argument unsubscribe forms make correlation opaque and increment a diagnostic instead of guessing across mixed subscription kinds. Channel values are never exported. Database spans use stable OpenTelemetry db.system.name and db.operation.name attributes, with db.collection.name only for unambiguous MongoDB collection commands; SQL tables are not guessed from raw queries and Redis keys are not collections. Opt-in zero-code agent recognition or explicit Kubernetes application-span ownership labels suppress matching duplicate request spans while retaining L4 and profile telemetry. Exact Guara client/server/version cells, reconnect behavior, and current production qualification remain blocked in the Guara workload qualification ledger. HTTP/3 and QUIC semantics remain an explicit non-claim.

Workload context on every signal

Attribute runtime activity across hosts, processes, containers, namespaces, and Kubernetes workloads. Keep byte-rate views current for long-lived TCP pools with periodic active-flow snapshots, and export bounded directional L4 bytes by stable workload owner with idle reclamation and explicit overflow. Native LP64 TCP sendmmsg/recvmmsg batches are measured from every kernel-written per-message length through Linux's 1,024-entry vector ceiling; compatibility ABIs and unreadable results are counted and omitted.

Performance and security, unified

Combine DNS and network telemetry, TLS visibility, TCP health, CPU, off-CPU, futex-wait, and opt-in kernel-stack profiles, resource metrics, and runtime security signals, then export through Prometheus, OTLP, pprof, or structured JSON. Native CFI normalization includes direct register-plus-offset CFA expressions while dynamic expression programs fail closed; broad managed-runtime unwinders and allocation profiles remain explicit gaps under the non-intrusive policy.

Benchmarks

Methodology before numbers.

Local Criterion runs are hot-path hygiene. Runtime overhead, collector, and Kubernetes claims require guarded live proof with recorded artifacts.

5 cumulative workload stages
3x required repetitions per comparison arm
0 tolerated hard-loss counters
Read performance methodology

Install paths

Run locally, then verify releases before production.

Synthetic local run

Exercise the pipeline without privileged Linux or Kubernetes dependencies.

cargo run --locked -p e-navigator-cli -- --source synthetic

Helm OCI chart

Install the published chart, then pin digest-backed images after verification.

helm upgrade --install e-navigator oci://ghcr.io/guaracloud/charts/e-navigator \
  --version 0.5.0-rc.7 \
  --namespace e-navigator-system \
  --create-namespace

Verify release artifacts

Check release manifest, checksums, Cosign signatures, SBOMs, image digest, and chart digest.

gh release download v0.5.0-rc.7 --repo guaracloud/e-navigator --dir e-navigator-release
jq -r '.images[0].reference' e-navigator-release/release-manifest.json

Documentation

One route from first run to production evidence.

The website guide covers architecture, the production performance path, operations, engineering standards, and proof boundaries. The Markdown source remains the exhaustive, reviewable reference.