Vector v0.18.0 发布解读:失败事件路由、CSV 富化表、throttle 变换与升级迁移指南
【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector
本篇技术指南围绕 Vector 开源观测数据管道 v0.18.0 版本发布说明展开,系统梳理该版本新增的失败事件路由(failed event routing)、CSV 富化表(enrichment tables)、throttle变换、隐式命名空间与aws_sqs源等核心特性,完整覆盖 5 项破坏性变更的迁移路径与已知问题清单,并结合当前仓库源码与配置示例给出可复现的实战配置。读完本文,你将掌握 v0.18.0 的功能全貌,并能快速将存量配置平滑升级到新版本。
一、版本概览
Vector v0.18.0 于 2021-11-18 发布,是继 0.17.x 系列之后的一个功能密集版本。除了多个新组件与新概念落地,本版本还包含多项破坏性变更(breaking changes),官方专门发布了 0.18 升级指南 引导用户迁移。完整变更明细可在发布说明元数据 website/cue/reference/releases/0.18.0.cue 中查看。
同版本还一并发布了统一的新vectorHelm Chart。该 Chart 既可以作为 agent 部署,也可以作为 aggregator 部署,因此取代了原有的vector-agent与vector-aggregator两个 Chart。仓库中仍保留了原有角色的参考清单(distribution/kubernetes/vector-agent、distribution/kubernetes/vector-aggregator),但从 0.18.0 起官方推荐向统一 Chart 迁移。
二、新特性与功能亮点
2.1 失败事件路由:remap变换的.dropped输出
本版本引入了"从变换路由失败事件"的初始支持,首发落地在remap变换上,这也是后续"多输出变换"拓扑能力的起点(相关提交为 PR 9169 / 9417)。
此前,事件在变换中处理失败时,要么被丢弃,要么继续流向下一环节,用户无法按需处置。现在可以通过两个配置开关组合启用失败路由:
drop_on_error = true:发生错误时丢弃事件(而不是放行)reroute_dropped = true:将原本会被丢弃的事件重定向到.dropped输出,供下游单独消费
启用后,可以用组件ID.dropped作为另一组件的输入。完整示例(源自 2021-11-18-failed-event-routing.md):
[sources.in] type = "demo_logs" format = "shuffle" interval = 1.0 lines = [ '{ "message": "valid message", "foo": "bar"}', '{ "message": "valid message", "foo": "baz"}', 'invalid message', ] [transforms.my_remap] type = "remap" inputs = ["in"] drop_on_error = true drop_on_abort = true reroute_dropped = true source = """ . |= object!(parse_json!(.message)) if .foo == "baz" { abort } .processed = true """ [sinks.foo] type = "console" inputs = ["my_remap"] encoding.codec = "json" [sinks.bar] type = "console" inputs = ["my_remap.dropped"] # 注意新的 `.dropped` 后缀 encoding.codec = "json"运行后,两条合法 JSON 事件(其中.foo == "baz"的事件因abort被重定向)由foosink 输出并附带processed字段;而'invalid message'这类无法解析的事件则进入barsink,并自动携带失败元数据:
{ "message": "invalid message", "metadata": { "dropped": { "component_id": "my_remap", "component_type": "remap", "component_kind": "transform", "message": "function call error for \"object\" ... unable to parse json ...", "reason": "error" } } }其中metadata键可通过全局log_schema.metadata_key配置调整。该特性非常适合将失败事件转储到专门 sink 用于存储、排查与重放。需要说明的是,0.18.0 中单元测试尚不支持对失败事件进行断言,官方计划在后续版本补充。
2.2 CSV 富化表(Enrichment Tables)
富化表(enrichment tables)是 v0.18.0 引入的全新概念:从外部数据源富化流经拓扑的事件。首个实现是 CSV 文件富化,通过 VRL 函数按条件查找行并映射进事件。相关实现位于 src/enrichment_tables 目录(含file.rs与内存实现 src/enrichment_tables/memory),对应的两个新 VRL 函数定义在 lib/vector-vrl/functions 中:
get_enrichment_table_record:按条件查找并返回单行find_enrichment_table_records:返回匹配的多个行(数组),用于更复杂的场景
以 IoT 设备日志富化为例(示例源自 2021-11-18-csv-enrichment.md)。假设 CSV 文件iot_remap.csv内容为:
code,message 1,"device battery full" 2,"device battery good" 3,"device battery ok" 4,"device battery low" 5,"device battery critical"先在配置中声明富化表:
[enrichment_tables.iot_remap] type = "file" [enrichment_tables.iot_remap.file] path = "/etc/vector/iot_remap.csv" encoding = { type = "csv" } [enrichment_tables.iot_remap.schema] code = "integer" message = "string"然后在remap变换中调用富化函数,将设备发出的数字编码翻译为可读信息:
[transforms.enrich_iot_logs] type = "remap" inputs = ["vector_agents"] source = ''' . = parse_json!(.message) code = del(.code) row = get_enrichment_table_record!("iot_remap", { "code": code }) .message = row.message '''这种模式可以让设备端保持小体积载荷,在管道内完成数据格式化与上下文增强。仓库中富化表测试数据可参考 tests/data 下的 CSV 文件。官方后续计划补充or条件的支持以及更多富化表类型(如 Redis)。
2.3throttle变换:控制成本与限速
为帮助用户控制成本,v0.18.0 新增了throttle变换。该变换基于配置的窗口(window参数,在 0.18.0 开发中曾由其他命名更名为window,见提交 PR 10095)与阈值对事件进行限流。相关实现位于 src/transforms/throttle.rs,并配套有专门的 throttle 变换介绍 与throttleRFC(rfcs 目录)。基准测试用例见 benches/transform/throttle.rs(该文件位于 benches/transform 目录,实测时请以仓库当前文件为准)。
2.4 隐式命名空间:从文件与目录名推导配置
v0.18.0 大幅改善了将 Vector 配置拆分为多个文件的能力:通过--config-dir加载配置时,可以从文件与目录名自动推导组件命名空间,相关提交为 PR 9701("Implicit namespacing based on the config directory structure")。例如以目录名作为sources/transforms/sinks的顶层键,配合文件名作为组件 ID,可以省去显式声明,使多文件配置的组织方式更加清晰。仓库参考示例见 config/examples/namespacing。配套的自动命名空间说明见 2021-11-18-implicit-namespacing.md。
2.5 新源:aws_sqs
新增aws_sqs源,用于从 AWS SQS 队列消费消息并转换为日志事件,实现位于 src/sources/aws_sqs。这使得以 SQS 为消息中转的日志链路可以直接接入 Vector 管道。
三、增强与可观测性改进
3.1 Sink 缓冲区的可观测性指标
v0.18.0 为 sink 缓冲区补充了完整埋点,便于监控缓冲区运行状态(提交 PR 9327、9584)。新增指标如下:
| 指标 | 说明 | 适用缓冲类型 |
|---|---|---|
buffer_byte_size | 缓冲区中的字节数 | 仅磁盘缓冲 |
buffer_events | 缓冲区中的事件数 | 仅内存缓冲 |
buffer_received_event_bytes_total | 缓冲区累计接收的字节数(不含被丢弃事件) | 全部 |
buffer_sent_event_bytes_total | 从缓冲区发送给关联 sink 的累计字节数 | 全部 |
buffer_received_events_total | 缓冲区累计接收的事件数(不含被丢弃事件) | 全部 |
buffer_sent_events_total | 从缓冲区发送给关联 sink 的累计事件数 | 全部 |
buffer_discarded_events_total | 因缓冲区已满而被丢弃的累计事件数(当when_full为drop_newest时相关) | 全部 |
3.2 日志级别环境变量:$LOG更名为$VECTOR_LOG
配置日志级别的环境变量由$LOG更名为$VECTOR_LOG(提交 PR 9743)。为了向后兼容,$LOG仍然被接受,但官方建议迁移到新变量,以避免与其他通用环境变量冲突。
3.3 其他值得关注的增强
log_to_metric支持绝对计数器:除相对计数器外,新增kind = "absolute",可发射绝对计数器值。prometheus_exporter指标过期:距离上次 flush(由flush_interval_secs控制)后未再出现的指标会被清理,避免长期占用内存。- 端到端确认(E2E acknowledgements):扩展至
aws_kinesis_firehose源、journald源与filesink。 datadog_metricssink 支持分布数据:可向 Datadog 发送直方图与聚合样本等分布数据。kubernetes_logs源增强:日志在可用时标注pod_owner;同时通过允许使用略有过期的元数据进行富化,降低对 Kubernetes API server 与 etcd 的压力。generator源更名为demo_logs:名称更贴合其用途,同时保留别名以兼容旧配置。heroku_logs源支持framing与decoding:与 v0.17.0 引入的 source codecs 能力对齐。- VRL 诊断改进:当变量未定义时,诊断信息会提示
null、true或false,引导用户意识到 VRL 中不存在nil这类关键字。 papertrailsink 支持可模板化的process字段:可将process设置为事件字段值。utilization指标更精确:多数变换不再把阻塞在下游组件上的时间计为忙碌时间,使该指标更能反映变换自身耗时。aws_s3sink 提前乐观关闭连接:减少在 AWS 超时之前被动断连的情况。
四、破坏性变更与升级指南(重点)
本版本共 5 项主要破坏性变更,官方升级指南见 2021-11-18-0-18-0-upgrade-guide.md。
4.1batch.max_size不再有效 → 改用batch.max_bytes/batch.max_events
batch.max_size过去被各 sink 按自身理解解释为字节数或事件数,语义含糊。本版本将其彻底移除,配置中需明确使用batch.max_bytes(按字节限制)或batch.max_events(按事件数限制)。升级时只需做如下替换:
# 旧配置 [batch] max_size = 1000000 # 新配置:按字节 [batch] max_bytes = 1000000 # 新配置:按事件数 [batch] max_events = 10004.2request.in_flight_limit不再有效 → 改用request.concurrency
request.concurrency与request.in_flight_limit在内部一直按同一语义处理,本版本正式移除后者。将配置中所有request.in_flight_limit重命名为request.concurrency即可完成迁移:
# 旧配置 [request] in_flight_limit = 8 # 新配置 [request] concurrency = 84.3http_client_responses_total的status标签只保留数字状态码
http_client_responses_total内部指标的status标签此前会包含状态码文本,例如200 OK。本版本起仅保留数字200,便于下游指标系统按2xx等区间聚合。
4.4metric_to_log变换的聚合摘要字段upper_limit→q
metric_to_log变换输出聚合摘要(aggregated summaries)时,保存分位数的字段由upper_limit更名为q(quantile 的通用缩写)。upper_limit是早期指标实现的历史遗留命名,只适用于聚合直方图、不适用于聚合摘要。
4.5datadog_metricssink 移除废弃字段host与namespace
datadog_metricssink 中已废弃的host与namespace字段在本版本移除,请迁移到endpoint与default_namespace:
# 旧配置 [datadog_metrics] host = "https://api.datadoghq.com" namespace = "app" # 新配置 [datadog_metrics] endpoint = "https://api.datadoghq.com" default_namespace = "app"4.6 其他破坏性移除
exec源移除event_per_line:该选项自 0.17.0 起已失效但一直被允许配置。请改用新的framing选项,在"每行一个事件"与"整段输出作为一个事件"之间选择。
五、已知问题清单
官方在发布说明中如实记录了以下已知问题(多数已在后续补丁版本修复):
elasticsearchsink 会为每条投递的事件错误地打印一条消息(v0.18.1 修复)。- 内部遥测变更导致
prometheus_exporter与prometheus_remote_writesink 输出的聚合直方图统计不正确(v0.18.1 修复)。 - 自动命名空间功能导致从官方 RPM 运行时,Vector 尝试加载
/etc/vector下无效目录而启动失败(v0.18.1 修复)。 remap的新reroute_dropped特性即使设为false也会创建dropped输出(v0.18.1 修复)。kafkasink 的headers_key选项被误改为headers_field(v0.19.0 修复)。- 使用
--config-dir时,Vector 会错误地尝试加载未知扩展名的文件(v0.19.0 修复)。 - 使用固定编码(无
encoding.codec)的 sink 上,encoding.only_fields反序列化失败(v0.19.2 修复)。v0.19.2 之前可用以下写法规避:
# 将 encoding.only_fields = ["message", "foo.bar"] # 改为 encoding.only_fields = [["message"], ["foo", "bar"]]升级到 v0.19.2 及以上时需改回原始表示形式。
六、性能与稳定性修复
--threads重新生效:配置线程数(--threads)真正影响运行时行为,修复了 v0.13 起一直使用可用核心数的回归(PR 9527)。- 配置热重载不再崩溃:当重载的配置同时变更组件输入顺序与其中一个输入的配置时,不再触发崩溃。
- 多个 sink 死锁修复:修复
aws_s3、loki、datadog_logssink 的锁死问题。 - Windows 服务内存泄漏修复:修复以 Windows 服务方式运行时出现的内存泄漏。
aws_s3sink 前缀回归修复:修复 v0.17.0 中在用户提供的前缀后追加/的回归,恢复原有行为。component_sent_bytes_total上报时机修正:改为在事件成功发送到 HTTP 系 sink 之后上报,而不是发送前。influxdb_*sink 健康检查端点调整:influxdb_metrics与influxdb_logs改用/ping进行健康检查,以兼容 InfluxDB 2 Cloud。
七、展望与后续方向
发布说明的whats_next部分明确了两个后续重点:
- 组件指标标准化:目标让所有 Vector 组件上报一致的指标集合,便于统一监控,其规范见 docs/specs/instrumentation.md。
- VRL 迭代支持:针对日志事件结构未知时遍历键值的常见需求,官方已发布 RFC(对应 rfcs/2021-08-29-8381-vrl-iteration-support.md),并计划在当季度实现。
结语
v0.18.0 是 Vector 在"失败事件处置、外部数据富化、成本控制与配置组织"四个方向上的重要里程碑:.dropped输出让管道具备失败隔离能力,富化表打通了外部静态数据的 VRL 查询链路,throttle为成本管控提供了原生手段,隐式命名空间则让大规模多文件配置更易维护。若你的存量配置使用了batch.max_size、request.in_flight_limit、datadog_metrics.host/namespace、exec.event_per_line等被移除的参数,请务必按本文第四节逐项迁移,再结合第三节的缓冲区指标与VECTOR_LOG完成升级后的观测验证。
【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考