TL;DR — Kurzzusammenfassung
Vector ist eine Rust-basierte Observability-Pipeline von Datadog. Sammeln Sie Logs und Metriken aus beliebigen Quellen und leiten Sie diese mit VRL weiter.
Vector ist eine hochleistungsfähige Observability-Datenpipeline, geschrieben in Rust und von Datadog gepflegt. Sie sammelt Logs, Metriken und Traces aus beliebigen Quellen, transformiert diese mit VRL (Vector Remap Language) und leitet sie an beliebige Ziele weiter — alles in einer einzigen statisch verlinkten Binärdatei, die nur einen Bruchteil des Speichers verbraucht, den Logstash oder Fluentd benötigen. Dieser Leitfaden behandelt den vollständigen Vector-Stack: Architektur, Installation, Konfiguration, VRL-Transformationen, Deployment-Muster, Zustellungsgarantien und eine Produktionspipeline, die Nginx-Logs sammelt und an Loki und ClickHouse weiterleitet.
Voraussetzungen
- Linux-Server (Ubuntu 22.04+, Debian 12+, RHEL 9+) oder macOS für lokale Tests.
- Docker oder Kubernetes-Cluster (optional, für containerbasierte Deployments).
- Grundkenntnisse der YAML-Konfiguration.
- Laufende und erreichbare Ziele (Loki, Elasticsearch, ClickHouse, S3 usw.).
Vector-Architektur
Vector verarbeitet Observability-Daten als gerichteten azyklischen Graphen (DAG) von Quellen → Transformationen → Ziele.
- Quellen — nehmen Daten aus Dateien, Journals, Sockets, HTTP, Kafka, Cloud-APIs auf.
- Transformationen — parsen, reichern an, filtern, routen, aggregieren oder deduplizieren Ereignisse.
- Ziele — liefern Daten an Speicher-, Such-, Metriken- und Alarmsysteme.
Vector erreicht seinen Durchsatz durch mehrere Rust-native Designentscheidungen:
- Zero-Copy-Parsing — Log-Zeilen werden an Ort und Stelle geparst ohne zusätzliche Heap-Allokationen.
- Adaptive Parallelität — Vector passt automatisch die Anzahl der Anfragen an jedes Ziel per AIMD-Algorithmus an, ohne manuelle Konfiguration.
- End-to-End-Bestätigungen — Eine Log-Zeile wird erst gelöscht, wenn alle konfigurierten Ziele den Empfang bestätigen.
- Disk-Puffer — Ereignisse werden auf Disk ausgelagert, wenn die Speicher-Queue voll ist, und überstehen Neustarts.
Installation
apt (Debian/Ubuntu)
curl -1sLf 'https://repositories.timber.io/public/vector/cfg/setup/bash.deb.sh' \
| sudo -E bash
sudo apt install -y vector
sudo systemctl enable --now vector
yum/dnf (RHEL/Fedora/Rocky)
curl -1sLf 'https://repositories.timber.io/public/vector/cfg/setup/bash.rpm.sh' \
| sudo -E bash
sudo yum install -y vector
sudo systemctl enable --now vector
Docker
docker run -d \
--name vector \
-v /var/log:/var/log:ro \
-v $(pwd)/vector.yaml:/etc/vector/vector.yaml:ro \
timberio/vector:latest-alpine
Kubernetes DaemonSet via Helm
helm repo add vector https://helm.vector.dev
helm repo update
helm install vector vector/vector \
--namespace vector \
--create-namespace \
--values vector-values.yaml
Homebrew (macOS)
brew tap vectordotdev/brew
brew install vector
Konfiguration
Vector liest vector.yaml (oder vector.toml, vector.json) standardmäßig aus /etc/vector/:
data_dir: /var/lib/vector
sources:
meine_quelle:
type: file
include: ["/var/log/nginx/*.log"]
transforms:
meine_transformation:
type: remap
inputs: ["meine_quelle"]
source: |
. = parse_json!(string!(.message))
sinks:
mein_ziel:
type: loki
inputs: ["meine_transformation"]
endpoint: "http://loki:3100"
labels:
job: nginx
Jede Komponente hat einen eindeutigen String-Schlüssel. inputs verbindet die Komponenten miteinander.
Quellen-Referenz
| Quelle | Type-Schlüssel | Beschreibung |
|---|---|---|
| Datei-Tailing | file | Verfolgt Log-Dateien mit Glob-Mustern |
| systemd-Journal | journald | Liest aus journald mit Unit-Filtern |
| Docker-Container | docker_logs | Sammelt vom Docker-Daemon-Socket |
| Kubernetes-Pods | kubernetes_logs | Native k8s-Sammlung mit Pod-Metadaten |
| Syslog UDP/TCP | syslog | Empfängt Syslog-Nachrichten RFC 3164 / RFC 5424 |
| HTTP-Server | http_server | Stellt HTTP-Endpunkt für eingehende Logs bereit |
| Kafka | kafka | Konsumiert von einem oder mehreren Kafka-Topics |
| Host-Metriken | host_metrics | Sammelt CPU, Speicher, Disk, Netzwerk |
| Interne Metriken | internal_metrics | Vectors eigene Durchsatz- und Fehlerzähler |
VRL — Vector Remap Language
VRL ist die Transformationssprache im Kern von Vector. Es ist eine statisch typisierte Ausdruckssprache, die auf Geschwindigkeit, Sicherheit und Lesbarkeit ausgelegt ist. Jedes VRL-Programm empfängt ein Ereignis als . (Punkt) und muss das mutierte Ereignis zurückgeben.
JSON parsen
transforms:
json_parsen:
type: remap
inputs: ["nginx_access"]
source: |
. = parse_json!(string!(.message))
Das Suffix ! bei einem Funktionsaufruf bedeutet “Ereignis abbrechen, wenn dies fehlschlägt.” Fehlgeschlagene Ereignisse werden zur dropped-Ausgabe der Komponente geleitet.
Syslog parsen
transforms:
syslog_parsen:
type: remap
inputs: ["syslog_eingang"]
source: |
parsed = parse_syslog!(.message)
.severity = parsed.severity
.facility = parsed.facility
.appname = parsed.appname
.message = parsed.message
Bedingte Logik und PII-Schwärzung
source: |
if .status_code >= 500 {
.severity = "error"
} else if .status_code >= 400 {
.severity = "warn"
} else {
.severity = "info"
}
.message = redact(.message, filters: [
{ type: "pattern", pattern: r'\b(?:\d[ -]*?){13,16}\b' }
])
del(.interner_trace_id)
Regex-Parsing für Nginx
transforms:
nginx_parsen:
type: remap
inputs: ["nginx_access"]
source: |
parsed, err = parse_regex(.message, r'^(?P<remote_addr>\S+) - (?P<user>\S+) \[(?P<time>[^\]]+)\] "(?P<method>\S+) (?P<path>\S+) (?P<protocol>[^"]+)" (?P<status>\d+) (?P<bytes>\d+)')
if err == null {
. = merge(., parsed)
.status = to_int!(.status)
.bytes = to_int!(.bytes)
del(.message)
}
Transformationen-Referenz
| Transformation | Zweck |
|---|---|
remap | Vollständige VRL-Transformation — parsen, anreichern, filtern, mutieren |
filter | Ereignisse verwerfen, die einer VRL-Bedingung nicht entsprechen |
route | Stream in benannte Bahnen nach Bedingung aufteilen |
aggregate | Mehrere Ereignisse zu einem kombinieren (Batching, Zeitfenster) |
dedupe | Doppelte Ereignisse innerhalb eines Zeitfensters verwerfen |
sample | Einen konfigurierbaren Prozentsatz der Ereignisse behalten |
log_to_metric | Zähler/Gauges aus Log-Feldern ableiten |
Ziele-Referenz
| Ziel | Type-Schlüssel | Anwendungsfall |
|---|---|---|
| Loki | loki | Grafana-Log-Speicher |
| Elasticsearch / OpenSearch | elasticsearch | Volltextsuche und Analyse |
| ClickHouse | clickhouse | Analytischer Log-Speicher für hohes Volumen |
| S3 / R2 | aws_s3 | Langzeitarchivierung |
| Kafka | kafka | Weiterveröffentlichung an nachgelagerte Konsumenten |
| Prometheus Exporter | prometheus_exporter | Metriken auf /metrics exponieren |
| Datadog Logs | datadog_logs | An Datadog-Ingestion senden |
| Splunk HEC | splunk_hec_logs | An Splunk HTTP Event Collector senden |
Puffer und Zustellungsgarantien
Für die Produktion Disk-Puffer und Bestätigungen aktivieren:
sinks:
clickhouse_ziel:
type: clickhouse
inputs: ["nginx_parsen"]
endpoint: "http://clickhouse:8123"
database: logs
table: nginx_access
buffer:
type: disk
max_size: 268435456
when_full: block
acknowledgements:
enabled: true
Mit acknowledgements.enabled: true wartet Vector auf die Bestätigung des Ziels, bevor die Leseposition in der Quelle vorgerückt wird, was dauerhafte At-least-once-Zustellung garantiert.
Unit-Tests für Transformationen
tests:
- name: "nginx_parsen verarbeitet 200-Anfrage korrekt"
inputs:
- insert_at: nginx_parsen
type: log
log_fields:
message: '127.0.0.1 - - [23/Mar/2026:10:00:00 +0000] "GET /api/health HTTP/1.1" 200 42'
outputs:
- extract_from: nginx_parsen
conditions:
- type: vrl
source: |
assert_eq!(.status, 200)
assert_eq!(.method, "GET")
vector test /etc/vector/vector.yaml
Vector überwachen
# Echtzeit-Durchsatz pro Komponente
vector top
# Konfiguration ohne Start validieren
vector validate /etc/vector/vector.yaml
Vectors eigene Metriken an Prometheus exponieren:
sources:
interne_metriken:
type: internal_metrics
scrape_interval_secs: 15
sinks:
prometheus:
type: prometheus_exporter
inputs: ["interne_metriken"]
address: "0.0.0.0:9598"
Vector vs. Alternativen
| Merkmal | Vector | Fluentd | Fluent Bit | Logstash | Filebeat | Promtail | Grafana Alloy |
|---|---|---|---|---|---|---|---|
| Sprache | Rust | Ruby | C | JVM | Go | Go | Go |
| Speicher | ~20 MB | ~200 MB | ~1 MB | ~512 MB | ~50 MB | ~30 MB | ~60 MB |
| Durchsatz | Sehr hoch | Mittel | Hoch | Mittel | Hoch | Mittel | Hoch |
| Transformationen | VRL | Fluentd DSL | Lua | Ruby/Grok | Minimal | Stages | Alloy DSL |
| Metriken-Pipeline | Ja | Plugin | Begrenzt | Plugin | Nein | Nein | Ja |
| Disk-Puffer | Nativ | Plugin | Ja | Nativ | Nativ | Nein | Ja |
| Unit-Tests | Eingebaut | Nein | Nein | Nein | Nein | Nein | Begrenzt |
| Kubernetes-nativ | Ja | Ja | Ja | Nein | Ja | Ja | Ja |
Grenzfälle und häufige Fallstricke
- VRL
!vs?—parse_json!bricht das Ereignis bei Fehler ab;parse_json?gibtnullzurück. Bewusst wählen. - Datei-Positions-Tracking — Vector speichert Offsets in
data_dir. Das Löschen dieses Verzeichnisses verursacht eine Re-Ingestion vorhandener Dateien. - Loki-Label-Kardinalität — Vermeiden Sie die Verwendung von Feldern mit hoher Kardinalität (Benutzer-IDs) als Loki-Labels.
- ClickHouse-Datentypen — Definieren Sie das Tabellenschema vor und setzen Sie
skip_unknown_fields: true, um Ingestions-Fehler zu vermeiden.
Zusammenfassung
- Vector ist eine Rust-basierte Observability-Pipeline mit einem DAG-Modell aus Quellen → Transformationen → Zielen.
- VRL übernimmt das gesamte Parsen, Anreichern, Filtern und Routen in einer sicheren, testbaren Sprache.
- Deployment-Modi: Agent (pro Host), Aggregator (zentralisiert), Sidecar (Kubernetes-Pod).
- Disk-Puffer + Bestätigungen bieten dauerhafte At-least-once-Zustellung ohne Datenverlust bei Abstürzen.
- Unit-Tests in
vector.yamlvalidieren Transformationen vor dem Produktions-Deployment. - Vector verwaltet Logs und Metriken in einer einzigen Pipeline und ersetzt gleichzeitig Fluentd, Logstash, Filebeat und Promtail.