Skip to content

OpenObserve - Petabyte-Scale Observability Platform Cheatsheet

OpenObserve - Petabyte-Scale Observability Platform Cheatsheet

OpenObserve (O2) is an open-source observability platform for logs, metrics, and traces, written in Rust. Its defining design choice is storing data in object storage (S3, GCS, MinIO) in compressed Parquet rather than on expensive local disks — the basis of its claim of dramatically lower storage cost than Elasticsearch-based stacks. It ships as a single binary with a built-in UI, speaks OpenTelemetry natively, and queries with SQL.

Installation

MethodCommand
Binarydownload from GitHub Releases, then ./openobserve
Dockerdocker run -d -p 5080:5080 -e ZO_ROOT_USER_EMAIL=a@b.c -e ZO_ROOT_USER_PASSWORD=pass public.ecr.aws/zinclabs/openobserve:latest
KubernetesHelm chart available
UIhttp://localhost:5080
Verifylog in with the root credentials you set

Storage Modes

ModeUse
Local diskSingle-node, dev/small deployments
S3 / GCS / Azure BlobProduction, cheap long-term retention
MinIOSelf-hosted object storage
# Point at S3 for production storage
export ZO_LOCAL_MODE=false
export ZO_S3_BUCKET_NAME=my-o2-bucket
export ZO_S3_REGION_NAME=us-east-1

Ingesting Data

SourceHow
OpenTelemetrySend OTLP to /api/{org}/v1/traces, /v1/logs, /v1/metrics
HTTP JSONPOST /api/{org}/{stream}/_json
Fluent Bit / VectorOutput plugin to the O2 HTTP endpoint
Prometheus remote write/api/{org}/prometheus/api/v1/write
SyslogTCP/UDP listener
# Bulk-ingest JSON logs
curl -u "$USER:$PASS" -X POST \
  "http://localhost:5080/api/default/app_logs/_json" \
  -H "Content-Type: application/json" \
  -d '[{"level":"error","message":"db timeout","service":"api"}]'

Querying (SQL)

-- Find recent errors for one service
SELECT * FROM app_logs
WHERE level = 'error' AND service = 'api'
ORDER BY _timestamp DESC
LIMIT 100;

-- Count errors per service over time
SELECT service, count(*) AS errors
FROM app_logs
WHERE level = 'error'
GROUP BY service
ORDER BY errors DESC;
FeatureNote
SQL queriesFamiliar syntax over log streams
Full-text searchmatch_all('timeout')
Time rangeSelected in the UI or via _timestamp filters
Saved searchesReusable queries

Core Concepts

TermMeaning
OrganizationTop-level tenant
StreamA named data stream (like an index)
SchemaInferred from ingested data
FunctionVRL transform applied at ingest or query
AlertScheduled query + destination

Alerts & Dashboards

CapabilityHow
Scheduled alertQuery + threshold + evaluation interval
Real-time alertTrigger on matching ingested records
DestinationsWebhook, Slack, email, PagerDuty
DashboardsBuild panels from SQL queries
TemplatesReusable alert message formats

Ingest-Time Functions (VRL)

# Redact a field and derive a new one at ingest
.email = "REDACTED"
.status_class = floor(.status / 100)

Functions let you scrub PII or enrich records before storage — cheaper than doing it at query time.

OpenObserve vs Alternatives

AspectOpenObserveElasticsearch/ELKGrafana Loki
StorageObject storage (Parquet)Local disk indicesObject storage (chunks)
Cost profileVery lowHighLow
QuerySQLQuery DSL / KQLLogQL
ScopeLogs + metrics + tracesLogs (+ APM)Logs (Grafana stack for rest)
SetupSingle binaryMulti-componentMulti-component

Pairs with OpenTelemetry for instrumentation; compare with Grafana Loki and Elasticsearch.

Resources