Technology · July 3, 2026
OpenObserve: The Open-Source Observability Platform That Challenges Datadog at 140x Lower Cost
By Morgan Ross · Senior Technical Lead
Photo by Markus Spiske on Unsplash
The observability cost crisis is real — and it has a solution
Every engineering team above a certain size has felt the pain: you provision your observability stack expecting $5,000 per month, and by the time you add retention policies, index volumes, and multi-cluster replication, the bill reads $50,000. Datadog alone has been known to consume 6–9% of a startup’s total cloud spend. The pain is so widespread that “observability cost” has become a boardroom topic — Gartner estimates that enterprises waste 35% of their observability budget on storage and indexing costs alone.
OpenObserve (O2) is the open-source answer to this problem. It is a cloud-native observability platform built in Rust that unifies logs, metrics, traces, and Real User Monitoring (RUM) into a single binary — deployable in under two minutes. Its architecture is built around a simple insight: the dominant observability tools (Elasticsearch, Splunk, Datadog) were designed for an era when storage was expensive and compression was an afterthought. OpenObserve was designed for the era of cheap object storage, columnar compression, and zero-cost abstractions.
The headline metric — 140x lower storage costs than Elasticsearch — is not marketing rhetoric. It is a direct consequence of architectural decisions that are worth understanding, because they reveal where the entire observability market is heading.
What OpenObserve actually is
OpenObserve is a full-stack observability platform. It ingests, stores, queries, and visualizes the three pillars of observability — logs, metrics, and traces — plus Real User Monitoring (RUM) for frontend performance. It runs as a single stateless binary built in Rust, with no external dependencies beyond an S3-compatible object store for long-term data and a metadata store (SQLite or etcd) for configuration.
The project is licensed under AGPL and maintained by a growing community backed by the startup of the same name. The open-source version is feature-complete and production-ready — it includes dashboards, alerts, pipelines, multi-tenancy, and all core ingestion and query capabilities. The AGPL license means you can run it indefinitely without paying a vendor, and the commercial tier adds SSO, RBAC enhancements, and support SLAs.
Here is where OpenObserve fits in the current observability landscape:
| Tool | Type | Storage Model | Cost Profile | Deployment Model |
|---|---|---|---|---|
| Datadog | SaaS | Proprietary index | Per-host + per-event (high) | Fully managed |
| Splunk | SaaS / Self-hosted | Proprietary index | Per-GB ingested (very high) | Both |
| Elasticsearch + Kibana | Open Source / SaaS | Inverted index (JSON) | Per-node + per-disk (moderate) | Self-managed or Elastic Cloud |
| Grafana + Loki + Tempo | Open Source | Logs (Loki), Traces (Tempo) | Gzip-compressed chunks | Self-managed or Grafana Cloud |
| OpenObserve | Open Source (AGPL) | Parquet columnar on S3 | Object storage + compute | Single binary + S3 |
The cost advantage comes from the storage architecture, and it is worth understanding why that matters.
Why Parquet + S3 is 140x cheaper than Elasticsearch
The 140x figure comes from a simple calculation: storage cost per gigabyte per month.
Elasticsearch stores each document as a JSON object in an inverted index. The index is optimized for full-text search — every term in every field gets an entry in the index, consuming space proportional to both the data and the index structure. Elasticsearch recommends 3:1 raw-to-reserve ratio (three nodes for redundancy and capacity) and typically uses SSDs for performance. At cloud SSD prices of roughly $0.10/GB/month, with replication and reserve overhead, effective storage cost lands around $0.30–$0.50 per GB per month.
OpenObserve stores data in Parquet columnar format on S3-compatible object storage. Parquet compresses log data by 7–10x compared to raw JSON through column-oriented encoding, dictionary compression, and run-length encoding. Standard S3 storage (S3 Standard) costs roughly $0.023/GB/month. After compression, 1 TB of raw logs becomes approximately 100–150 GB of Parquet, costing about $2.50–$3.50 per month. The same data in Elasticsearch would occupy roughly 3–4 TB (after index overhead) and cost approximately $350–$500 per month.
The computation is straightforward: (\$400 Elasticsearch) ÷ (\$3 OpenObserve) ≈ 133x. The 140x figure includes the additional overhead of Elasticsearch’s warm/close tier management that many teams avoid, making the real ratio even wider in practice.
But cost is only half the story. The architectural choices that reduce cost also improve query performance for the workloads that matter most.
Parquet columnar storage changes the query math
Parquet is a columnar storage format. In a columnar store, each column’s values for a row group are stored contiguously. When you query “count of 500 errors in the last hour,” a columnar store reads only the status and timestamp columns, skipping the message, user_agent, request_body, and headers columns entirely. An inverted index (Elasticsearch) must check every term in every field against the query, then retrieve the full document for filtering.
The performance impact is measurable. In the OpenObserve team’s published benchmarks, filtering 100 billion log events by a specific status code completed in under 3 seconds — comparable to Elasticsearch on a fraction of the hardware. The OpenObserve deployment used 4 nodes with 16 GB RAM each; the Elasticsearch cluster required 16 nodes with 64 GB RAM each to match query latency. That is a 16:1 hardware ratio.
OpenObserve achieves this through a layered caching strategy: hot data is held in memory, warm data is on local disk (NVMe or SSD), and cold data lives on S3 with intelligent pre-fetching. The query engine evaluates which data tier satisfies the query and reads only the required columns from the required tier. For recent data queries (last 15 minutes), the engine never touches S3 at all.
A single binary, deployed in under two minutes
One of OpenObserve’s most pragmatic features is its deployment model. The entire platform is a single Rust binary — about 30 MB compressed — with no external runtime dependencies. You download it, run it, and point it at an S3 bucket and a metadata store:
curl -sSL https://github.com/openobserve/openobserve/releases/latest/download/openobserve-x86_64-linux.tar.gz | tar xz
./openobserve --config config.yaml
The configuration is minimal:
ZO_S3_BUCKET: "my-observability-data"
ZO_S3_REGION: "us-east-1"
ZO_S3_ACCESS_KEY: "..."
ZO_S3_SECRET_KEY: "..."
ZO_LOCAL_MODE:
data_dir: "/data/openobserve"
ZO_META_STORE: "sqlite"
ZO_INGESTION_ALLOWED: true
For production deployments with high availability, the architecture is straightforward: run multiple OpenObserve stateless instances behind a load balancer, share the same S3 bucket and a common etcd metadata store. No cluster join, no pod identity, no persistent volume claims for state. The instances are truly stateless — they cache hot data in memory and warm data on ephemeral local disk, but all durable state lives in S3 and etcd. A node can be terminated and replaced with zero data loss and no rebalancing delay.
This makes OpenObserve an unusually good fit for Kubernetes environments. The Helm chart (officially maintained) deploys a DaemonSet or Deployment with HorizontalPodAutoscaler — scaling up and down is instant because there is no cluster state to rebalance. A single kubectl apply provisions the entire observability stack.
OpenTelemetry-native ingestion
OpenObserve accepts data through the OpenTelemetry protocol (OTLP) natively. This means any application already instrumented with OpenTelemetry — which covers the vast majority of modern observability — can send data to OpenObserve without any agent or exporter configuration:
# OpenTelemetry Collector configuration
exporters:
otlphttp/openobserve:
endpoint: "https://o2.yourcompany.com/api/default/"
headers:
Authorization: "Basic ${env:ZO_AUTH_TOKEN}"
The OTEL-native approach eliminates vendor lock-in at the ingestion layer. If you decide to switch from Datadog to OpenObserve, your existing OpenTelemetry instrumentation continues to work unchanged. You only change the exporter endpoint. This is a meaningful advantage over proprietary agents that couple ingestion with their vendor’s data model.
In addition to OTLP, OpenObserve supports ingestion via Fluentbit, Fluentd, Vector, Syslog, HTTP JSON, and the AgentProtocol used by Elasticsearch and Grafana Loki — so there is a migration path for existing deployments regardless of the current agent stack.
Querying with SQL and PromQL — no proprietary language
OpenObserve exposes two query interfaces: SQL for logs and traces, and PromQL for metrics. Neither requires learning a proprietary query language.
Log queries use standard SQL with some observability-specific extensions. A query to find the top error endpoints in the last hour looks like:
SELECT
service_name,
endpoint,
count(*) as error_count
FROM
logs
WHERE
status >= 500
AND timestamp >= now() - INTERVAL '1 hour'
GROUP BY
service_name, endpoint
ORDER BY
error_count DESC
For metrics, PromQL works identically to Prometheus:
rate(http_requests_total{status=~"5.."}[5m])
The query engine is built on top of DataFusion, Apache Arrow’s query engine — the same technology powering InfluxDB 3.0 and parts of Apache Spark. This gives OpenObserve a mature, continuously optimized query planner that can push down predicates to the Parquet scan layer and execute aggregations in memory through Arrow’s columnar format.
Structured pipelines for data transformation
OpenObserve includes a built-in stream processing pipeline that transforms and enriches data at ingestion time, without requiring a separate stream processor like Logstash or Vector. Pipelines are defined in VRL-like syntax (Vector Remap Language) and can:
- Parse unstructured log lines into structured JSON fields
- Drop low-value fields to reduce storage costs
- Enrich events with geo-IP data from a lookup table
- Route events to different streams based on content
- Mask sensitive fields (PII, tokens, passwords)
The pipeline system runs as part of the ingestion path, so transformed data is written directly to Parquet in its final form — no separate enrichment step, no post-ingestion batch job.
Multi-tenancy as a first-class design
OpenObserve’s multi-tenancy model deserves attention because it is architecturally different from the “one cluster per tenant” approach. Organizations are first-class entities in the data model, and every ingested event is tagged with an organization ID at the storage layer. This means:
- A single OpenObserve deployment can serve multiple teams, products, or customers
- Data isolation is enforced at the storage layer (Parquet files are organized by org in S3)
- Users authenticate with API keys scoped to specific organizations and streams
- Cross-organization queries are impossible by default — the storage layout prevents accessing another org’s Parquet files
For managed service providers and enterprises running observability for multiple business units, this eliminates the operational overhead of maintaining separate clusters per tenant. A single OpenObserve deployment can serve 50 teams with the same operational cost as serving one.
91% query speed improvement through search reduction
One of the more surprising architectural details is how OpenObserve uses the columnar format to reduce the search space. Elasticsearch scans the full inverted index for every query. OpenObserve uses Parquet’s min-max statistics — each row group in a Parquet file records the minimum and maximum value of each column. When a query filters on status >= 500, the engine can skip entire row groups whose status max is below 500, reducing the scanned data by up to 99% for most queries.
The OpenObserve team publishes a real-time benchmark dashboard that compares query performance against Elasticsearch across five query patterns:
| Query Pattern | Elasticsearch (16 nodes) | OpenObserve (4 nodes) | Improvement |
|---|---|---|---|
| Filter on status code (50B events) | 2.8s | 2.1s | 25% faster |
| Aggregation by service (1B events) | 4.2s | 1.8s | 57% faster |
| Full-text search in message (10B events) | 1.5s | 3.2s | 47% slower |
| Time-series aggregation (100B metrics) | 6.1s | 2.5s | 59% faster |
| Multi-condition join (logs + traces) | 8.9s | 3.1s | 65% faster |
The one pattern where Elasticsearch wins is full-text search in unstructured message fields — which is what inverted indexes were designed for. OpenObserve compensates by supporting Elasticsearch-compatible full-text search syntax, so users can choose the query engine best suited to their data.
Where OpenObserve still falls short
An honest assessment requires acknowledging the gaps. Three areas where OpenObserve does not yet match the incumbent tools:
Alerting is less mature than Grafana or Datadog. OpenObserve supports threshold-based and anomaly-detection alerts, but it lacks the advanced notification routing, escalation policies, and on-call schedule integration that Grafana OnCall and Datadog provide. For teams with complex paging workflows, OpenObserve alert output is best routed through a dedicated alert manager like PagerTree or Grafana OnCall.
The dashboard builder is functional but not beautiful. Dashboards are built through a YAML-like configuration rather than a drag-and-drop visual editor. Grafana’s dashboard ecosystem is years ahead in terms of community-contributed panels, variable support, and ad-hoc exploration. OpenObserve’s dashboard builder is adequate for operational monitoring but not yet competitive for executive reporting.
Community and ecosystem are smaller. Elasticsearch has 15 years of community content, Stack Overflow answers, conference talks, and blog posts. Grafana has 1,000+ plugins and a massive contributor community. OpenObserve’s ecosystem is younger, smaller, and growing rapidly — but you will find fewer Stack Overflow answers, fewer third-party integrations, and fewer pre-built dashboards.
When to adopt OpenObserve
The adoption decision depends on your budget sensitivity and operational maturity, but the signal is clear for three scenarios:
You are starting a new observability stack from scratch. If you have no existing Elasticsearch or Datadog investment, OpenObserve is the obvious starting point. The deployment cost is close to zero (a single $20/month Linode + an S3 bucket), and there is no migration cost.
You are paying more than $10,000/month for observability. At this threshold, the savings from switching to OpenObserve usually pay back the migration effort within a quarter. The cost differential grows linearly with data volume — a team ingesting 10 TB/month of logs at $400/TB with Elasticsearch is paying $4,000/month in storage alone. The same volume with OpenObserve on S3 costs approximately $30/month.
You are running Kubernetes and want infrastructure-as-code observability. OpenObserve’s stateless architecture and Helm chart make it significantly easier to operate in Kubernetes than Elasticsearch or Loki. There is no cluster topology to manage, no persistent volume claims to maintain, and no rebalancing delay when scaling.
The bottom line
OpenObserve represents a genuine architectural advance in observability infrastructure. The combination of Parquet columnar storage, S3-native scaling, Rust performance, and OTLP-native ingestion gives it a cost structure that the incumbent tools cannot match without rebuilding their storage layers — which, in Datadog’s and Elasticsearch’s case, would require deprecating years of backward compatibility.
The 140x storage cost reduction is not a marketing gimmick. It is the direct output of storage arithmetic that favors columnar compression ratios over inverted index overhead. For teams that prioritize cost efficiency, operational simplicity, and open-source flexibility, OpenObserve is the most compelling observability platform to emerge since Grafana Loki — and it answers the question Loki left open: “what if you want metrics and traces in the same tool?”