可观测性数据收集集大成者 Vector 介绍

Vector 是一款开源的可观测性数据收集、转换和路由工具,常被用作 Logstash 替代方案。本文介绍 Vector 的 Source、Transform、Sink pipeline 模型、安装方式、配置示例,以及 Agent、Aggregator、Daemon、Sidecar 等部署模式。

作者 秦晓辉

如果企业提供 IT 在线服务,可观测性能力基本是必需品。但可观测性能力的构建并不轻松:数据可能来自 exporter、Telegraf、OpenTelemetry、日志文件、StatsD 等不同入口,采集之后还要做过滤、转换、聚合、采样和路由。

本文介绍一款开源的数据收集和路由工具:Vector。它的价值不只是“采集日志”,而是用统一的 pipeline 把日志和指标从各种 Source 接进来,在 Transform 阶段加工,再通过 Sink 发往 Elasticsearch、S3、ClickHouse、Kafka 等后端。

核心摘要

  • Vector 常被用作 Logstash 的替代方案,采用 Rust 编写,官方声称性能比同类方案快 10 倍。
  • Vector 的核心模型是 Source -> Transform -> Sink:Source 负责采集,Transform 负责加工,Sink 负责转发。
  • Vector 不只处理日志,也可以处理指标,还可以从日志中提取指标。
  • Vector 可部署为 Agent 或 Aggregator;在 Agent 场景下,又可以采用 Daemon 或 Sidecar 模式。
  • 如果你正在被多种采集器、多种日志格式和多种后端存储折腾,Vector 值得纳入可观测性数据管道选型。

Vector 是什么

Vector 通常被拿来和 Logstash 对比。Logstash 属于 ELK 生态,使用广泛,但不少团队会被它的资源消耗和性能问题困扰。Vector 使用 Rust 编写,定位是高性能、可靠、供应商中立的可观测性数据管道。

Vector 来自 Datadog。如果你了解监控和可观测性,大概率知道 Datadog。Datadog 在 2021 年左右收购了 Vector,现在 Vector 已经开源:

Vector 不止可以收集、路由日志数据,也可以路由指标数据,甚至可以从日志中提取指标。下面是 Vector 的架构图:

vector架构图

Vector 的 pipeline 模型

Vector 的处理模型和很多数据管道工具类似,核心是 pipeline:

环节 作用 常见问题
Source 从文件、网络、采集协议等入口读取数据 数据从哪里来
Transform 对数据做解析、过滤、字段处理、格式转换 数据如何变成可用结构
Sink 把处理后的数据发送到后端系统 数据最终到哪里去

这个模型的好处是边界清晰。日志从 Source 进来之后,可以在 Transform 中完成结构化处理,再交给一个或多个 Sink。对可观测性平台来说,这比把采集、解析、路由逻辑散落在多个脚本或多个采集器里更容易维护。

Vector 官方强调的特点包括:

  • 快速可靠:Vector 采用 Rust 构建,速度快,内存效率高,目标是处理要求较高的工作负载。
  • 端到端:Vector 希望成为把可观测性数据从 A 点送到 B 点所需的统一工具,可作为守护进程、边车或聚合器部署。
  • 统一:Vector 支持日志和指标,适合统一收集和处理可观测性数据。
  • 供应商中立:Vector 不绑定特定供应商平台,强调开放生态和避免锁定。
  • 可编程转换:Vector 的转换能力可配置、可编程,适合处理复杂的数据加工场景。

Vector 安装

Vector 的安装比较简单,一条命令即可搞定。其他安装方式可以参考其 官方文档

curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | bash

Vector 配置测试:读取 syslog 并输出 JSON

Vector 的配置文件可以是 YAML、JSON、TOML 格式。下面是一个 TOML 示例:读取 /var/log/system.log 日志文件,把 syslog 格式的日志转换成 JSON,最后输出到标准输出。

[sources.syslog_demo]
type = "file"
include = ["/var/log/system.log"]
data_dir = "/Users/ulric/works/vector-test"

[transforms.remap_syslog]
inputs = [ "syslog_demo"]
type = "remap"
source = '''
  structured = parse_syslog!(.message)
  . = merge(., structured)
'''

[sinks.emit_syslog]
inputs = ["remap_syslog"]
type = "console"
encoding.codec = "json"

Source:从文件读取日志

[sources.syslog_demo] 定义了一个名为 syslog_demo 的 Source。这个 Source 的类型是 file,表示从文件中读取数据;include 指定文件路径;data_dir 是 Vector 存放 checkpoint 数据的目录,只要给一个可写目录即可。

Transform:用 remap 做结构化转换

[transforms.remap_syslog] 定义了一个名为 remap_syslog 的 Transform。它的上游是 syslog_demo,类型是 remap

remap 是 Vector 里很重要的转换能力。上面这段配置的逻辑是:

  • 来自 syslog_demo 的日志原文位于 message 字段中。除了 message,Vector 还会附加 hosttimestamp 等字段。
  • parse_syslog!(.message) 先把 syslog 原文解析为结构化数据。
  • merge(., structured) 再把解析后的结构化字段与原有字段合并,继续传给 pipeline 的后续环节。

Sink:输出到控制台

[sinks.emit_syslog] 定义了一个名为 emit_syslog 的 Sink。它从 remap_syslog 接收数据,输出到 console,并通过 encoding.codec = "json" 指定输出格式为 JSON。

启动 Vector:

vector -c vector.toml

如果机器上存在 /var/log/system.log,就可以看到类似下面的输出:

ulric@ulric-flashcat vector-test % vector -c vector.toml
...
{"appname":"syslogd","file":"/var/log/system.log","host":"ulric-flashcat.local","hostname":"ulric-flashcat","message":"ASL Sender Statistics","procid":332,"source_type":"file","timestamp":"2023-09-27T07:31:22Z"}

看到 JSON 输出,就说明日志已经被采集、解析并打印到控制台。控制台只是测试用法,实际环境里 Vector 可以把数据推给 Elasticsearch、S3、ClickHouse、Kafka 等后端。

Vector 部署模式

Vector 可以部署为两个角色:数据采集 Agent,或者数据聚合与路由 Aggregator。

vector部署模式

Agent 模式:Daemon 和 Sidecar

当 Vector 作为 Agent 使用时,又有两种常见模式:Daemon 和 Sidecar。

Daemon 模式旨在收集单个主机上的所有数据,这是更推荐的数据收集方式,因为它更有效地利用主机资源。比如在 Kubernetes 中把 Vector 部署为 DaemonSet,收集节点上所有容器应用的日志。容器应用的日志推荐用 stdout 打印,这也符合云原生 12 要素的思路。

vector架构图

Sidecar 模式则是在每个 Pod 中额外放一个 Vector 容器。它会占用更多资源,毕竟每个 Pod 都要多塞一个 Vector 容器,但灵活性更高,服务所有者可以自行定义日志收集方案,不必完全依赖统一采集方案。

vector sidecar 模式

Aggregator 模式:集中处理和路由

Aggregator 模式更适合做集中转换、路由和转发。多个 Agent 先把数据发到 Aggregator,再由 Aggregator 做统一加工,并推送到不同后端。这样可以把采集侧保持轻量,把较重的处理逻辑放在中间层。

FAQ

Vector 能替代 Logstash 吗?

在日志采集、转换和路由场景中,Vector 通常会被作为 Logstash 的替代方案来评估。原文提到,Vector 采用 Rust 编写,官方声称比同类方案快 10 倍。如果你的痛点是 Logstash 性能和资源消耗,可以重点测试 Vector。

Vector 只能处理日志吗?

不是。Vector 不只可以处理日志,也可以处理指标,还可以从日志中提取指标。它更像一个可观测性数据管道,而不是单一日志采集器。

Daemon 和 Sidecar 怎么选?

如果目标是统一收集主机或 Kubernetes 节点上的日志,Daemon 模式更节省资源,也更符合统一采集的思路。如果每个业务团队都要高度定制采集逻辑,Sidecar 模式更灵活,但资源开销也更大。

Vector 总结

夜莺社区里已经有很多小伙伴从 Logstash 迁移到了 Vector,并普遍表示 Vector YYDS。如果你还没听过 Vector,建议尽快试试。本文最重要的价值就是让你知道有这么个好东西,更多细节请移步 Vector 官方文档。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云