When your distributed system starts throwing silent failures at 3 AM, most observability tools will show you the fire but not the fuel. In production environments running microservices at scale, we found that the typical tracing pipeline either sampled too aggressively or buried critical anomalies under a mountain of log noise. This is where Oddevold enters the conversation - not as another dashboard, but as a fundamentally different approach to understanding event causality and system resilience.
After stress-testing Oddevold across three distinct cloud-native architectures (Kubernetes on EKS, bare-metal Kafka clusters and a serverless Fog deployment), our team concluded that it solves a specific class of problems that existing tools like Jaeger and OpenTelemetry weren't designed for. This article breaks down the architecture, deployment trade-offs, and concrete performance data we collected over six months - no fluff, just the engineering reality.
If you have ever struggled to reproduce a race condition that only appears under 80% CPU load. Or wasted hours correlating traces from different observability backends, read on. Oddevold might not replace your stack. But it will change how you think about fault propagation.
What Is Oddevold? A New Paradigm for Event-Driven Observability
At its core, Oddevold is an open-source, event-sourced observability platform that uses a custom DAG-based correlation engine to map causality across asynchronous boundaries. Unlike traditional tools that rely on span trees, Oddevold treats every system event as a first-class citizen - from HTTP requests and Kafka offsets to garbage collection pauses and Linux kernel tracepoints. The platform ingests these Events, normalises them into a unified schema, and then builds a directed acyclic graph (DAG) of causal relationships in near-real time.
What makes Oddevold distinct is its bias toward edge case detection rather than average latency analysis. Where Prometheus excels at SLO dashboards, Oddevold focuses on the 0. 01% of outlier events that cause cascading failures. In our benchmarks, it identified three previously undetected deadlock patterns in a Rust-based gRPC service that had been in production for 18 months. The key insight: Oddevold's correlation engine can connect a dropped TCP packet in a load balancer to a subsequent database timeout 400 milliseconds later - even when no explicit trace ID is shared.
From an architecture standpoint, Oddevold runs as a sidecar agent on each node, a Central processing cluster, and a lightweight storage layer built on top of Apache Arrow and Parquet. It deliberately avoids using a distributed tracing protocol like W3C Trace Context; instead, it uses a probabilistic fingerprinting method we will dissect in the next section.
Architecture Deep Dive: How Oddevold Fingerprints Events Without Trace IDs
The most controversial design decision in Oddevold is its rejection of mandatory trace context propagation. Instead, each event is fingerprinted using a hash of its timestamp, process ID, and a configurable set of payload variables (e g., Kafka message key, HTTP path, thread ID). These fingerprints are then grouped using a locality-sensitive hashing (LSH) algorithm that clusters causally related events even if they originate from different services. We validated this approach against 2. 3 billion events from our production pipeline and found a false positive rate of 0. 04% for causal grouping - acceptable for anomaly detection but not for financial audit trails.
The trade-off is clear: Oddevold trades perfect accuracy for low overhead and zero instrumentation changes. In a microservice written in Go, we added the Oddevold sidecar without altering a single line of application code. The sidecar uses eBPF to capture network packets and syscalls, then matches them to process-level events. This is possible because Oddevold ships with a precompiled eBPF program that hooks into TCP send/recv, futex, and futex_wait syscalls. Documentation for the eBPF probe is available in the official eBPF documentation, and the Oddevold repo itself references RFC 826 (ARP) for its network fingerprinting baseline.
Storage is another deliberate choice. Rather than using Elasticsearch or a time-series database (both of which are great for search but terrible for graph traversal), Oddevold persists events in columnar Parquet files indexed by a custom fault-tolerant skip list. This makes retrieving all events related to a specific anomaly DAG fast - measured at under 200ms for a subgraph of 10,000 nodes on a single t3. large instance. We did notice that writes become a bottleneck beyond 150k events/second per node (tested with an Intel Xeon 8275CL). So the official recommendation is to deploy the sidecar on a separate core,
Performance Benchmarks: Oddevold vs. Jaeger vs. OpenTelemetry Collector
We ran a head-to-head comparison on a 20-node Kubernetes cluster (AWS, m5. xlarge) running a synthetic workload based on the DeathStarBench suite (hotel reservation microservices). Each service emitted 250 spans per second (Jaeger) or the equivalent 250 events (Oddevold). Both systems were tasked with detecting a cascading failure injected by a 15-second network partition between the user-service and the memcached layer.
- Detection latency: Oddevold flagged the anomaly 4. 2 seconds after the partition started; Jaeger+Prometheus required 23 seconds (due to scrape intervals).
- Memory overhead: Oddevold sidecar used 98 MB (container limit 256 MB); OpenTelemetry Collector with OTLP receiver used 340 MB.
- Trace completeness: Oddevold captured 97% of the failure propagation path; Jaeger only retained 68% due to sampling.
- False positive rate: Over a 48-hour baseline run, Oddevold generated 7 false anomalies; Jaeger generated 41 (most from inconsistent span context).
These numbers aren't cherry-picked; they align with internal benchmarks shared by the Oddevold maintainers. However, we must note that Jaeger and Prometheus aren't designed for the same use case - Jaeger is a distributed tracing system. While Oddevold is an edge-case correlation engine. The true comparison should be between Oddevold and a combination of Jaeger + logging-based root cause analysis, which is more accurate but far slower.
For teams already invested in OpenTelemetry, Oddevold can run in parallel without conflict. It reads the same eBPF events and can forward processed alarms to any Alertmanager endpoint. We successfully integrated it with PagerDuty and Slack. And the event enrichment includes a direct link to the subgraph DAG in the Oddevold web UI. The UI itself is a single-page React app that uses D3. js for graph rendering - not perfect, but functional.
Use Case: Debugging a Silent Kafka Consumer Failure
In one real incident, a production Kafka consumer (written in Java, running on 12 partitions) began dropping messages without any logged errors. The offset lag monitor showed zero growth. But downstream users reported missing data. Standard tools showed nothing: no exceptions, no thread dumps, no GC pressure. After deploying Oddevold sidecars to all consumer hosts, the correlation graph revealed that one consumer node was experiencing a kernel race condition in the futex_wait syscall whenever a TLS renegotiation coincided with a rebalance. The fingerprinting algorithm matched the timing of the futex stall and the missing offsets, even though no service-level trace connected them.
This discovery would have been impossible with conventional observability because the fault spanned the network, TLS library, and application layer without any propagated context. Oddevold's LSH fingerprinting connected the dots using only timestamps and process identifiers. The upstream fix involved upgrading the kernel to 5. 15. And 45 and disabling TLS 10 fallback - a two-line change that eliminated the issue.
In more complex deployments, Oddevold can also correlate events across different regions if you deploy a central aggregation layer. However, latency increases linearly with the number of central nodes due to the LSH hash comparison. For global multi-region systems, we recommend a hierarchical Federation: each region runs its own Oddevold cluster and only forwards anomaly summaries upstream. This design pattern is similar to Thanos for Prometheus. But specific to event graph processing.
Deployment Strategies and Infrastructure Requirements
Oddevold does not require a dedicated Kubernetes operator; it can run as a Deploymet with a DaemonSet for the sidecars. The sidecar container image is ~150 MB and includes the eBPF probe plus a small HTTP server for metrics (dubbed "volcana" in the source). We found the sidecar stable across kernel versions 5. And 10 to 62. Though some users report issues with certain kernel modules like `tcp_bbr` being unloaded. The documentation suggests enabling the `CONFIG_BPF` and `CONFIG_DEBUG_INFO_BTF` kernel options.
Storage requirements are moderate: for a system emitting 50,000 events/second, the Parquet files consume about 5 GB/hour uncompressed. Compressing with Zstd (level 3) reduces that to 1, and 2 GB/hourRetention policies are configurable via a SQLite-based metadata store - not ideal for high availability. But acceptable for a single region. Production teams should consider running the metadata store on a Postgres instance for replication,
Networking is worth careful planningThe sidecar communicates with the central processing cluster over gRPC with mTLS. The central cluster can scale horizontally behind a load balancer. But each sidecar is pinned to one central node to preserve fingerprint ordering. If a central node fails, the sidecars reconnect to a secondary node. But the in-memory event graph for that failure interval is lost. The maintainers acknowledge this limitation in the official resilience docs and suggest using a redundant sidecar per host for critical deployments.
Integrating Oddevold with Existing Alerting and SRE Workflows
For teams that already run a robust SRE stack - say, Prometheus + Grafana + Alertmanager + a runbook automation tool - Oddevold can emit webhook alerts in a format compatible with Prometheus Alertmanager. The alert payload includes a json blob with the DAG subgraph and a correlation score (0-1). We configured ours to trigger only for scores above 0. 85, which eliminated noise during scheduled deployments (which naturally create large event graphs).
One caution: Oddevold's correlation score is based purely on temporal and causal structure, not on domain knowledge. That means a legitimate code deployment that changes service behaviour may be flagged as an anomaly. To work around this, the maintainers provide a "deployment mode" flag that suppresses anomaly detection during specified windows. In our experience, this flag is too coarse-grained; we instead wrote a small filter that ignores all events whose timestamps overlap with our deployment pipeline (queried from the CD API).
From an SRE perspective, Oddevold is best used as a secondary correlation layer rather than a primary monitoring system. We found it most valuable for incident postmortems and for automated root cause suggestions during the first 5 minutes of an incident. The web UI allows an engineer to visually traverse the DAG and expand nodes with a click - something that saved us hours of manual log diving during our outage review process.
Security and Compliance Considerations
Because Oddevold captures syscalls and network packets via eBPF, its sidecar requires either root privileges or the `CAP_BPF` capability. In many hardened container environments (e, and g, those using Pod security Admission), this may be disallowed. We worked around this by running the sidecar in a separate namespace with the `CAP_BPF` and `CAP_NET_ADMIN` capabilities, and verified it still functions correctly. No kernel module loading is required because eBPF is now built into most mainline kernels.
For compliance with SOC 2 or PCI-DSS, you must ensure that any personally identifiable information (PII) present in network payloads isn't stored in the Parquet files. Oddevold offers a regex-based redaction filter that runs during event normalisation. In our test with a HIPAA-like workload, we configured redaction for patterns like `phone`, `email`. And `ssn`. And the verification logs showed zero breaches. However, note that eBPF can capture raw packet data, so if you care about privacy, you should whitelist only specific syscall IDs rather than capturing everything. The BPF documentation provides guidance on syscall filters.
Authentication between sidecar and central cluster uses client certificates. The default deployment generates self-signed certs via a bootstrap script. For production, we recommend integrating with cert-manager and an internal PKI. The central cluster exposes a PostgreSQL metadata endpoint for users and roles - an improvement over earlier versions that used a flat file.
Oddevold in the Broader Observability Landscape
The observability market has settled on a three-pillar model (logs, metrics, traces), but that model is increasingly recognised as insufficient for complex distributed systems. Oddevold represents a fourth pillar: causal correlation. It isn't the only tool in this space - projects like Lightstep (enterprise) Honeycomb also focus on high-cardinality event analysis - but Oddevold is unique in its ability to correlate without explicit trace propagation. This makes it especially attractive for brownfield systems where adding trace headers to hundreds of services is impractical.
We see Oddevold as a complementary tool to your existing observability stack. For example, we now use Prometheus for real-time alerting, Loki for log aggregation. And Oddevold for deep-dive postmortem analysis and incident detection. The integration with Grafana is still rough (no native data source plugin). But the team is working on it. Until then, you can embed Oddevold dashboards via iframe in Grafana.
Another interesting overlap is with service meshes. Istio and Linkerd already emit detailed telemetry, but they rely on standard trace propagation. Oddevold can ingest the same Envoy access logs and correlate them with kernel events to find issues below the mesh layer. We successfully identified a case where Istio sidecar proxy had a memory leak under TLS connection churn - the leak was invisible to Istio metrics but visible in Oddevold's eBPF capture of `mmap` syscalls.
Frequently Asked Questions About Oddevold
- Is Oddevold production-ready. it's currently in beta (v08. 4 as of writing). We have run it in production for six months on non-critical services, but the maintainers recommend staging before production.
- Does Oddevold require application changes? No. It uses eBPF and syscall interception, so no code changes are needed. However, the sidecar must run on the same host as the application.
- Can Oddevold be used with serverless or functions? Only if the function runs on a long-lived container where a sidecar can be attached. Short-lived Lambda-like invocations don't provide enough temporal data for fingerprinting.
- How does Oddevold handle high cardinality (thousands of unique event types)? The LSH algorithm scales to hundreds of thousands of fingerprints per second. The graph store becomes slow beyond 50 million nodes. But you can prune old graphs by TTL.
- What is the cost implication, Storage is the main costFor 100k events/second, plan for 2-3 GB/hour compressed. Sidecars add negligible CPU (2-5% per core), and there's no cloud service; you self-host
Conclusion and Next Steps
Oddevold isn't a silver bullet. But it fills a real gap in modern observability - the ability to detect and correlate anomalies across service boundaries without requiring every team to adopt a consistent tracing standard. For senior engineers who have spent late nights manually joining logs from different systems, the DAG-based correlation engine feels like a superpower. We recommend running it alongside your existing stack on a non-critical path first, then gradually expanding as
.Need a Custom App Built?
Let's discuss your project and bring your ideas to life.
Contact Me Today β