TL;DR — Resumo Rápido

Vector é um pipeline de observabilidade em Rust da Datadog. Colete logs, métricas e traces de qualquer fonte e envie-os para qualquer destino com VRL.

Vector é um pipeline de dados de observabilidade de alto desempenho escrito em Rust, mantido pela Datadog. Ele coleta logs, métricas e traces de qualquer fonte, transforma-os com VRL (Vector Remap Language) e os roteia para qualquer destino, tudo em um único binário vinculado estaticamente que usa uma fração da memória consumida pelo Logstash ou Fluentd. Este guia cobre o stack completo do Vector: arquitetura, instalação, configuração, transformações VRL, padrões de implantação, garantias de entrega e um pipeline de produção que coleta logs do Nginx e os roteia para Loki e ClickHouse.

Pré-requisitos

  • Servidor Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) ou macOS para testes locais.
  • Docker ou cluster Kubernetes (opcional, para implantações em contêiner).
  • Familiaridade básica com configuração YAML.
  • Destinos em execução e acessíveis (Loki, Elasticsearch, ClickHouse, S3, etc.).

Arquitetura do Vector

O Vector processa dados de observabilidade como um grafo acíclico dirigido (DAG) de fontes → transformações → destinos.

  • Fontes — ingerem dados de arquivos, journals, sockets, HTTP, Kafka, APIs em nuvem.
  • Transformações — analisam, enriquecem, filtram, roteiam, agregam ou deduplicam eventos.
  • Destinos — entregam dados a sistemas de armazenamento, busca, métricas e alertas.

O Vector alcança seu throughput por meio de várias decisões de design nativas do Rust:

  • Análise sem cópia — as linhas de log são analisadas no lugar sem alocações extras de heap.
  • Concorrência adaptativa — o Vector ajusta automaticamente o número de requisições em voo para cada destino usando um algoritmo AIMD, evitando sobrecarga sem configuração manual.
  • Confirmações de ponta a ponta — uma linha de log não é deletada de sua fonte até que todos os destinos confirmem o recebimento.
  • Buffers em disco — eventos transbordam para disco quando a fila em memória enche, sobrevivendo a reinicializações.

Instalação

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

Configuração

O Vector lê vector.yaml (ou vector.toml, vector.json) de /etc/vector/ por padrão:

data_dir: /var/lib/vector

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

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

sinks:
  meu_destino:
    type: loki
    inputs: ["minha_transformacao"]
    endpoint: "http://loki:3100"
    labels:
      job: nginx

Cada componente tem uma chave de string única. inputs conecta os componentes entre si.


Referência de Fontes

FonteChave typeDescrição
Rastreamento de arquivosfileRastreia arquivos de log com padrões glob
Journal systemdjournaldLê do journald com filtros de unidade
Contêineres Dockerdocker_logsColeta do socket do daemon Docker
Pods do Kuberneteskubernetes_logsColeta nativa de k8s com metadados de pod
Syslog UDP/TCPsyslogRecebe mensagens syslog RFC 3164 / RFC 5424
Servidor HTTPhttp_serverExpõe endpoint HTTP para receber logs
KafkakafkaConsome de um ou mais tópicos Kafka
Métricas do hosthost_metricsColeta CPU, memória, disco, rede
Métricas internasinternal_metricsContadores de throughput e erro do próprio Vector

VRL — Vector Remap Language

VRL é a linguagem de transformação no núcleo do Vector. É uma linguagem de expressões tipada estaticamente projetada para ser rápida, segura e legível. Cada programa VRL recebe um evento como . (ponto) e deve retornar o evento mutado.

Analisar JSON

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

O sufixo ! em uma chamada de função significa “abortar o evento se isso falhar.” Eventos com falha são roteados para a saída dropped do componente.

Analisar Syslog

transforms:
  analisar_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 e Redação 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)

Análise com Regex para Nginx

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

Referência de Transformações

TransformaçãoPropósito
remapTransformação VRL completa — analisar, enriquecer, filtrar, mutar
filterDescartar eventos que não correspondam a uma condição VRL
routeDividir o stream em pistas nomeadas por condição
aggregateCombinar múltiplos eventos em um (agrupamento, janelas de tempo)
dedupeDescartar eventos duplicados em uma janela de tempo
sampleManter uma porcentagem configurável de eventos
log_to_metricDerivar contadores/gauges de campos de log

Referência de Destinos

DestinoChave typeCaso de uso
LokilokiArmazenamento de logs do Grafana
Elasticsearch / OpenSearchelasticsearchBusca de texto completo e análise
ClickHouseclickhouseArmazenamento analítico de logs de alto volume
S3 / R2aws_s3Arquivamento de longo prazo
KafkakafkaRepublica para consumidores downstream
Prometheus Exporterprometheus_exporterExpõe métricas em /metrics
Datadog Logsdatadog_logsEnvia para a ingestão do Datadog
Splunk HECsplunk_hec_logsEnvia para o Splunk HTTP Event Collector

Buffers e Garantias de Entrega

Para produção, habilite buffers em disco e confirmações:

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

Com acknowledgements.enabled: true, o Vector aguarda a confirmação do destino antes de avançar a posição de leitura na fonte, alcançando entrega durável pelo menos uma vez.


Testes Unitários de Transformações

tests:
  - name: "analisar_nginx processa requisição 200 corretamente"
    inputs:
      - insert_at: analisar_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: analisar_nginx
        conditions:
          - type: vrl
            source: |
              assert_eq!(.status, 200)
              assert_eq!(.method, "GET")
vector test /etc/vector/vector.yaml

Monitoramento do Vector

# Throughput por componente em tempo real
vector top

# Validar configuração sem iniciar
vector validate /etc/vector/vector.yaml

Expor as próprias métricas do Vector para o 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
LinguagemRustRubyCJVMGoGoGo
Memória~20 MB~200 MB~1 MB~512 MB~50 MB~30 MB~60 MB
ThroughputMuito altoMédioAltoMédioAltoMédioAlto
TransformaçõesVRLDSL FluentdLuaRuby/GrokMínimoStagesDSL Alloy
Pipeline de métricasSimPluginLimitadoPluginNãoNãoSim
Buffers em discoNativoPluginSimNativoNativoNãoSim
Testes unitáriosIntegradosNãoNãoNãoNãoNãoLimitado
Kubernetes nativoSimSimSimNãoSimSimSim

Casos Extremos e Armadilhas Comuns

  • VRL ! vs ?parse_json! aborta o evento em caso de erro; parse_json? retorna null. Escolha conscientemente.
  • Rastreamento de posição de arquivos — o Vector armazena offsets em data_dir. Excluir este diretório causa re-ingestão de arquivos existentes.
  • Cardinalidade de labels no Loki — evite usar campos de alta cardinalidade (IDs de usuário) como labels do Loki.
  • Tipos de dados no ClickHouse — predefina o esquema da tabela e defina skip_unknown_fields: true para evitar erros de ingestão.

Resumo

  • Vector é um pipeline de observabilidade baseado em Rust com um modelo DAG de fontes → transformações → destinos.
  • VRL trata toda a análise, enriquecimento, filtragem e roteamento em uma linguagem segura e testável.
  • Modos de implantação: agente (por host), agregador (centralizado), sidecar (pod do Kubernetes).
  • Buffers em disco + confirmações fornecem entrega durável pelo menos uma vez sem perda de dados em falhas.
  • Testes unitários no vector.yaml validam transformações antes da implantação em produção.
  • O Vector gerencia logs e métricas em um único pipeline, substituindo Fluentd, Logstash, Filebeat e Promtail simultaneamente.

Artigos Relacionados