Aller au contenu
Outils medium

Vector : pipeline d'observabilité haute performance

15 min de lecture

Vector collecte, transforme et route vos logs et métriques avec un seul binaire écrit en Rust. Ce guide s'adresse aux profils intermédiaires à avancés qui veulent remplacer un empilement d'agents (Fluentd, Logstash, Promtail) par un pipeline unifié et rapide. Vous installerez Vector 0.56.0 par paquet signé, écrirez vos premières transformations en VRL (Vector Remap Language), validerez un pipeline complet en local, puis verrez comment le déployer sur Kubernetes en mode agent et agrégateur.

  • Installer Vector par paquet .deb/.rpm vérifiable ou par conteneur épinglé.
  • Structurer une configuration en sources, transforms et sinks.
  • Transformer vos événements avec le langage VRL (parsing, filtrage, masquage).
  • Router logs et métriques vers Loki, Prometheus ou Elasticsearch.
  • Valider un pipeline avant de le mettre en production.
  • Déployer Vector sur Kubernetes en agent (DaemonSet) et agrégateur.

Vector se positionne comme l'alternative moderne à Fluentd et Logstash. Là où ces outils reposent sur Ruby ou la JVM, Vector est un binaire Rust compilé, sans runtime à installer, avec une empreinte mémoire faible et un débit élevé. Il gère logs et métriques dans la même pipeline, ce qui évite de faire cohabiter deux agents distincts sur chaque machine.

CaractéristiqueVectorFluentdLogstash
LangageRustRubyJava (JVM)
Empreinte mémoirefaible (~50 Mo)moyenne (~100 Mo)élevée (~500 Mo)
Logs + métriquesnatifpluginsnatif
TransformationVRLfiltres RubyGrok/Ruby
Runtime requisaucunRubyJVM

Vector fonctionne en mode agent (installé sur chaque machine, il collecte localement) ou agrégateur (il centralise les flux de plusieurs agents avant de les router). Dans les deux cas, la configuration s'articule autour de trois étages que les données traversent de gauche à droite.

ÉtageRôleComposants typiques
SourcesPoint d'entrée des donnéesfile, journald, kubernetes_logs, prometheus_scrape, syslog, http_server, demo_logs
TransformsTraitement et enrichissementremap (VRL), filter, dedupe, sample, reduce, aggregate
SinksDestination de sortieloki, prometheus_remote_write, elasticsearch, kafka, aws_s3, console

Chaque composant porte un nom unique. Les transforms et les sinks déclarent leurs inputs, c'est-à-dire les composants dont ils consomment les événements. C'est ce graphe de dépendances qui définit le trajet des données, pas l'ordre d'écriture dans le fichier.

Vector se distribue en paquets signés pour Debian/Ubuntu et RHEL, en conteneur et via un chart Helm. Épinglez toujours la version : ici 0.56.0, la dernière stable publiée le 3 juin 2026.

Téléchargez le paquet .deb officiel épinglé, puis installez-le avec apt qui vérifie l'intégrité de l'archive :

Fenêtre de terminal
VECTOR_VERSION=0.56.0
curl -fsSL -o /tmp/vector.deb \
"https://github.com/vectordotdev/vector/releases/download/v${VECTOR_VERSION}/vector_${VECTOR_VERSION}-1_amd64.deb"
sudo apt install -y /tmp/vector.deb
vector --version

La sortie doit afficher vector 0.56.0. Vector installe aussi une unité systemd (vector.service) qui lit /etc/vector/vector.yaml.

Avant de brancher Vector sur une infrastructure réelle, testez-le hors ligne avec la source demo_logs, qui génère des événements synthétiques. Vous validez ainsi la mécanique source → transform → sink sans dépendre d'une machine à instrumenter.

  1. Écrire la configuration dans un fichier vector.yaml. La source produit des lignes syslog, la transform ajoute deux champs, le sink les affiche en JSON :

    vector.yaml
    sources:
    demo:
    type: demo_logs
    format: syslog
    interval: 0.3
    transforms:
    enrich:
    type: remap
    inputs:
    - demo
    source: |
    .env = "lab"
    .processed_by = "vector"
    sinks:
    out:
    type: console
    inputs:
    - enrich
    encoding:
    codec: json
  2. Valider la configuration avant de lancer quoi que ce soit. Vector compile le VRL et vérifie chaque composant :

    Fenêtre de terminal
    vector validate vector.yaml

    La sortie doit se terminer par Validated, avec une coche devant Component configuration et Health check "out". Une erreur de VRL est signalée ici, pas au démarrage.

  3. Lancer le pipeline et observer les événements enrichis défiler en console :

    Fenêtre de terminal
    vector --config vector.yaml

    Chaque ligne affichée contient vos deux champs ajoutés :

    {"env":"lab","host":"localhost","message":"<34>1 2026-07-06T08:15:17.179Z testbench.com kernel_keith 3751 ID618 - Pretty pretty pretty good","processed_by":"vector","service":"vector","source_type":"demo_logs","timestamp":"2026-07-06T08:15:17.179Z"}

    La présence de "env":"lab" et "processed_by":"vector" confirme que la transform s'applique bien à chaque événement. Coupez avec Ctrl+C.

Une fois la mécanique comprise, voici une configuration proche de la production : deux sources (fichiers applicatifs et journald), une transform qui parse le JSON et enrichit, un sink Loki.

vector.yaml
sources:
app_logs:
type: file
include:
- /var/log/app/*.log
journald:
type: journald
current_boot_only: true
transforms:
parse_json:
type: remap
inputs:
- app_logs
source: |
. = parse_json!(.message)
.timestamp = now()
enrich:
type: remap
inputs:
- parse_json
- journald
source: |
.labels.env = "production"
.labels.host = get_hostname!()
sinks:
loki:
type: loki
inputs:
- enrich
endpoint: http://loki:3100
labels:
env: "{{ labels.env }}"
host: "{{ labels.host }}"
app: "{{ .app_name }}"
encoding:
codec: json

Le point de vigilance côté Loki est la cardinalité des labels : n'exposez en label que des valeurs à faible variété (env, host, app). Mettre un identifiant de requête ou un timestamp en label ferait exploser le nombre de flux et dégraderait Loki.

VRL est le cœur de Vector. C'est là que vous parsez, filtrez, enrichissez et masquez. Le langage est compilé : une fonction avec ! (comme parse_json!) échoue à la validation si son résultat n'est pas géré, ce qui vous force à traiter les cas d'erreur.

# Assigner une valeur
.new_field = "value"
# Parser du JSON (le ! échoue à la compilation si non géré)
. = parse_json!(.message)
# Conditions
if .status >= 500 {
.level = "error"
} else {
.level = "info"
}
# Supprimer un champ
del(.password)
# Renommer en récupérant la valeur supprimée
.source = del(.src)
FonctionDescriptionExemple
parse_json!Parse une chaîne JSON. = parse_json!(.message)
parse_syslog!Parse une ligne syslog. = parse_syslog!(.message)
to_stringConvertit en chaîne.count = to_string(.count)
containsTeste une sous-chaîneif contains(.path, "/api")
replaceRemplace un motif.msg = replace(.msg, "secret", "[REDACTED]")
get_hostname!Nom d'hôte de la machine.host = get_hostname!()
nowTimestamp courant.timestamp = now()

Le masquage des données sensibles au plus près de la collecte évite qu'un secret parte dans votre système de logs. VRL le fait en quelques lignes :

# Masquer les emails avec une regex
.message = replace(.message, r'\b[\w.]+@[\w.]+\.\w+\b', "[EMAIL]")
# Masquer un en-tête d'autorisation s'il existe
if exists(.headers.authorization) {
.headers.authorization = "[REDACTED]"
}
# Supprimer purement les champs interdits
del(.password)
del(.credit_card)

Au-delà des fichiers, Vector expose des sources adaptées à chaque contexte. En environnement conteneurisé, kubernetes_logs lit directement les logs des pods ; prometheus_scrape récupère des métriques ; http_server reçoit des événements poussés par une application.

sources:
kubernetes_logs:
type: kubernetes_logs
auto_partial_merge: true
exclude_paths_glob_patterns:
- "**/kube-system/**"
prometheus_metrics:
type: prometheus_scrape
endpoints:
- http://localhost:9090/metrics
scrape_interval_secs: 15
http_logs:
type: http_server
address: 0.0.0.0:8080
encoding: json

Côté sinks, la destination dépend de la nature des données. Les logs partent vers Loki ou Elasticsearch, les métriques vers Prometheus en remote_write.

sinks:
loki:
type: loki
inputs:
- enrich
endpoint: http://loki:3100
labels:
app: "{{ .app }}"
env: "{{ .env }}"
encoding:
codec: json
prometheus:
type: prometheus_remote_write
inputs:
- metrics
endpoint: http://prometheus:9090/api/v1/write
elasticsearch:
type: elasticsearch
inputs:
- enrich
endpoints:
- http://elasticsearch:9200
index: "logs-%Y-%m-%d"
auth:
strategy: basic
user: elastic
password: "${ES_PASSWORD}"

Sur Kubernetes, le motif classique combine deux rôles. Les agents tournent en DaemonSet (un par nœud) et collectent les logs des pods. Ils envoient tout à un agrégateur central, seul point qui parle aux backends. Cela concentre la logique de routage et limite le nombre de connexions vers Loki ou Elasticsearch.

values-agent.yaml
role: Agent
customConfig:
sources:
kubernetes_logs:
type: kubernetes_logs
transforms:
parse_logs:
type: remap
inputs:
- kubernetes_logs
source: |
.cluster = "production"
sinks:
to_aggregator:
type: vector
inputs:
- parse_logs
address: vector-aggregator:6000

L'agrégateur reçoit le flux des agents via la source vector et le route vers le backend final :

values-aggregator.yaml
role: Aggregator
customConfig:
sources:
vector_agents:
type: vector
address: 0.0.0.0:6000
sinks:
loki:
type: loki
inputs:
- vector_agents
endpoint: http://loki:3100
labels:
namespace: "{{ kubernetes.pod_namespace }}"
pod: "{{ kubernetes.pod_name }}"

Un collecteur qui perd des événements en silence est pire que pas de collecteur. Vector expose ses propres métriques au format Prometheus via la source interne internal_metrics, à scraper comme n'importe quelle cible.

api:
enabled: true
address: 0.0.0.0:8686
playground: true
sources:
internal_metrics:
type: internal_metrics
sinks:
prometheus_exporter:
type: prometheus_exporter
inputs:
- internal_metrics
address: 0.0.0.0:9598
MétriqueCe qu'elle indique
vector_events_in_totalÉvénements reçus par les sources
vector_events_out_totalÉvénements émis par les sinks
vector_buffer_eventsÉvénements en attente dans les buffers
vector_component_errors_totalErreurs par composant

Surveillez surtout l'écart entre events_in et events_out et la hausse de component_errors_total : ce sont les signes qu'un sink est trop lent ou qu'une transform échoue.

Ces réflexes évitent les pièges les plus fréquents en production :

  • Transformer en VRL, pas en regex ad hoc éparpillées : le code reste lisible et validable.
  • Activer les buffers disque sur les sinks critiques pour absorber une panne temporaire du backend sans perdre d'événements.
  • Limiter la cardinalité des labels envoyés à Loki : uniquement des valeurs à faible variété.
  • Séparer agents et agrégateur dès que le volume grossit, pour centraliser le routage.
  • Superviser Vector avec ses métriques internes, sinon les pertes passent inaperçues.
SymptômeCause probableSolution
events droppedBuffer plein, sink lentAugmenter le buffer ou accélérer le sink
Mémoire élevéeTrop de transforms ou gros buffersSimplifier la pipeline, borner les buffers
Erreur VRL au démarrageSyntaxe ou type incorrectvector validate et corriger avant déploiement
Aucune sortieSink mal configuré ou inputs erronéVérifier le graphe inputs et la connexion au sink

Les trois commandes à connaître pour diagnostiquer :

Fenêtre de terminal
# Valider la configuration (compile le VRL)
vector validate /etc/vector/vector.yaml
# Lancer en local pour observer le flux
vector --config /etc/vector/vector.yaml
# Activer les logs détaillés
VECTOR_LOG=debug vector --config /etc/vector/vector.yaml
  • Rust, un seul binaire : pas de runtime Ruby ou JVM à maintenir.
  • VRL compilé : les erreurs de transformation sont attrapées à la validation, pas en production.
  • Pipeline unifié : logs et métriques dans le même outil.
  • Deux modes : agent léger sur chaque nœud, agrégateur pour centraliser.
  • vector validate : le réflexe à intégrer en CI avant tout déploiement.
  • Superviser Vector avec internal_metrics pour détecter les pertes.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn