ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vector 的 swimlanes(现 route)transform:把事件流按条件拆分成多条泳道

Vector 的 swimlanes(现 route)transform:把事件流按条件拆分成多条泳道 Vector 的 swimlanes现 routetransform把事件流按条件拆分成多条泳道【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector本篇基于 Vector 仓库中的发布亮点文档 2020-02-24-swimlanes-transform.md 展开完整介绍swimlanestransform 的设计动机、原始配置示例与用法并结合当前仓库源码 src/transforms/route.rs 说明它在更名route之后的最新实现细节多输出命名端口、_unmatched兜底逻辑、可用的条件类型与事件分发的实际行为。读完后你将掌握如何在 Vector 拓扑中用一条配置实现 if/else 乃至多分支的事件路由并了解从swimlanes到route的迁移路径。为什么需要 swimlanesVector 是一个高性能的可观测性数据管道sources → transforms → sinks。在实际配置中经常需要按条件把同一股事件流分到不同的处理分支例如错误日志送告警通道、普通日志送存储通道。在swimlanes出现之前这类条件分支只能靠多个remap/luatransform 里手写 if/else 判断来实现配置冗长且容易出错。swimlanestransform 正是在 0.8.0 版本2020-02-24 合入PR #1785中引入的新组件它的目标用原文档一句话概括让配置 transform 和 sink 的条件分支变得简单得多比如轻松创建 if/else 管道。发布记录 website/cue/reference/releases/0.8.0.cue 中可以查到该 commit 的原始条目Addswimlanestransform作者 Ashley Jeffs改动 21 个文件。原始配置示例按 level 拆分错误流与正常流下面是原始亮点文档给出的完整配置示例基于 0.8.0 时代的配置语法types字段、lanes参数与field.eq风格的条件谓词title: vector.yaml transforms: lanes: types: swimlanes my_transform_id: lanes: errors: level.eq: error not_errors: level.neq: error这份配置的关键信息my_transform_id是一个swimlanes类型的 transformlanes参数是一个泳道名 → 条件的映射每条泳道lane对应一个具名输出errors和not_errors。其他组件可以通过my_transform_id.errors、my_transform_id.not_errors这样的名称把它当作输入引用从而各自接不同的下游 transform 或 sink因此一个错误分支可以接告警 sink非错误分支接归档 sink整条 if/else 管道只需一个 transform 就能表达无需在每个分支里重复写判断逻辑。原文档还附带了一句俏皮话偶尔让分支之间交流一下别让它们彻底失去联系。——这也点出了该组件的定位它是管道拓扑上的分流器而不是一次性的过滤器。从 swimlanes 到 route更名与参数迁移swimlanes这个名字在后续版本中被替换成了更语义化的route迁移过程有明确的版本记录0.14.0transform 正式更名为route。发布记录 website/cue/reference/releases/0.14.0.cue 中有两条Rename toroutePR #6193的记录0.24.0 → 0.25.0swimlanes这个旧名字作为别名先被废弃、随后被彻底移除0.26.0lanes参数别名也被移除。升级指南 website/content/en/highlights/2022-11-07-0-26-0-upgrade-guide.md 中专门有一节Removal oflanesparameter forroutetransform说明lanes只是该 transform 最初叫swimlanes时的遗留别名并给出迁移方式——只需把字段名改掉transforms: my_route: type: route lanes: # -- change this to route route_a: ..因此在今天的 Vector 中使用该功能配置里应写作type: route路由表写在route参数下文档入口也相应指向 route transform 参考页原始亮点文档中的内部链接实际就已指向该页。当前实现剖析src/transforms/route.rs当前仓库中该 transform 的实现在 src/transforms/route.rs其核心结构非常简洁pub const UNMATCHED_ROUTE: str _unmatched; pub struct Route { conditions: Vec(String, Condition), reroute_unmatched: bool, }即一组路由名 → 条件的有序列表加上一个是否保留兜底输出的开关。配置字段RouteConfigroute.rs#L58-L92只有两个配置字段字段类型 / 默认值说明routeIndexMapString, AnyCondition必填从路由标识到逻辑条件的映射条件对每个事件求值。保留输出名_unmatched、_default不可用作路由 IDreroute_unmatchedbool默认true未匹配任何路由的事件会被送到transform_name._unmatched输出而不是被静默丢弃设为false则直接丢弃其中route的键顺序来自IndexMap配置里写了几条路由就产生几个具名输出端口当reroute_unmatched: true时outputs()route.rs#L164-L190会额外追加一个_unmatched端口所有端口继承输入端口的数据模式定义。配置校验逻辑也值得注意validate_structureroute.rs#L135-L143在拓扑加载阶段就会拒绝把_unmatched用作路由名避免用户输出与兜底输出冲突validate_with_context则会在启动前编译并校验每条路由的条件表达式写错的 VRL 会在启动时暴露而不是等到有事件流过才报错。支持的条件类型每条路由的取值是AnyConditionsrc/conditions/mod.rs#L188-L194支持两种写法裸 VRL 布尔表达式字符串直接写表达式等价于type: vrl的简写完整条件对象typesource的枚举式写法底层ConditionConfig支持以下类型src/conditions/mod.rs#L100-L118vrlVector Remap Language 布尔表达式最常用is_log/is_metric/is_trace按事件类型匹配datadog_searchDatadog Search 查询串便于复用现有 Datadog 搜索习惯。一个符合当前语法的完整配置把原始 0.8.0 示例翻译成今天可直接运行的写法条件改用 VRL路由表挂在route下transforms: my_route: type: route inputs: [in] route: errors: type: vrl source: .level error not_errors: type: vrl source: .level ! error # reroute_unmatched 默认 true可显式关闭 # reroute_unmatched: false sinks: error_sink: type: console inputs: [my_route.errors] encoding: codec: json normal_sink: type: console inputs: [my_route.not_errors] encoding: codec: json unmatched_sink: type: console inputs: [my_route._unmatched] encoding: codec: json事件分发行为由单元测试定义实现细节由 route.rs 自带的单元测试精确固化值得逐条对照route_pass_all_route_conditionsroute.rs#L233-L277当事件同时满足first、second、third三条路由的条件时事件会分别进入所有匹配的输出_unmatched为空。也就是说路由之间不是互斥的 if/else-if 链而更像广播每个条件独立求值命中就投递route_pass_one_route_conditionroute.rs#L279-L322只命中first时事件仅出现在first输出route_pass_no_route_conditionroute.rs#L324-L365全部条件不命中且reroute_unmatched保持默认值时事件被完整地送到_unmatched输出——默认配置下不会丢事件route_no_unmatched_outputroute.rs#L367-L405显式设置reroute_unmatched: false后未匹配事件在全部输出中都不出现即被静默丢弃适合只关心特定子集的场景。分发主循环在SyncTransform::transformroute.rs#L40-L55中依次对每条路由条件求值命中则output.push(Some(output_name), event)用一个check_failed计数器判断是否全部未命中再决定要不要写_unmatched。此外enable_concurrency返回trueroute.rs#L192-L194说明拓扑层允许为该 transform 开启多路并发处理。性能视角route 的基准测试仓库为该 transform 提供了专门的 criterion 基准 benches/transform/route.rs覆盖三类场景单路由 VRL 字段匹配、单路由不匹配、以及十几条路由混合命中/未命中的vrl_field_match_many。基准用一个带 26 个字段的日志事件、约 84 个输出端口作为输入通过Throughput::Elements以每秒处理事件数口径度量。如果你想评估多分支路由在你数据模型下的开销可以直接参考该基准的参数构造方式来复测。使用建议与小结结合源码行为几条实践建议写路由条件时利用广播语义一个事件可以同时进入多条路由。如果希望严格互斥就写成互补条件如原始示例的level error与level ! error或用 VRL 里更精确的表达式保证只有一个条件成立谨慎对待_unmatched默认兜底输出是安全网。若确定未匹配事件无价值可设reroute_unmatched: false省掉一个下游端口但要意识到这是静默丢弃不要使用保留名_unmatched与_default是保留输出名_unmatched作为路由名会在配置校验阶段直接报错从旧配置迁移时按 0.26.0 升级指南 把types: swimlanes改为type: route、lanes:改为route:并把field.eq一类旧谓词改写为 VRL 表达式旧式check_fields风格的谓词同样已在 0.26.0 中移除。swimlanes的发布亮点虽然停留在 2020 年但它定义的条件分支即具名输出端口这一模型正是今天routetransform 的核心配置一段route映射即可获得任意多条可独立接下游 transform/sink 的泳道加上_unmatched兜底与启动期校验构成 Vector 拓扑中最基础也最实用的分流手段。【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表