OpenObserve (O2) est une plateforme observabilité open-source pour les logs, les métriques, et les traces, écrite en Rust. Son choix de conception définisseur est de stocker les données dans le stockage d’objets (S3, GCS, MinIO) en Parquet compressé plutôt que sur des disques locaux coûteux — la base de sa prétention de coût de stockage dramatiquement inférieur aux stacks basées sur Elasticsearch. Elle s’expédie comme un binaire unique avec une UI built-in, parle OpenTelemetry nativement, et interroge avec SQL.
Installation
| Méthode | Commande |
|---|
| Binaire | télécharger depuis GitHub Releases, puis ./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 disponible |
| UI | http://localhost:5080 |
| Vérifier | se connecter avec les identifiants root que vous avez défini |
Modes de stockage
| Mode | Utiliser |
|---|
| Disque local | Nœud unique, déploiements dev/petit |
| S3 / GCS / Azure Blob | Production, conservation long-terme pas cher |
| MinIO | Stockage d’objets auto-hébergé |
# Pointer vers S3 pour le stockage de production
export ZO_LOCAL_MODE=false
export ZO_S3_BUCKET_NAME=my-o2-bucket
export ZO_S3_REGION_NAME=us-east-1
Ingérer les données
| Source | Comment |
|---|
| OpenTelemetry | Envoyer OTLP à /api/{org}/v1/traces, /v1/logs, /v1/metrics |
| HTTP JSON | POST /api/{org}/{stream}/_json |
| Fluent Bit / Vector | Plugin Output vers l’endpoint O2 HTTP |
| Prometheus remote write | /api/{org}/prometheus/api/v1/write |
| Syslog | Écouteur TCP/UDP |
# Bulk-ingérer des logs 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"}]'
Interroger (SQL)
-- Trouver les erreurs récentes pour un service
SELECT * FROM app_logs
WHERE level = 'error' AND service = 'api'
ORDER BY _timestamp DESC
LIMIT 100;
-- Compter les erreurs par service dans le temps
SELECT service, count(*) AS errors
FROM app_logs
WHERE level = 'error'
GROUP BY service
ORDER BY errors DESC;
| Feature | Note |
|---|
| Requêtes SQL | Syntaxe familière sur les flux de logs |
| Full-text search | match_all('timeout') |
| Plage de temps | Sélectionnée dans l’UI ou via les filtres _timestamp |
| Saved searches | Requêtes réutilisables |
Concepts de base
| Terme | Signification |
|---|
| Organisation | Tenant de haut niveau |
| Stream | Un flux de données nommé (comme un index) |
| Schéma | Inféré à partir des données ingérées |
| Function | Transformation VRL appliquée à l’ingest ou à la query |
| Alert | Requête programmée + destination |
Alertes & tableaux de bord
| Capability | Comment |
|---|
| Alerte programmée | Requête + seuil + intervalle d’évaluation |
| Alerte en temps réel | Déclencher sur les enregistrements ingérés correspondants |
| Destinations | Webhook, Slack, email, PagerDuty |
| Tableaux de bord | Construire des panels à partir de requêtes SQL |
| Modèles | Formats de message d’alerte réutilisables |
Fonctions Ingest-Time (VRL)
# Redact un champ et dériver un nouveau au ingest
.email = "REDACTED"
.status_class = floor(.status / 100)
Les fonctions vous permettent de nettoyer les PII ou d’enrichir les enregistrements avant le stockage — moins cher que de le faire au query time.
OpenObserve vs alternatives
| Aspect | OpenObserve | Elasticsearch/ELK | Grafana Loki |
|---|
| Stockage | Stockage d’objets (Parquet) | Indices de disque local | Stockage d’objets (chunks) |
| Profil de coût | Très bas | Élevé | Bas |
| Query | SQL | Query DSL / KQL | LogQL |
| Scope | Logs + métriques + traces | Logs (+ APM) | Logs (stack Grafana pour le reste) |
| Setup | Binaire unique | Multi-composant | Multi-composant |
S’associe avec OpenTelemetry pour l’instrumentation ; comparer avec Grafana Loki et Elasticsearch.
Ressources