Vector 如何用 sample 转换器按采样率丢弃事件以降低数据量
2026/9/14 16:21:29 网站建设 项目流程

Vector 如何用 sample 转换器按采样率丢弃事件以降低数据量

【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector

日志、trace 流量过大时,可以先在管道里按比例丢弃大部分事件,只把采样后的数据送到下游 sink。Vector 的sample转换器就干这件事:按你配置的采样率转发事件,未命中采样策略的事件被直接丢弃。它的开发状态为 stable,支持 log 和 trace 事件(不支持 metrics),见 sample 组件元数据。

选择采样策略:rate还是ratio

配置sample转换器时,rateratio必须且只能设置其中一个:

  • rate:以1/N表达。例如rate = 1500表示每 1500 个事件转发 1 个,其余丢弃。
  • ratio:以百分比表达。例如ratio = 0.13表示转发流中 13% 的事件,其余丢弃。它支持比rate更精确的取值,也能保留超过 50% 的事件。

最简配置如下(取自仓库生成的示例配置 minimal.yaml):

transforms: my_transform_id: type: sample inputs: - my-source-or-transform-id ratio: 0.13

inputs中的my-source-or-transform-id是占位符,需要替换为你管道里真实存在的 source 或 transform 的 ID,替换后配置即可被vector validate校验。

如果想让下游知道每个事件实际按什么速率被采样,可以配置sample_rate_key:命中的事件会被写入这个字段,默认值为sample_rate;设为空字符串则不把采样率写进事件。

完整配置示例

下面是一条完整的采样管道示例,rate: 100表示只保留约 1/100 的事件,保留的事件写入sample_rate字段;inputs和 sink 的type按你的实际组件替换:

transforms: sample-100: type: sample inputs: - my-source-or-transform-id # 替换为真实的 source/transform ID rate: 100 sample_rate_key: sample_rate sinks: my-sink: type: blackhole inputs: - sample-100

验证采样是否生效

  1. 校验配置。用 validate 命令检查配置,路径换成你自己的配置文件:

    vector validate /etc/vector/vector.yaml
  2. 启动 Vectorvector --config /etc/vector/vector.yaml(同样替换为你的配置路径)。

  3. 检查保留事件。下游收到的每个事件都会带有sample_rate字段,值为该事件实际生效的采样率(例如配置ratio = 0.1时字段值为"0.1",配置rate = 25时为"25",以上为 测试代码 中的示例值)。如果你的日志里出现带sample_rate字段、且数量约为原来的 1/100 的事件,说明采样在正常工作。

  4. 确认丢弃行为。每个被丢弃的事件都会触发一个内部指标:ComponentEventsDropped,reason 为Sample discarded.,标记为 intentional(见 src/internal_events/sample.rs)。在 Vector 的遥测输出里能看到该指标持续计数,即可确认事件确实被按预期丢弃,而不是卡住或误路由。

可选:按字段分组或按键采样

基础配置之外,sample还有几个可选配置项,来自 sample 生成配置定义:

  • group_by:模板字符串,如"{{ service }}""{{ hostname }}-{{ service }}"。每个渲染后的取值形成一个独立桶,采样率独立地在每个桶内应用,适合让每个 service 各自按同一比例采样。
  • key_field:指定一个字段名(示例值message)。该字段的每个唯一值会哈希成一个桶,采样率作用在桶上而不是单个事件上——例如可以让同一笔交易的所有日志要么全保留、要么全丢弃。注意:如果字段取值分布不均匀,整体采样率可能与配置值有偏差;key_field不能与rate_field/ratio_field同时使用。
  • exclude:一个逻辑条件,命中该条件的事件不做采样、直接放行。通过exclude放行的事件不会写入sample_rate字段,适合保留少量必须全量留存的关键事件(如错误日志)。

可选:按事件字段动态调整采样率

如果希望采样率随事件内容变化,可以用rate_fieldratio_field指定事件中的字段名,逐事件取值作为采样率:

  • rate_field:字段值必须是正整数(或可解析为正整数的字符串),按1/N生效;浮点数会被拒绝。
  • ratio_field:字段值必须是(0, 1]区间内的数字(例如0.25保留 25%)。

两者只能选一个,且字段缺失或取值非法时会回退到静态的rate/ratio配置。group_by也可以与它们组合,让不同分组各自独立应用动态采样率。

配置错误的识别方式

以下错误信息在配置校验阶段(vector validate或启动时)直接给出,对应实现见 src/transforms/sample/config.rs:

错误信息触发条件
Only one value can be provided for either 'rate' or 'ratio', but not bothrateratio同时配置
Exactly one value must be provided for either 'rate' or 'ratio' to configure static samplingrateratio都未配置
Only non-zero numbers are allowed values for 'rate'rate为 0
Only positive, non-zero numbers are allowed values for 'ratio', value: ...ratio小于或等于 0
Only one value can be provided for either 'ratio_field' or 'rate_field', but not both两个动态字段同时配置
'key_field' cannot be combined with 'ratio_field' or 'rate_field' because dynamic values can vary per event and break key-based coherencekey_field与动态字段混用

限制

  • 输入输出只支持 log 和 trace 事件,metrics 事件不能进入sample转换器。
  • 使用key_field时,若字段取值分布不均匀,整体保留率可能与配置值不一致;未配置key_field或事件缺少该字段时,事件按独立方式采样。
  • exclude命中事件全量保留,会部分抵消采样率,配置时要预估这部分流量。

参考文档:sample 转换器参考、sample 配置生成定义、配置校验。

【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询