OpenObserve (O2) è una piattaforma di osservabilità open-source per log, metriche e tracce, scritta in Rust. La sua scelta di progettazione distintiva è l”archiviazione dei dati nell”object storage (S3, GCS, MinIO) in Parquet compresso piuttosto che su dischi costosi e locali — la base della sua affermazione di costi di archiviazione significativamente inferiori rispetto agli stack basati su Elasticsearch. Viene fornito come un singolo binario con un”interfaccia utente incorporata, supporta OpenTelemetry nativamente e interroga con SQL.
Installazione
| Metodo | Comando |
|---|
| Binario | scarica da GitHub Releases, quindi ./openobserve |
| Docker | docker 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 |
| Kubernetes | Helm chart disponibile |
| UI | http://localhost:5080 |
| Verifica | accedi con le credenziali root che hai impostato |
Modalità di archiviazione
| Modalità | Uso |
|---|
| Local disk | Nodo singolo, deployment dev/piccoli |
| S3 / GCS / Azure Blob | Produzione, conservazione a lungo termine economica |
| MinIO | Object storage auto-ospitato |
# Punta a S3 per l''archiviazione di produzione
export ZO_LOCAL_MODE=false
export ZO_S3_BUCKET_NAME=my-o2-bucket
export ZO_S3_REGION_NAME=us-east-1
Ingestione di dati
| Fonte | Come |
|---|
| OpenTelemetry | Invia OTLP a /api/{org}/v1/traces, /v1/logs, /v1/metrics |
| HTTP JSON | POST /api/{org}/{stream}/_json |
| Fluent Bit / Vector | Plugin di output all”endpoint O2 HTTP |
| Prometheus remote write | /api/{org}/prometheus/api/v1/write |
| Syslog | Listener TCP/UDP |
# Ingestione in massa di log JSON
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"}]'
Interrogazione (SQL)
-- Trova errori recenti per un servizio
SELECT * FROM app_logs
WHERE level = 'error' AND service = 'api'
ORDER BY _timestamp DESC
LIMIT 100;
-- Conta gli errori per servizio nel tempo
SELECT service, count(*) AS errors
FROM app_logs
WHERE level = 'error'
GROUP BY service
ORDER BY errors DESC;
| Funzionalità | Nota |
|---|
| Query SQL | Sintassi familiare su flussi di log |
| Ricerca full-text | match_all('timeout') |
| Intervallo di tempo | Selezionato nell”interfaccia o tramite filtri _timestamp |
| Ricerche salvate | Query riutilizzabili |
Concetti principali
| Termine | Significato |
|---|
| Organization | Tenant di primo livello |
| Stream | Un flusso di dati denominato (come un indice) |
| Schema | Dedotto dai dati ingeriti |
| Function | Trasformazione VRL applicata all”ingestione o alla query |
| Alert | Query programmata + destinazione |
Avvisi e dashboard
| Capacità | Come |
|---|
| Avviso programmato | Query + soglia + intervallo di valutazione |
| Avviso in tempo reale | Attiva sui record ingeriti corrispondenti |
| Destinazioni | Webhook, Slack, email, PagerDuty |
| Dashboard | Crea pannelli da query SQL |
| Modelli | Formati di messaggio di avviso riutilizzabili |
Funzioni di ingestione (VRL)
# Cura un campo e deriva uno nuovo all''ingestione
.email = "REDACTED"
.status_class = floor(.status / 100)
Le funzioni ti consentono di pulire PII o arricchire i record prima dell”archiviazione — più economico che farlo al momento della query.
OpenObserve vs Alternative
| Aspetto | OpenObserve | Elasticsearch/ELK | Grafana Loki |
|---|
| Storage | Object storage (Parquet) | Indici su disco locale | Object storage (chunk) |
| Profilo di costo | Molto basso | Alto | Basso |
| Query | SQL | Query DSL / KQL | LogQL |
| Portata | Log + metriche + tracce | Log (+ APM) | Log (stack Grafana per il resto) |
| Setup | Singolo binario | Multi-componente | Multi-componente |
Abbinato con OpenTelemetry per la strumentazione; confronta con Grafana Loki e Elasticsearch.
Risorse