Quickwit - Guide du moteur de recherche cloud-native pour logs
Quickwit est un moteur de recherche open-source, Rust, conçu pour les données append-only — logs, traces, et événements d’audit — qui s’exécute directement sur le stockage d’objets (S3, GCS, Azure). Contrairement à Elasticsearch, il n’a besoin ni de disque local ni d’état de cluster pour les indices, qui découple le calcul du stockage et rend la rétention à l’échelle du pétaoctet économique. Il expose une API de recherche compatible Elasticsearch et est un backend Jaeger natif pour les traces.
Installation
| Méthode | Commande |
|---|
| Script d’installation | `curl -L https://install.quickwit.io |
| Docker | docker run -p 7280:7280 quickwit/quickwit run |
| Kubernetes | Helm chart disponible |
| Démarrer un nœud | ./quickwit run |
| UI / API | http://localhost:7280 |
Concepts de base
| Terme | Signification |
|---|
| Index | Un dataset nommé avec un mapping de doc |
| Split | Un shard indexé immuable stocké dans le stockage d’objets |
| Metastore | Suit les indices/splits (fichier ou PostgreSQL) |
| Source | D’où viennent les documents (Kafka, fichier, API ingest) |
| Rôles de nœud | indexer, searcher, metastore, control plane |
Créer un index
# index-config.yaml
version: 0.8
index_id: app-logs
doc_mapping:
field_mappings:
- name: timestamp
type: datetime
fast: true
input_formats: [rfc3339, unix_timestamp]
- name: level
type: text
tokenizer: raw
- name: service
type: text
tokenizer: raw
- name: message
type: text
tokenizer: default
timestamp_field: timestamp
indexing_settings:
commit_timeout_secs: 30
search_settings:
default_search_fields: [message]
quickwit index create --index-config index-config.yaml
Ingérer les données
| Méthode | Commande |
|---|
| Fichier | quickwit index ingest --index app-logs --input-path logs.json |
| Stdin | `cat logs.json |
| API ingest | POST /api/v1/app-logs/ingest |
| Source Kafka | Définir une source dans la config d’index |
| OTLP | Endpoint OpenTelemetry natif pour logs/traces |
curl -XPOST "http://localhost:7280/api/v1/app-logs/ingest" \
--data-binary @logs.ndjson
Rechercher
# CLI search
quickwit index search --index app-logs --query "level:ERROR AND service:api"
# REST search
curl "http://localhost:7280/api/v1/app-logs/search?query=level:ERROR&max_hits=20"
| Syntaxe de requête | Analyse |
|---|
term | Terme full-text dans les champs par défaut |
field:value | Correspondance de champ exacte |
a AND b, a OR b, NOT a | Logique booléenne |
field:[10 TO 100] | Plage |
"exact phrase" | Correspondance de phrase exacte |
field:prefix* | Correspondance de préfixe |
Agrégations & filtres de temps
# Recherche limitée par temps (utilise le champ timestamp rapide)
curl "http://localhost:7280/api/v1/app-logs/search?query=*&start_timestamp=1753400000&end_timestamp=1753486400"
Quickwit supporte les agrégations style Elasticsearch, donc les dashboards et requêtes existants se portent souvent facilement.
Gérer les indices
| Commande | Description |
|---|
quickwit index list | Lister les indices |
quickwit index describe --index X | Montrer les stats/splits |
quickwit index clear --index X | Supprimer tous les documents |
quickwit index delete --index X | Supprimer l’index |
quickwit split list --index X | Inspecter les splits |
Rétention
retention:
period: 90 days
schedule: daily
Parce que les splits vivent dans le stockage d’objets, la rétention est juste supprimer les anciens splits — bon marché et rapide.
Intégrations
| Cible | Note |
|---|
| Jaeger | Quickwit est un backend de stockage Jaeger natif |
| Grafana | Plugin de source de données pour les dashboards |
| OpenTelemetry | Ingestion OTLP native pour logs et traces |
| API Elasticsearch | Les endpoints de recherche compatibles facilitent la migration |
Quickwit vs alternatives
| Aspect | Quickwit | Elasticsearch | Loki |
|---|
| Stockage | Stockage d’objets uniquement | Disque local | Stockage d’objets |
| Index full-text | Oui (vrai search) | Oui | Basé sur les labels, limité |
| Coût à l’échelle | Très bas | Élevé | Bas |
| Traces | Backend Jaeger natif | Addons APM | Via Tempo |
| Idéal pour | Rétention cheap searchable log/trace | Recherche générale | Logs Grafana-natifs |
Comparer avec Loki et OpenObserve ; associer à Vector pour l’ingestion.
Ressources