Vector v0.34.0 版本解析:protobuf 编码器、磁盘缓冲安全与可观测性指标重构

原创2026-10-10 23:00:391,812 阅读
文章标签:可观测性数据集成日志分析后端

Vector v0.34.0 版本解析:protobuf 编码器、磁盘缓冲安全与可观测性指标重构

本文以 Vector 官方发布的 v0.34.0(发布日期 2023-11-07,对应仓库内 release notes CUE 源文件)为主线,系统梳理该版本引入的新功能、行为变更与破坏性更新,并对照当前仓库源码说明其底层实现。读完本文,你将掌握 protobuf 编码器的配置方法、磁盘缓冲持久化事件元数据(含密钥)的安全取舍、Datadog Metrics sink 的 v2 API 迁移、新的时间戳编码格式,以及一批内部指标与配置项的清理迁移路径。

版本概览与升级前提

v0.34.0 发布于 2023 年 11 月 7 日,除常规的增强与缺陷修复外,重点包含三项值得关注的内容:

  1. 面向 sinks 的全新 protobuf 编码器(通过 encoding.codec 配置);
  2. 磁盘缓冲(disk buffer)开始持久化事件元数据(metadata)与密钥(secrets),使 sink 侧能够访问这些数据——该改动带有潜在安全影响;
  3. 正式废弃托管于 repositories.timber.io 的 OS 软件包仓库,迁移至 apt.vector.dev 与 yum.vector.dev,旧仓库将于 2024 年 2 月 28 日 停止服务。

该版本同时包含多处 breaking change,升级前务必核对官方 upgrade guide 中列出的迁移清单。仓库内 release notes 页面入口 的正文内容即由上述 CUE 数据源生成,本文以下内容均以该数据源为事实基准,并辅以源码佐证。

新增 protobuf 编码器:让 sink 输出二进制结构化数据

v0.34.0 为 sinks 引入 protobuf 编码能力,用户只需在 sink 配置中将 encoding.codec 设置为 protobuf 即可启用(对应 PR #18598,由社区贡献者 goakley 实现)。从源码结构看,该能力落地于 lib/codecs/src/encoding/format/mod.rs:新增 ProtobufSerializer、ProtobufSerializerConfig 与 ProtobufSerializerOptions,它们与已有的 JsonSerializer、AvroSerializer 等并列为同一编码格式体系,因此对所有基于 codecs 框架的 sinks 通用。

sinks:
  my_http_sink:
    type: http
    inputs: [my_source]
    encoding:
      codec: protobuf
    # 其余 HTTP sink 配置……

其对称的读取侧同样已存在于 codecs 框架中:lib/codecs/src/decoding/format/mod.rs 导出了 ProtobufDeserializer 系列类型,并且 OTLP 相关 deserializer 也复用了该 protobuf 解析基础能力,说明 protobuf 编解码在 Vector 内部形成了完整的闭环。

注意事项:该 protobuf 编码器在 v0.34.0 中存在已知问题——sink 中实际无法正常工作(见 GitHub issue #19230,已在 v0.34.2 修复)。因此在部署到生产环境前,建议至少升级到修复后的补丁版本。

事件元数据与密钥持久化到磁盘缓冲:能力提升与安全权衡

从 v0.34.0 起,事件元数据(event metadata)在写入磁盘缓冲时会一并持久化,其中可能包含诸如 Datadog API key、Splunk HEC token 之类的密钥,确保它们在 sink 侧仍然可用。此前磁盘缓冲仅保存事件主体,sink 在处理时会丢失这些元数据。

这一改动带来两个直接后果:

  • 功能上:需要依赖事件元数据的 sink(例如按元数据中的密钥进行鉴权的 Datadog、Splunk HEC sink)在磁盘缓冲场景下行为更完整;
  • 安全上:密钥可能被持久化到磁盘缓冲文件中,形成明文落盘风险。

作为配套措施,Vector 在同一改动中(PR #18816、#18895)收紧了磁盘缓冲数据文件在 Unix 平台上的文件权限:此前文件对所有人可读(world-readable),现在仅限 Vector 进程用户(通常为 vector)可写、同组用户可读。

推荐的加固实践

根据官方 release highlight 给出的建议,可以从两个方向处理:

  1. 加固磁盘缓冲:确保承载磁盘缓冲目录的文件系统权限与访问控制足够严格,仅允许 Vector 进程用户访问;
  2. 避免在事件中存储密钥:尽量不把密钥直接写入事件内容或元数据,例如优先使用 Vector 的 secrets 管理机制(文件、目录、AWS Secrets Manager、exec 等 secret backend)在运行时注入敏感信息,而不是将其内嵌进事件本身。

需要说明的是,这类密钥明文持久化属于该版本的设计取舍,用户必须自行评估自身的合规与安全要求。

可观测性重构:HTTP/gRPC 服务指标、标签清理与指标去重

v0.34.0 在可观测性方面动作密集,既有新增也有破坏性移除。

新增 HTTP 与 gRPC 服务端指标

运行 HTTP 服务的 source/sink 新增三组内部指标(PR #18887):

  • http_server_requests_received_total
  • http_server_responses_sent_total
  • http_server_handler_duration_seconds

运行 gRPC 服务的组件新增:

  • grpc_server_messages_received_total
  • grpc_server_messages_sent_total
  • grpc_server_handler_duration_seconds

这些指标为 HTTP/gRPC 类型的 source/sink(如 http_server source、各类 HTTP sink)提供了更细粒度的服务端观察能力。

移除与废弃的指标(breaking)

  • 移除所有内部指标上的 component_name 标签,改用 component_id(PR #18942);
  • 从 TCP 类 source 发布的 component_received_bytes_total 中移除 peer_addr 标签,以消除该指标的高基数(cardinality explosion)问题(PR #18982);
  • 移除与 component_errors_total 冗余的一批废弃指标(PR #18965);
  • 废弃 HTTP 组件相关的 requests_completed_total、request_duration_seconds、requests_received_total 三组指标(PR #18972)。

docker_logs 与请求取消的指标行为修正

  • docker_logs source 不再为乱序(out-of-order)日志累加 component_errors_total,因为乱序并不属于错误(PR #18649);
  • 当 incoming 请求在事件被推送到下游组件之前被取消时,各 source 现在会正确输出日志并累加 component_discarded_events_total(PR #18859),使丢弃事件可被观测。

时间戳编码新增 Unix 系列格式

sink 的 encoding.timestamp_format 新增四个取值(PR #18817,由 srstrickland 贡献):

取值 含义
unix_float Unix 时间戳(浮点数)
unix_ms Unix 时间戳(毫秒)
unix_us Unix 时间戳(微秒)
unix_ns Unix 时间戳(纳秒)

对应实现位于 lib/codecs/src/encoding/transformer.rs,可看到这四个格式分别映射到 timestamp_millis()、timestamp_micros()、纳秒换算与浮点形式,供对时间精度有不同要求的后端选用。

编码与解码的健壮性修复

native_json 对无穷浮点值的编码

native_json codec 不再因为编码 64 位浮点无穷值(infinity)而报错,而是将其编码为字符串 inf 与 -inf(PR #18650)。这一改动最常见的触发场景是编码 histogram 指标,其最后一个 bucket 上界通常为无穷大。

http_server source 支持 native/native_json 指标

http_server source 在解码 native 或 native_json codec 的指标时不再 panic(PR #18781)。这意味着你可以使用 http sink + http_server source 配合 native/native_json codec 在两个 Vector 实例之间传输数据;不过官方仍推荐 Vector 实例间通信优先使用 vector source/sink 组合。

各组件行为修复与增强

Kafka source:rebalance 与停机时的 ack 排空

kafka source 现在会在 consumer group 再平衡期间以及 Vector 停机时完整排空(drain)acknowledgements(PR #14761,由 jches 贡献),避免因 ack 未及时提交而导致消息重复处理。

gcp_stackdriver_metrics sink:批大小修复

修复了该 sink 配置的批大小大于默认值 1 时只发送每批最后一条事件的问题(PR #18749),现已按实际 batch 大小正确发送。

datadog_metrics sink:迁移到 v2 series API

datadog_metrics sink 改用 Datadog /api/v2/series 指标端点发送时序数据(PR #18761)。该改动对用户功能透明,但带来了性能提升。

datadog_agent source:记录 interval 字段

datadog_agent source 现在会为所有携带 interval 的 incoming 指标记录该字段,而不仅仅是为 rate 类型记录(PR #18889),便于后续在 Datadog 中以该 interval 字段解释指标速率。

TLS:incoming 连接的 alpn_protocols 生效

接收 TLS 流量的 source 现在会正确应用配置的 tls.alpn_protocols 选项(PR #18843,由 anil-db 贡献)。此前该选项只对发起出站 TLS 连接的组件生效。

AMQP sink:channel 错误不再 panic

amqp sink 在 channel 处于错误状态时不再 panic,而是改为发出错误事件(PR #18923、#18932)。

ClickHouse sink:健康检查 URI 修复

修复了健康检查为 URI 多加一个 / 导致失败的问题(PR #19061),该问题为 v0.33.0 引入的回归。

blackhole sink:默认不再打印处理量

blackhole sink 默认不再报告已处理事件数(breaking,PR #18963),如需恢复该行为,可显式设置 print_interval_secs 为非零值。

新增配置选项与 CLI 能力

NATS source:subscriber_capacity

nats source 新增 subscriber_capacity 配置项,用于控制 NATS subscriber 在丢弃 incoming 消息之前可以缓冲的消息数量(PR #18899)。对应字段定义于 src/sources/nats/config.rs,并在构建订阅选项时通过 subscription_capacity 生效(同文件第 300 行)。

sources:
  my_nats:
    type: nats
    subject: events.in
    subscriber_capacity: 4096

journald source:emit_cursor

journald source 新增 emit_cursor 选项,启用后会在发出的日志记录中附加 __CURSOR 字段(PR #18882,由 sproberts92 贡献)。实现位于 src/sources/journald.rs,默认值为 false,启用后可在第 624 行附近看到游标字段被写入事件。

sources:
  my_journald:
    type: journald
    emit_cursor: true

prometheus_remote_write sink:可关闭聚合

prometheus_remote_write sink 现在可以通过将 batch.aggregate 设置为 false 来禁用聚合行为(PR #18676)。

CLI:--allow-empty-config

Vector 新增 --allow-empty-config 选项,允许以空配置启动(PR #19021)。该能力在 src/cli.rs 中定义,并由 src/app.rs 传入应用启动流程。典型使用场景是:先启动一个空配置的 Vector 进程,随后通过 --watch-config 或配置重载(reload)加载真实配置。

vector --config /dev/null --allow-empty-config --watch-config

VRL 升级至 0.8.1

Vector 内置的 VRL 语言更新到 0.8.1(PR #19011),主要变化:

  • 新增 contains_all 函数;
  • from_unix_timestamp 新增 microseconds 时间单位;
  • parse_nginx_log 在缺少 upstream_response_length、upstream_response_time、upstream_status 字段时不再失败;
  • 新增 parse_float 函数;
  • 改进了 fallibility(可失败性)诊断信息。

破坏性变更汇总与升级指引

以下变更在 v0.34.0 中标记为 breaking,升级时需逐项核对:

变更 说明与迁移方式
armv7 RPM 包改名 vector-<version>-1.armv7.rpm 不再发布,替换为 vector-<version>-1.armv7hl.rpm;使用 yum 的用户无感知
Datadog sink 移除 region 选项 改用 site 配置项
移除 component_name 指标标签 改用 component_id
移除 peer_addr 指标标签 用于缓解 component_received_bytes_total 的基数膨胀
移除与 component_errors_total 冗余的废弃指标 请按 upgrade guide 中的完整清单迁移监控规则
废弃 HTTP 组件旧指标 requests_completed_total、request_duration_seconds、requests_received_total
blackhole sink 默认不打印处理量 如需打印,设置非零的 print_interval_secs
移除 OpenSSL legacy provider 支持 --openssl-legacy-provider 与 VECTOR_OPENSSL_LEGACY_PROVIDER 不再生效
软件包仓库迁移 从 repositories.timber.io 迁移到 apt.vector.dev / yum.vector.dev,旧仓库 2024-02-28 下线

v0.34.0 的已知问题(在后续补丁中修复)

  • Datadog Metrics sink:因批大小计算错误导致大量请求发送失败(#19110),v0.34.1 修复;
  • Loki sink:使用默认 snappy 压缩时,错误地将请求 Content-Encoding 头设置为 application/json,导致 Loki 以 HTTP 400 拒绝请求,v0.34.1 修复;
  • protobuf 编码器:sink 中无法正常工作(#19230),v0.34.2 修复。

深入仓库验证

如需进一步研究 v0.34.0 的底层实现,可以在仓库中按以下路径继续深入:

以上文件均以当前仓库快照为准;需要注意的是,仓库当前 HEAD 已远新于 v0.34.0,个别源码行号与最新实现可能存在差异,阅读时请以当时提交(v0.34.0 发布时的代码状态)为语义基准。

登录后查看全文
vector