Vector v0.34.0 版本解析:protobuf 编码器、磁盘缓冲安全与可观测性指标重构
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 日,除常规的增强与缺陷修复外,重点包含三项值得关注的内容:
- 面向 sinks 的全新
protobuf编码器(通过encoding.codec配置); - 磁盘缓冲(disk buffer)开始持久化事件元数据(metadata)与密钥(secrets),使 sink 侧能够访问这些数据——该改动带有潜在安全影响;
- 正式废弃托管于
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 给出的建议,可以从两个方向处理:
- 加固磁盘缓冲:确保承载磁盘缓冲目录的文件系统权限与访问控制足够严格,仅允许 Vector 进程用户访问;
- 避免在事件中存储密钥:尽量不把密钥直接写入事件内容或元数据,例如优先使用 Vector 的 secrets 管理机制(文件、目录、AWS Secrets Manager、exec 等 secret backend)在运行时注入敏感信息,而不是将其内嵌进事件本身。
需要说明的是,这类密钥明文持久化属于该版本的设计取舍,用户必须自行评估自身的合规与安全要求。
可观测性重构:HTTP/gRPC 服务指标、标签清理与指标去重
v0.34.0 在可观测性方面动作密集,既有新增也有破坏性移除。
新增 HTTP 与 gRPC 服务端指标
运行 HTTP 服务的 source/sink 新增三组内部指标(PR #18887):
http_server_requests_received_totalhttp_server_responses_sent_totalhttp_server_handler_duration_seconds
运行 gRPC 服务的组件新增:
grpc_server_messages_received_totalgrpc_server_messages_sent_totalgrpc_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_logssource 不再为乱序(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 的底层实现,可以在仓库中按以下路径继续深入:
- lib/codecs/src/encoding/format/mod.rs:protobuf 编码器注册与导出;
- lib/codecs/src/encoding/transformer.rs:
unix_ms/unix_us/unix_ns/unix_float时间戳格式实现; - src/cli.rs 与 src/app.rs:
--allow-empty-config参数定义与传递; - src/sources/nats/config.rs:
subscriber_capacity配置项; - src/sources/journald.rs:
emit_cursor配置项与__CURSOR字段注入; - src/secrets/mod.rs:密钥管理机制,用于避免密钥落入磁盘缓冲;
- website/cue/reference/releases/0.34.0.cue:本版本 release notes 的权威数据源(changelog、known_issues、commits 全量清单)。
以上文件均以当前仓库快照为准;需要注意的是,仓库当前 HEAD 已远新于 v0.34.0,个别源码行号与最新实现可能存在差异,阅读时请以当时提交(v0.34.0 发布时的代码状态)为语义基准。