TL;DR — Resumen Rápido

Vector es un pipeline de observabilidad en Rust de Datadog. Recolecta logs, métricas y trazas desde cualquier fuente y los enruta con transformaciones VRL.

Vector es un pipeline de datos de observabilidad de alto rendimiento escrito en Rust, mantenido por Datadog. Recolecta logs, métricas y trazas desde cualquier fuente, los transforma con VRL (Vector Remap Language) y los enruta hacia cualquier destino, todo en un único binario enlazado estáticamente que usa una fracción de la memoria que consumen Logstash o Fluentd. Esta guía cubre el stack completo de Vector: arquitectura, instalación, configuración, transformaciones VRL, patrones de despliegue, garantías de entrega y un pipeline de producción que recolecta logs de Nginx y los enruta a Loki y ClickHouse.

Requisitos Previos

  • Servidor Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) o macOS para pruebas locales.
  • Docker o clúster de Kubernetes (opcional, para despliegues en contenedores).
  • Familiaridad básica con configuración YAML.
  • Destinos funcionando y accesibles (Loki, Elasticsearch, ClickHouse, S3, etc.).

Arquitectura de Vector

Vector procesa datos de observabilidad como un grafo dirigido acíclico (DAG) de fuentes → transformaciones → destinos.

  • Fuentes — ingieren datos desde archivos, journals, sockets, HTTP, Kafka, APIs en la nube.
  • Transformaciones — parsean, enriquecen, filtran, enrutan, agregan o deduplicar eventos.
  • Destinos — entregan datos a sistemas de almacenamiento, búsqueda, métricas y alertas.

Bajo el capó, Vector logra su rendimiento mediante varias decisiones de diseño nativas de Rust:

  • Parseo sin copia — las líneas de log se parsean en el lugar sin asignaciones adicionales de heap.
  • Concurrencia adaptativa — Vector ajusta automáticamente el número de peticiones en vuelo hacia cada destino usando un algoritmo AIMD, evitando sobrecarga sin configuración manual.
  • Confirmaciones de extremo a extremo — una línea de log no se elimina de su fuente (o buffer) hasta que todos los destinos configurados confirman su recepción.
  • Buffers en disco — los eventos se desbordan a disco cuando la cola en memoria se llena, sobreviviendo reinicios y evitando pérdidas durante interrupciones del destino.

Instalación

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

Configuración

Vector lee vector.yaml (o vector.toml, vector.json) desde /etc/vector/ por defecto:

data_dir: /var/lib/vector

sources:
  mi_fuente:
    type: file
    include: ["/var/log/nginx/*.log"]

transforms:
  mi_transformacion:
    type: remap
    inputs: ["mi_fuente"]
    source: |
      . = parse_json!(string!(.message))

sinks:
  mi_destino:
    type: loki
    inputs: ["mi_transformacion"]
    endpoint: "http://loki:3100"
    labels:
      job: nginx

Cada componente tiene una clave de cadena única. inputs conecta los componentes entre sí.


Referencia de Fuentes

FuenteClave typeDescripción
Seguimiento de archivosfileSigue archivos de log con patrones glob
Journal systemdjournaldLee de journald con filtros de unidad
Contenedores Dockerdocker_logsRecolecta del socket del daemon Docker
Pods de Kuberneteskubernetes_logsRecolección nativa de k8s con metadatos de pod
Syslog UDP/TCPsyslogRecibe mensajes syslog RFC 3164 / RFC 5424
Servidor HTTPhttp_serverExpone un endpoint HTTP para logs enviados
KafkakafkaConsume de uno o más tópicos de Kafka
Métricas del hosthost_metricsRecolecta CPU, memoria, disco, red
Métricas internasinternal_metricsContadores de rendimiento y error propios de Vector

VRL — Vector Remap Language

VRL es el lenguaje de transformación en el núcleo de Vector. Es un lenguaje de expresiones de tipo estático diseñado para ser rápido, seguro y legible. Cada programa VRL recibe un evento como . (punto) y debe devolver el evento mutado.

Parsear JSON

transforms:
  parsear_json:
    type: remap
    inputs: ["nginx_access"]
    source: |
      . = parse_json!(string!(.message))

El sufijo ! en una llamada de función significa “abortar el evento si esto falla.” Los eventos que fallan se enrutan a la salida dropped del componente.

Parsear Syslog

transforms:
  parsear_syslog:
    type: remap
    inputs: ["syslog_entrada"]
    source: |
      parsed = parse_syslog!(.message)
      .severity = parsed.severity
      .facility = parsed.facility
      .appname = parsed.appname
      .message = parsed.message

Lógica Condicional y Redacción de PII

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(.trace_id_interno)

Parseo con Expresión Regular para Nginx

transforms:
  parsear_nginx:
    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)
      }

Referencia de Transformaciones

TransformaciónPropósito
remapTransformación VRL completa — parsear, enriquecer, filtrar, mutar
filterDescartar eventos que no coincidan con una condición VRL
routeDividir el stream en carriles nombrados por condición
aggregateCombinar múltiples eventos en uno (agrupación, ventanas de tiempo)
dedupeDescartar eventos duplicados dentro de una ventana de tiempo
sampleConservar un porcentaje configurable de eventos
log_to_metricDerivar contadores/medidores desde campos de log

Referencia de Destinos

DestinoClave typeCaso de uso
LokilokiAlmacenamiento de logs de Grafana
Elasticsearch / OpenSearchelasticsearchBúsqueda de texto completo y analítica
ClickHouseclickhouseAlmacenamiento analítico de logs de alto volumen
S3 / R2aws_s3Archivado a largo plazo
KafkakafkaRepublica a consumidores posteriores
Prometheus Exporterprometheus_exporterExpone métricas en /metrics
Datadog Logsdatadog_logsEnvía a la ingesta de Datadog
Splunk HECsplunk_hec_logsEnvía al Splunk HTTP Event Collector

Buffers y Garantías de Entrega

Para producción, habilitar buffers en disco y confirmaciones:

sinks:
  clickhouse_destino:
    type: clickhouse
    inputs: ["parsear_nginx"]
    endpoint: "http://clickhouse:8123"
    database: logs
    table: nginx_access
    buffer:
      type: disk
      max_size: 268435456
      when_full: block
    acknowledgements:
      enabled: true

Con acknowledgements.enabled: true, Vector espera la confirmación del destino antes de avanzar la posición de lectura en la fuente, logrando entrega duradera al menos una vez.


Pruebas Unitarias de Transformaciones

tests:
  - name: "parsear_nginx procesa solicitud 200 correctamente"
    inputs:
      - insert_at: parsear_nginx
        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: parsear_nginx
        conditions:
          - type: vrl
            source: |
              assert_eq!(.status, 200)
              assert_eq!(.method, "GET")
vector test /etc/vector/vector.yaml

Monitorización de Vector

# Rendimiento por componente en tiempo real
vector top

# Validar configuración sin arrancar
vector validate /etc/vector/vector.yaml

Exponer las propias métricas de Vector a Prometheus:

sources:
  metricas_internas:
    type: internal_metrics
    scrape_interval_secs: 15

sinks:
  prometheus:
    type: prometheus_exporter
    inputs: ["metricas_internas"]
    address: "0.0.0.0:9598"

Vector vs Alternativas

CaracterísticaVectorFluentdFluent BitLogstashFilebeatPromtailGrafana Alloy
LenguajeRustRubyCJVMGoGoGo
Memoria~20 MB~200 MB~1 MB~512 MB~50 MB~30 MB~60 MB
RendimientoMuy altoMedioAltoMedioAltoMedioAlto
TransformacionesVRLDSL FluentdLuaRuby/GrokMínimoStagesDSL Alloy
Pipeline de métricasPluginLimitadoPluginNoNo
Buffers en discoNativoPluginNativoNativoNo
Pruebas unitariasIntegradasNoNoNoNoNoLimitado
Kubernetes nativoNo

Casos Límite y Trampas Comunes

  • VRL ! vs ?parse_json! aborta el evento ante un error; parse_json? devuelve null. Elige conscientemente.
  • Seguimiento de posición de archivos — Vector almacena offsets en data_dir. Borrar este directorio causa re-ingesta de archivos existentes.
  • Cardinalidad de etiquetas en Loki — evita usar campos de alta cardinalidad (IDs de usuario, IDs de solicitud) como etiquetas de Loki.
  • Tipos de datos en ClickHouse — predefine el esquema de la tabla y establece skip_unknown_fields: true para evitar errores de ingesta.

Resumen

  • Vector es un pipeline de observabilidad basado en Rust con un modelo DAG de fuentes → transformaciones → destinos.
  • VRL maneja todo el parseo, enriquecimiento, filtrado y enrutamiento en un lenguaje seguro y testeable.
  • Modos de despliegue: agente (por host), agregador (centralizado), sidecar (pod de Kubernetes).
  • Buffers en disco + confirmaciones proveen entrega duradera al menos una vez sin pérdida de datos ante caídas.
  • Pruebas unitarias en vector.yaml validan las transformaciones antes del despliegue en producción.
  • Vector maneja logs y métricas en un único pipeline, reemplazando Fluentd, Logstash, Filebeat y Promtail simultáneamente.

Artículos Relacionados