OpenObserve (O2) es una plataforma de observabilidad de código abierto para registros, métricas y trazas, escrita en Rust. Su elección de diseño definitoria es almacenar datos en almacenamiento de objetos (S3, GCS, MinIO) en Parquet comprimido en lugar de discos locales costosos — la base de su afirmación de costos de almacenamiento dramáticamente más bajos que pilas basadas en Elasticsearch. Se envía como un binario único con una UI integrada, habla OpenTelemetry de forma nativa, y consulta con SQL.
Instalación
| Método | Comando |
|---|
| Binario | descarga desde GitHub Releases, luego ./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 | Gráfico Helm disponible |
| UI | http://localhost:5080 |
| Verificar | inicia sesión con las credenciales raíz que establezca |
Modos de almacenamiento
| Modo | Usar |
|---|
| Disco local | Despliegue nodo único, dev/pequeño |
| S3 / GCS / Azure Blob | Producción, retención a largo plazo barata |
| MinIO | Almacenamiento de objetos auto-alojado |
# Apunta a S3 para almacenamiento de producción
export ZO_LOCAL_MODE=false
export ZO_S3_BUCKET_NAME=my-o2-bucket
export ZO_S3_REGION_NAME=us-east-1
Ingesta de datos
| Fuente | Cómo |
|---|
| OpenTelemetry | Envía OTLP a /api/{org}/v1/traces, /v1/logs, /v1/metrics |
| JSON HTTP | POST /api/{org}/{stream}/_json |
| Fluent Bit / Vector | Complemento de salida al punto final HTTP de O2 |
| Escritura remota de Prometheus | /api/{org}/prometheus/api/v1/write |
| Syslog | Oyente TCP/UDP |
# Ingesta masiva de registros 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"}]'
Consulta (SQL)
-- Encuentra errores recientes para un servicio
SELECT * FROM app_logs
WHERE level = 'error' AND service = 'api'
ORDER BY _timestamp DESC
LIMIT 100;
-- Cuenta errores por servicio en el tiempo
SELECT service, count(*) AS errors
FROM app_logs
WHERE level = 'error'
GROUP BY service
ORDER BY errors DESC;
| Característica | Nota |
|---|
| Consultas SQL | Sintaxis familiar sobre flujos de registro |
| Búsqueda de texto completo | match_all('timeout') |
| Rango de tiempo | Seleccionado en UI o vía filtros _timestamp |
| Búsquedas guardadas | Consultas reutilizables |
Conceptos principales
| Término | Significado |
|---|
| Organización | Inquilino de nivel superior |
| Flujo | Un flujo de datos nombrado (como un índice) |
| Esquema | Inferido de datos ingeridos |
| Función | Transformación VRL aplicada en ingesta o consulta |
| Alerta | Consulta programada + destino |
Alertas y paneles
| Capacidad | Cómo |
|---|
| Alerta programada | Consulta + umbral + intervalo de evaluación |
| Alerta en tiempo real | Desencadena en registros que coinciden ingeridos |
| Destinos | Webhook, Slack, email, PagerDuty |
| Paneles | Construye paneles desde consultas SQL |
| Plantillas | Formatos de mensaje de alerta reutilizables |
Funciones de tiempo de ingesta (VRL)
# Redacta un campo y deriva uno nuevo en ingesta
.email = "REDACTED"
.status_class = floor(.status / 100)
Las funciones te permiten raspar PII o enriquecer registros antes del almacenamiento — más barato que hacerlo en tiempo de consulta.
OpenObserve vs alternativas
| Aspecto | OpenObserve | Elasticsearch/ELK | Grafana Loki |
|---|
| Almacenamiento | Almacenamiento de objetos (Parquet) | Índices de disco local | Almacenamiento de objetos (fragmentos) |
| Perfil de costo | Muy bajo | Alto | Bajo |
| Consulta | SQL | Query DSL / KQL | LogQL |
| Alcance | Registros + métricas + trazas | Registros (+ APM) | Registros (pila Grafana para el resto) |
| Configuración | Binario único | Multi-componente | Multi-componente |
Se empareja con OpenTelemetry para instrumentación; compara con Grafana Loki y Elasticsearch.
Recursos