Changelog
All notable changes to this project will be documented in this file.
[Unreleased]
Added
- confvars_case 示例项目: 新增完整的配置变量使用案例
- 添加配置文件
conf/wparse.toml和conf/wpgen.toml - 添加安全密钥配置
.warp_parse/sec_key.toml - 添加知识库模型:
address表 (create.sql, data.csv, insert.sql)example表 (create.sql, data.csv, insert.sql)- 知识库配置
knowdb.toml
- 添加 OML 模型:
benchmark1/adm.omlbenchmark2/adm.oml
- 添加 WPL 规则:
benchmark/parse.wpl- 解析规则benchmark/gen_rule.wpl- 生成规则benchmark/sample.dat- 示例数据
- 添加拓扑配置:
- Sources:
wpsrc.toml - Sinks:
- Business sinks:
benchmark1.toml,benchmark2.toml - Infra sinks:
default.toml,error.toml,miss.toml,monitor.toml,residue.toml - 默认配置:
defaults.toml
- Business sinks:
- Sources:
- 添加运行脚本
run.sh - 添加项目说明文档
README.md
- 添加配置文件
Changed
- MySQL 连接器安全性增强: 更新
connectors/sink.d/50-mysql.toml- 将硬编码的用户名和密码改为使用环境变量
username: 使用${SEC_MYSQL_USER}password: 使用${SEC_MYSQL_PWD}
Previous Changes
详见 git commit 历史:
- 10eb55a - Merge branch ‘main’
- d40c3fc - fix:demo-parseql
- eb5e699 - demo
- b9cfdb7 - 普通日志异常解决
Beginner Guide
我们来开启 WarpParse 的使用学习。
准备工作
安装
curl -sSf https://raw.githubusercontent.com/wp-labs/warp-parse/refs/heads/main/setup.sh | sh
MacOS 提示:
- 打开安装限制
下载学习示例
git clone https://github.com/wp-labs/wp-examples.git
目标1: 让WarpParse 运行起来
初始化项目
wproj init
mkdir ${HOME}/wp-space ;
cd ${HOME}/wp-space;
wproj init -m full
- 项目的结构
tree -L 2
.
├── conf
│ ├── wparse.toml
│ └── wpgen.toml
├── connectors
│ ├── sink.d
│ └── source.d
├── data
│ ├── in_dat
│ ├── logs
│ ├── out_dat
│ └── rescue
├── models
│ ├── knowledge
│ ├── oml
│ └── wpl
└── topology
├── sinks
└── sources
生成测试数据
第一个例子,是最为简单的从文件解析到文件
wpgen sample -n 3000
引擎解析数据
wparse batch --stat 2 -p
运行结果:
============================ total stat ==============================
+-------+------------+-----------------+---------+-------+---------+----------+--------+
| stage | name | target | collect | total | success | suc-rate | speed |
+======================================================================================+
| Parse | parse_stat | /nginx//example | | 3000 | 3000 | 100.0% | 3.12 |
|-------+------------+-----------------+---------+-------+---------+----------+--------|
| Pick | pick_stat | file_1 | | 3000 | 3000 | 100.0% | 150.00 |
|-------+------------+-----------------+---------+-------+---------+----------+--------|
| Sink | sink_stat | demo/json | | 1280 | 1280 | 100.0% | 3.56 |
+-------+------------+-----------------+---------+-------+---------+----------+--------+
数据统计
wproj data stat
- 输出
== Sources ==
| Key | Enabled | Lines | Path | Error |
|--------|---------|-------|-------------------------|-------|
| file_1 | Y | 3000 | .../data/in_dat/gen.dat | - |
Total enabled lines: 3000
== Sinks ==
| Scope | Sink | Path | Lines |
|----------|-------------|------------------------------|-------|
| business | demo/json | .../data/out_dat/demo.json | 3000 |
| infra | default/[0] | .../data/out_dat/default.dat | 0 |
| infra | error/[0] | .../data/out_dat/error.dat | 0 |
| infra | miss/[0] | .../data/out_dat/miss.dat | 0 |
| infra | monitor/[0] | .../data/out_dat/monitor.dat | 0 |
| infra | residue/[0] | .../data/out_dat/residue.dat | 0 |
只能基于文件才可以通过wproj统计
目标2: 解析自己的日志
学习 WPL 解析日志
样本: linux 系统日志
Oct 10 08:30:15 server systemd[1]: Started Apache HTTP Server.
纳入WP工程
mkdir ./models/wpl/my_sys
样本放置:
./models/wpl/my_sys/sample.dat
WPL放置:
./models/wpl/my_sys/parse.wpl
生成数据
批量解析
Docker
TODO:
Benchmark 用例指南
benchmark 目录收录了基于 benchmark/benchmark_common.sh 的性能测试用例。测试用例按数据源类型组织为多个 case 目录,每个 case 下包含不同的处理场景。本文档说明整体结构、通用参数与各测试场景的用途。
前置准备
- 所有脚本默认在 release profile 下运行,并依赖
wparse/wpgen/wproj,确保它们位于 PATH 中。 - 从 benchmark 目录或具体测试目录运行脚本。
目录结构
benchmark/
├── benchmark_common.sh # 公共函数库(参数解析、环境初始化等)
├── check_run.sh # 批量测试脚本(使用 -m 参数运行所有测试)
├── models/ # 共享的模型文件
│ ├── wpl/ # WPL 规则集(nginx、sysmon、apt、aws 等)
│ └── oml/ # OML 转换模型
├── sinks/ # 共享的 sink 配置
│ ├── parse_to_blackhole/
│ ├── parse_to_file/
│ ├── trans_to_blackhole/
│ └── trans_to_file/
├── case_tcp/ # TCP 数据源测试场景
│ ├── sources/ # TCP 源配置
│ ├── parse_to_blackhole/
│ ├── parse_to_file/
│ ├── trans_to_blackhole/
│ └── trans_to_file/
├── case_file/ # File 数据源测试场景
│ ├── sources/ # File 源配置
│ ├── parse_to_blackhole/
│ ├── parse_to_file/
│ ├── trans_to_blackhole/
│ └── trans_to_file/
├── case_syslog/ # Syslog 数据源测试场景
│ ├── sources/ # Syslog 源配置
│ ├── parse_to_blackhole/
│ └── trans_to_blackhole/
└── wpgen_test/ # wpgen 性能测试
测试场景说明
处理模式:
parse: 解析模式 - 使用 WPL 规则对日志进行解析和转换trans: 透传模式 - 不进行解析,直接转发原始数据
输出目标:
blackhole: 黑洞输出 - 丢弃数据,用于测试纯解析/转发性能file: 文件输出 - 输出到文件,测试完整的处理链路
示例:
parse_to_blackhole: 解析后丢弃,测试解析性能parse_to_file: 解析后写入文件,测试完整解析链路trans_to_blackhole: 透传后丢弃,测试转发性能trans_to_file: 透传后写入文件,测试完整转发链路
通用选项
所有测试脚本共享以下参数(由 benchmark_common.sh 中的 benchmark_parse_args 解析):
-m: 使用中等规模数据集(LINE_CNT=200,000 行);默认使用大规模数据集(20,000,000 行)-f: 强制重新生成输入数据,即使./data/in_dat/*.dat已存在(部分脚本支持)-c <cnt>: 指定数据条数,与-m互斥,优先级更高-w <cnt>: 指定 wparse worker 数量- daemon 模式默认 6 worker
- batch/blackhole 模式默认 10 worker
wpl_dir: 指定 WPL 规则集目录(位置参数)- 可选值:
nginx、sysmon、apt、aws等 - 默认值:
nginx - 路径相对于
benchmark/models/wpl/
- 可选值:
speed: 样本生成限速(行/秒),0 表示不限速(位置参数,默认 0)
执行 ./run.sh -h 可查看某个测试脚本支持的选项组合。
快速开始
1. 运行单个测试
cd benchmark
# 使用默认配置(nginx 规则,大规模数据集)
./case_tcp/parse_to_blackhole/run.sh
# 使用中等规模数据集
./case_tcp/parse_to_blackhole/run.sh -m
# 使用 sysmon 规则,12 个 worker,限速 1M 行/秒
./case_tcp/parse_to_blackhole/run.sh -w 12 sysmon 1000000
# 自定义数据量和 worker 数
./case_file/parse_to_file/run.sh -c 500000 -w 8
2. 批量测试所有场景
使用 check_run.sh 脚本自动运行所有测试用例(使用 -m 参数进行小数据测试):
cd benchmark
./check_run.sh
输出示例:
========================================
Benchmark Check - Small Data Test
========================================
检查 case_tcp ...
→ 运行 case_tcp/parse_to_blackhole ...
✓ case_tcp/parse_to_blackhole 通过
→ 运行 case_tcp/parse_to_file ...
✓ case_tcp/parse_to_file 通过
...
========================================
测试总结
========================================
总测试数: 10
通过: 10
失败: 0
所有测试通过!
测试场景清单
TCP 数据源测试(case_tcp)
| 测试场景 | 说明 | 配置文件 |
|---|---|---|
parse_to_blackhole | TCP 数据解析后丢弃,测试 TCP 接收 + 解析性能 | wpgen.toml, wparse.toml |
parse_to_file | TCP 数据解析后写入文件 | wpgen.toml, wparse.toml |
trans_to_blackhole | TCP 数据透传后丢弃,测试 TCP 接收 + 转发性能 | wpgen.toml, wparse.toml |
trans_to_file | TCP 数据透传后写入文件 | wpgen.toml, wparse.toml |
数据源: wpgen 通过 TCP 连接(默认端口 19001)发送样本数据
File 数据源测试(case_file)
| 测试场景 | 说明 | 配置文件 |
|---|---|---|
parse_to_blackhole | 文件数据解析后丢弃,测试文件读取 + 解析性能 | wpgen.toml, wparse.toml |
parse_to_file | 文件数据解析后写入文件,测试完整 file-to-file 链路 | wpgen.toml, wparse.toml |
trans_to_blackhole | 文件数据透传后丢弃 | wpgen.toml, wparse.toml |
trans_to_file | 文件数据透传后写入文件 | wpgen.toml, wparse.toml |
数据源: wpgen 预先生成数据文件到 ./data/in_dat/
Syslog 数据源测试(case_syslog)
| 测试场景 | 说明 | 配置文件 |
|---|---|---|
parse_to_blackhole | Syslog UDP 数据解析后丢弃 | wpgen.toml, wparse.toml |
trans_to_blackhole | Syslog UDP 数据透传后丢弃 | wpgen.toml, wparse.toml |
数据源: wpgen 通过 Syslog UDP 协议发送样本数据
wpgen 性能测试(wpgen_test)
专门测试 wpgen 的样本数据生成能力,不启动 wparse。
配置文件说明
每个测试场景目录下通常包含:
<test_scenario>/
├── conf/
│ ├── wparse.toml # wparse 引擎配置
│ └── wpgen.toml # wpgen 数据生成配置
├── data/ # 运行时数据目录(自动创建)
│ ├── in_dat/ # 输入数据
│ ├── out_dat/ # 输出数据
│ ├── logs/ # 日志文件
│ └── rescue/ # 异常数据
├── .run/ # 运行时文件(PID 等)
└── run.sh # 测试脚本
wparse.toml 配置要点
[models]
wpl = "../../models/wpl" # WPL 规则路径(相对于测试目录)
oml = "../../models/oml" # OML 模型路径
[topology]
sources = "../sources" # 数据源配置路径
sinks = "../../sinks/xxx" # Sink 配置路径
[performance]
parse_workers = 6 # 解析 worker 数量
rate_limit_rps = 0 # 速率限制(0 表示不限制)
wpgen.toml 配置要点
[generator]
mode = "sample" # 生成模式
count = 1000 # 每批次数量
speed = 0 # 生成速度限制
parallel = 4 # 并行度
[output]
connect = "tcp_sink" # 连接器类型(tcp_sink/file_raw_sink 等)
params = { port = 19001 } # 连接器参数
性能调优建议
确定最佳 Worker 数
- 从 CPU 核心数开始测试
- 使用不同 worker 数运行同一测试:
./case_tcp/parse_to_blackhole/run.sh -m -w 2 ./case_tcp/parse_to_blackhole/run.sh -m -w 4 ./case_tcp/parse_to_blackhole/run.sh -m -w 6 ./case_tcp/parse_to_blackhole/run.sh -m -w 8 - 对比吞吐量,找到性价比最优点
数据规模选择
- 开发/调试:使用
-m参数(20 万行),快速验证 - 性能测试:使用默认规模(2000 万行)或自定义
-c参数 - 压力测试:使用
-c指定更大数据量
避免 I/O 瓶颈
blackhole测试:测试纯计算性能,无 I/O 影响file测试:注意磁盘 I/O 可能成为瓶颈- 使用 SSD 或 RAM disk 可提升 I/O 性能
输出与校验
每个脚本会自动调用以下命令显示结果:
wproj data stat: 打印数据统计信息(输入/输出条数、耗时等)wproj validate sink-file: 校验输出文件(仅限 file 输出场景)
若遇到数据残留导致统计不准,可手动执行:
wproj data clean # 清理 wparse 数据
wpgen data clean # 清理 wpgen 数据
或使用 -f 参数强制重新生成数据(部分脚本支持)。
常见问题
WPL 模型加载失败
检查 wparse.toml 中的 wpl 路径是否正确,应相对于测试目录:
[models]
wpl = "../../models/wpl" # 正确
# wpl = "../../../models/wpl" # 错误(旧配置)
数据生成失败
- 检查磁盘空间是否充足
- 确认 wpgen.toml 配置正确
- 查看
./data/logs/下的日志文件
测试运行缓慢
- 使用
-m参数减小数据规模 - 调整
-w参数优化 worker 数 - 检查系统资源使用情况(CPU、内存、磁盘 I/O)
apt_file_to_blackhole
本测试用于验证 apt_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:APT 3K 威胁日志,File 输入到 BlackHole 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 APT 3K 威胁日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | File | BlackHole | 314,200 | 1062.84 | 700.03 % / 826.30 % | 175.63 MB / 181.05 MB |
| Vector | File | BlackHole | 33,614 | 113.71 | 563.18 % / 677.50 % | 261.19 MB / 278.39 MB |
结论
在本测试场景(APT 3K 威胁日志,File 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 314,200 EPS,约是 Vector (33,614 EPS) 的 9.35 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(700.03 % vs 563.18 %)。
- 内存: WarpParse 的内存占用更低(175.63 MB vs 261.19 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 9.35 倍),同时保持了更低的内存占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
aws_file_to_blackhole
本测试用于验证 aws_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:AWS ELB 日志,File 输入到 BlackHole 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 AWS ELB 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | File | BlackHole | 1,012,400 | 396.82 | 826.53 % / 937.80 % | 237.05 MB / 263.53 MB |
| Vector | File | BlackHole | 158,730 | 62.22 | 633.77 % / 730.30 % | 296.87 MB / 307.42 MB |
结论
在本测试场景(AWS ELB 日志,File 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 1,012,400 EPS,约是 Vector (158,730 EPS) 的 6.38 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(826.53 % vs 633.77 %)。
- 内存: WarpParse 的内存占用更低(237.05 MB vs 296.87 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 6.38 倍),同时保持了更低的内存占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
mixed_file_to_blackhole
本测试用于验证 mixed_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景覆盖两类混合日志:
- Mixed-1295B:四类日志 1:1:1:1 混合,平均 1295B。
- Mixed-867B:四类日志 3:2:1:1 混合,平均 867B。
链路为 File 输入到 BlackHole 输出,仅做日志解析。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Mixed 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Parse Only,Mac M4 Mini)
| 配比/平均大小 | 引擎 | EPS | MPS |
|---|---|---|---|
| 1:1:1:1 / 1295B | WarpParse | 452,300 | 558.59 |
| Vector | 101,989 | 125.96 | |
| 3:2:1:1 / 867B | WarpParse | 672,500 | 556.05 |
| Vector | 143,608 | 118.74 |
结论
在本测试场景(Mixed 日志,File 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 在两种混合配比下均明显领先。
- 1:1:1:1 配比:452,300 EPS(MPS 558.59),约为 Vector 的 4.4x。
- 3:2:1:1 配比:672,500 EPS(MPS 556.05),约为 Vector 的 4.7x。
-
系统资源开销: 资源对比见报告主表,WarpParse 在吞吐提升的同时保持更优的内存占用。
总结: 两种混合配比下,WarpParse 均在吞吐上大幅领先并维持较优的资源效率,适合高吞吐混合日志的 file→blackhole 场景。
nginx_file_to_blackhole
本测试用于验证 nginx_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:Nginx 访问日志,File 输入到 BlackHole 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Nginx 访问日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | File | BlackHole | 2,456,100 | 559.81 | 684.40 % / 824.50 % | 107.36 MB / 120.44 MB |
| Vector | File | BlackHole | 540,540 | 123.20 | 341.51 % / 404.50 % | 230.67 MB / 251.14 MB |
结论
在本测试场景(Nginx 访问日志,File 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 2,456,100 EPS,约是 Vector (540,540 EPS) 的 4.54 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(684.40 % vs 341.51 %)。
- 内存: WarpParse 的内存占用更低(107.36 MB vs 230.67 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 4.54 倍),同时保持了更低的内存占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
sysmon_file_to_blackhole
本测试用于验证 sysmon_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:Sysmon 1K JSON 日志,File 输入到 BlackHole 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Sysmon 1K JSON 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | File | BlackHole | 440,000 | 413.74 | 852.01 % / 943.50 % | 223.52 MB / 338.05 MB |
| Vector | File | BlackHole | 76,717 | 72.14 | 462.81 % / 563.70 % | 294.87 MB / 312.77 MB |
结论
在本测试场景(Sysmon 1K JSON 日志,File 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 440,000 EPS,约是 Vector (76,717 EPS) 的 5.74 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(852.01 % vs 462.81 %)。
- 内存: WarpParse 的内存占用更低(223.52 MB vs 294.87 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 5.74 倍),同时保持了更低的内存占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
apt_file_to_blackhole
本测试用于验证 apt_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:APT 3K 威胁日志,File 输入到 BlackHole 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 APT 3K 威胁日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | File | BlackHole | 280,000 | 947.15 | 768.50 %/868.90 % | 172.72 MB/178.23 MB |
| Vector | File | BlackHole | 30,612 | 103.55 | 560.94 %/654.40 % | 248.00 MB/273.02 MB |
结论
在本测试场景(APT 3K 威胁日志,File 输入到 BlackHole 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 280,000 EPS,约是 Vector (30,612 EPS) 的 9.15 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(768.50 % vs 560.94 %)。
- 内存: WarpParse 的内存占用更低(172.72 MB vs 248.00 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 9.15 倍),同时保持了更低的内存占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
aws_file_to_blackhole
本测试用于验证 aws_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:AWS ELB 日志,File 输入到 BlackHole 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 AWS ELB 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | File | BlackHole | 710,400 | 278.45 | 837.44 %/912.40 % | 230.00 MB/252.95 MB |
| Vector | File | BlackHole | 129,743 | 50.85 | 593.45 %/665.00 % | 283.67 MB/298.16 MB |
结论
在本测试场景(AWS ELB 日志,File 输入到 BlackHole 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 710,400 EPS,约是 Vector (129,743 EPS) 的 5.48 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(837.44 % vs 593.45 %)。
- 内存: WarpParse 的内存占用更低(230.00 MB vs 283.67 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 5.48 倍),同时保持了更低的内存占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
mixed_file_to_blackhole
本测试用于验证 mixed_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景覆盖两类混合日志:
- Mixed-1295B:四类日志 1:1:1:1 混合,平均 1295B。
- Mixed-867B:四类日志 3:2:1:1 混合,平均 867B。
链路为 File 输入到 BlackHole 输出,执行日志解析 + 转换。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Mixed 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证管线解析+转换能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确,转换链路正确执行。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Parse + Transform,Mac M4 Mini)
| 配比/平均大小 | 引擎 | EPS | MPS |
|---|---|---|---|
| 1:1:1:1 / 1295B | WarpParse | 396,300 | 489.43 |
| Vector | 98,704 | 121.90 | |
| 3:2:1:1 / 867B | WarpParse | 560,600 | 463.52 |
| Vector | 138,157 | 114.23 |
结论
在本测试场景(Mixed 日志,File 输入到 BlackHole 输出,执行 日志解析 + 转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 在两种混合配比下均显著领先。
- 1:1:1:1 配比:396,300 EPS(MPS 489.43),约为 Vector 的 4.0x。
- 3:2:1:1 配比:560,600 EPS(MPS 463.52),约为 Vector 的 4.1x。
-
系统资源开销: 资源详情见报告主表,WarpParse 在吞吐提升的同时保持资源优势。
总结: 两种混合配比下,WarpParse 在解析+转换场景依旧显著领先,适合高吞吐的 file→blackhole 混合日志处理。
nginx_file_to_blackhole
本测试用于验证 nginx_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:Nginx 访问日志,File 输入到 BlackHole 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Nginx 访问日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | File | BlackHole | 1,749,200 | 398.69 | 762.65 %/865.70 % | 143.16 MB/159.22 MB |
| Vector | File | BlackHole | 470,312 | 107.20 | 372.09 %/423.00 % | 254.05 MB/280.03 MB |
结论
在本测试场景(Nginx 访问日志,File 输入到 BlackHole 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 1,749,200 EPS,约是 Vector (470,312 EPS) 的 3.72 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(762.65 % vs 372.09 %)。
- 内存: WarpParse 的内存占用更低(143.16 MB vs 254.05 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 3.72 倍),同时保持了更低的内存占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
sysmon_file_to_blackhole
本测试用于验证 sysmon_file_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:Sysmon 1K JSON 日志,File 输入到 BlackHole 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Sysmon 1K JSON 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: File 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | File | BlackHole | 354,800 | 333.63 | 880.24 %/935.40 % | 157.88 MB/170.69 MB |
| Vector | File | BlackHole | 58,200 | 54.73 | 431.45 %/527.60 % | 296.28 MB/317.84 MB |
结论
在本测试场景(Sysmon 1K JSON 日志,File 输入到 BlackHole 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 354,800 EPS,约是 Vector (58,200 EPS) 的 6.10 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(880.24 % vs 431.45 %)。
- 内存: WarpParse 的内存占用更低(157.88 MB vs 296.28 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 6.10 倍),同时保持了更低的内存占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
file_blackhole 说明
本用例演示“文件源 → Blackhole 汇“的批处理性能基准测试场景:使用 wpgen 生成测试数据文件,wparse 通过批处理模式读取并解析,输出到 blackhole 以测试纯解析吞吐性能。
目录结构
benchmark/file_blackhole/
├── README.md # 本说明文档
├── run.sh # 性能测试运行脚本
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ ├── wpgen.toml # 第一路文件生成器配置
│ └── wpgen1.toml # 第二路文件生成器配置
├── data/ # 运行数据目录
│ ├── in_dat/ # 输入数据目录
│ │ ├── gen.dat # 第一路生成数据
│ │ └── gen1.dat # 第二路生成数据
│ ├── out_dat/ # 输出数据目录
│ │ ├── error.dat # 错误数据输出
│ │ ├── miss.dat # 缺失数据输出
│ │ ├── monitor.dat # 监控数据输出
│ │ └── residue.dat # 残留数据输出
│ ├── logs/ # 日志文件目录
│ └── rescue/ # 救援数据目录
└── .run/ # 运行时数据目录
└── rule_mapping.dat # 规则映射数据
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
- 推荐系统:
- Linux:最佳性能,支持所有优化功能
- macOS:良好性能,部分优化功能受限
运行命令
# 进入 benchmark 目录
cd benchmark/file_blackhole
# 默认大规模性能测试(2000 万行数据)
./run.sh
# 中等规模测试(20 万行数据)
./run.sh -m
# 强制重新生成数据(即使已存在)
./run.sh -f
# 指定 worker 数量
./run.sh -w 8
# 使用特定 WPL 规则
./run.sh nginx
# 组合使用
./run.sh -m -w 8 -f nginx
运行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-m | 使用中等规模数据集 | 2000万 → 20万行 |
-f | 强制重新生成数据 | 智能检测 |
-w <cnt> | 指定 worker 数量 | 6 |
wpl_dir | WPL 规则目录名 | nginx |
speed | 生成器限速(行/秒) | 0(不限速) |
性能测试选项
- 默认测试:2000 万行数据,双路文件源,6 个 worker
- 中等测试:20 万行数据,适合快速验证
- 强制生成:
-f参数强制重新生成测试数据 - 自定义 WPL:支持 nginx、apache、sysmon 等规则
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境准备
- 加载 benchmark 公共函数库
- 解析命令行参数
- 设置默认值(大规模:2000万行,中等:20万行)
-
数据生成检查
- 检查
data/in_dat/gen.dat和data/in_dat/gen1.dat是否存在 - 如果不存在或使用
-f参数,则生成新数据
- 检查
-
数据生成(如需要)
- 启动
wpgen生成第一路数据到gen.dat - 启动
wpgen生成第二路数据到gen1.dat - 支持并发生成提高效率
- 启动
-
批处理执行
- 使用
wparse batch读取文件数据 - 应用 WPL 规则进行解析
- 数据输出到 blackhole(丢弃)
- 使用
-
性能统计
- 实时显示处理进度
- 记录吞吐量、处理时间等指标
- 输出最终性能报告
数据流向
wpgen 生成器 1 wpgen 生成器 2
↓ ↓
gen.dat gen1.dat
↓ ↓
┌────────────────────────────────┐
│ wparse batch │
│ - 读取文件数据 │
│ - 应用 WPL 规则解析 │
│ - 分发到 sinks │
└────────────────────────────────┘
↓
┌─────────────┬─────────────┐
│ blackhole │ monitor │
│ sink │ sink │
│ (丢弃数据) │ (收集统计) │
└─────────────┴─────────────┘
验证与故障排除
运行成功验证
-
检查性能输出
- 查看 terminal 输出的实时统计信息
- 关注 “Throughput”(吞吐量)指标
- 确认无错误或异常
-
验证输出文件
# 检查监控数据 ls -la data/out_dat/monitor.dat # 确认其他文件为空(无错误) ls -la data/out_dat/{error,miss,residue}.dat
性能
优化
-
系统级优化
Linux 系统:
# CPU 亲和性设置 taskset -c 0-5 ./run.sh -w 6 # I/O 调度器优化(SSD) echo noop | sudo tee /sys/block/sdX/queue/scheduler # 增大文件描述符限制 ulimit -n 65536macOS 系统:
# 调整文件描述符限制 ulimit -n 65536 # 调整系统参数(需要管理员权限) sudo sysctl -w kern.maxfiles=65536 sudo sysctl -w kern.maxfilesperproc=65536 -
应用级优化
- 增加 worker 数量:
-w 12(不超过 CPU 核心数) - 使用更快的 WPL 规则(如 nginx)
- 启用数据预生成并缓存
- 增加 worker 数量:
-
存储优化
- 使用 SSD 存储
- 使用 RAID 0 提高读写性能
- 考虑使用内存文件系统
影响因素
-
WPL 规则复杂度
- nginx:简单正则,性能最佳
- apache:中等复杂度
- sysmon:复杂规则,性能较低
-
数据特征
- 日志行长度
- 正则匹配复杂度
- 字段提取数量
-
系统配置
- CPU 核心数和频率
- 内存大小和速度
- 磁盘 I/O 性能(关键因素)
使用建议
-
选择 file_blackhole:
- 需要测试纯解析性能
- 批量数据处理场景
- 追求最高吞吐量
-
选择 tcp_blackhole:
- 需要可靠的网络传输
- 实时数据处理
- 模拟 TCP 数据源
-
选择 syslog_blackhole:
- 传统 syslog 集成
- 极限性能测试
- 日志收集场景
本文档最后更新时间:2025-12-16
file_file 说明
本用例演示“文件源 → 文件汇“的性能基准测试场景:使用 wpgen 生成测试数据文件,wparse 通过批处理模式读取并解析,输出到文件以测试完整的数据处理管道性能。
目录结构
benchmark/file_file/
├── README.md # 本说明文档
├── run.sh # 性能测试运行脚本
├── record.md # 运行记录文档
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ └── wpgen.toml # 文件生成器配置
├── models/ # 模型配置目录
│ ├── sinks/ # 数据汇配置
│ │ ├── defaults.toml # 默认配置
│ │ ├── business.d/ # 业务组配置
│ │ │ └── all.toml # 文件汇组配置
│ │ └── infra.d/ # 基础设施组配置
│ │ ├── default.toml # 默认数据汇
│ │ ├── error.toml # 错误数据处理
│ │ ├── miss.toml # 缺失数据处理
│ │ ├── monitor.toml # 监控数据处理
│ │ └── residue.toml # 残留数据处理
│ ├── sources/ # 数据源配置
│ │ └── wpsrc.toml # 文件源配置
│ ├── wpl/ # WPL 解析规则目录
│ │ ├── nginx/ # Nginx 日志规则
│ │ ├── apache/ # Apache 日志规则
│ │ └── sysmon/ # 系统监控规则
│ ├── oml/ # OML 转换规则目录(空)
│ └── knowledge/ # 知识库目录(空)
├── data/ # 运行数据目录
│ ├── in_dat/ # 输入数据目录
│ │ └── gen.dat # 生成数据文件
│ ├── out_dat/ # 输出数据目录
│ │ ├── all.dat # 主输出文件
│ │ ├── error.dat # 错误数据输出
│ │ ├── miss.dat # 缺失数据输出
│ │ ├── monitor.dat # 监控数据输出
│ │ └── residue.dat # 残留数据输出
│ ├── logs/ # 日志文件目录
│ └── rescue/ # 救援数据目录
└── .run/ # 运行时数据目录
└── rule_mapping.dat # 规则映射数据
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
- 推荐系统:
- Linux:最佳性能,支持所有优化功能
- macOS:良好性能,部分优化功能受限
运行命令
# 进入 benchmark 目录
cd benchmark/file_file
# 默认大规模性能测试(2000 万行数据)
./run.sh
# 中等规模测试(20 万行数据)
./run.sh -m
# 强制重新生成数据(即使已存在)
./run.sh -f
# 指定 worker 数量
./run.sh -w 8
# 使用特定 WPL 规则
./run.sh nginx
# 组合使用
./run.sh -m -w 8 -f nginx
运行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-m | 使用中等规模数据集 | 2000万 → 20万行 |
-f | 强制重新生成数据 | 智能检测 |
-w <cnt> | 指定 worker 数量 | 2 |
wpl_dir | WPL 规则目录名 | nginx |
speed | 生成器限速(行/秒) | 0(不限速) |
性能测试选项
- 默认测试:2000 万行数据,单路文件源,2 个 worker
- 中等测试:20 万行数据,适合快速验证
- 强制生成:
-f参数强制重新生成测试数据 - 自定义 WPL:支持 nginx、apache、sysmon 等规则
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境准备
- 加载 benchmark 公共函数库
- 解析命令行参数
- 设置默认值(大规模:2000万行,中等:20万行)
-
初始化环境
- 初始化 release 模式环境
- 验证指定的 WPL 规则路径
- 清理历史数据和日志
-
数据生成检查
- 检查
data/in_dat/gen.dat是否存在 - 如果不存在或使用
-f参数,则生成新数据
- 检查
-
数据生成(如需要)
- 启动
wpgen生成数据到gen.dat - 支持并发和批量生成
- 启动
-
批处理执行
- 使用
wparse batch读取文件数据 - 应用 WPL 规则进行解析
- 数据输出到文件(all.dat)
- 使用
-
性能统计
- 实时显示处理进度
- 记录吞吐量、处理时间等指标
- 输出最终性能报告
数据流向
wpgen 生成器
↓
gen.dat (输入文件)
↓
┌────────────────────────────────┐
│ wparse batch │
│ - 读取文件数据 │
│ - 应用 WPL 规则解析 │
│ - 分发到 sinks │
└────────────────────────────────┘
↓
┌─────────────┬─────────────┐
│ all.dat │ monitor │
│ (主输出) │ sink │
│ │ (收集统计) │
└─────────────┴─────────────┘
使用建议
-
选择 file_file:
- 需要测试完整的数据处理管道
- 验证输出格式和内容
- 文件到文件转换场景
-
选择 file_blackhole:
- 只关心解析性能
- 批量数据处理
- 追求最高吞吐量
-
选择 tcp_blackhole:
- 网络数据源
- 实时处理需求
- 可靠传输要求
-
选择 syslog_blackhole:
- 日志集成
- 高频数据接收
- 传统 syslog 场景
贡献与反馈
如发现问题或有性能优化建议,请:
- 提交详细的测试环境信息(CPU、内存、存储配置)
- 包含完整的性能报告和 I/O 统计
- 分享存储优化经验和最佳实践
- 提供不同文件格式下的性能对比
本文档最后更新时间:2025-12-16
file_blackhole
本用例演示“文件源 → Blackhole 汇“的批处理性能基准测试场景:使用 wpgen 生成测试数据文件,wparse 通过批处理模式读取并解析,输出到 blackhole 以测试纯解析吞吐性能。
目录结构
benchmark/file_blackhole/
├── README.md # 本说明文档
├── run.sh # 性能测试运行脚本
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ ├── wpgen.toml # 第一路文件生成器配置
│ └── wpgen1.toml # 第二路文件生成器配置
├── models/ # 模型配置目录
│ ├── sinks/ # 数据汇配置
│ │ ├── defaults.toml # 默认配置
│ │ ├── business.d/ # 业务组配置
│ │ │ └── all.toml # Blackhole 汇组配置
│ │ └── infra.d/ # 基础设施组配置
│ │ ├── default.toml # 默认数据汇
│ │ ├── error.toml # 错误数据处理
│ │ ├── miss.toml # 缺失数据处理
│ │ ├── monitor.toml # 监控数据处理
│ │ └── residue.toml # 残留数据处理
│ ├── sources/ # 数据源配置
│ │ └── wpsrc.toml # 文件源配置
│ ├── wpl/ # WPL 解析规则目录
│ │ ├── nginx/ # Nginx 日志规则
│ │ ├── apache/ # Apache 日志规则
│ │ └── sysmon/ # 系统监控规则
│ ├── oml/ # OML 转换规则目录(空)
│ └── knowledge/ # 知识库目录(空)
├── data/ # 运行数据目录
│ ├── in_dat/ # 输入数据目录
│ │ ├── gen.dat # 第一路生成数据
│ │ └── gen1.dat # 第二路生成数据
│ ├── out_dat/ # 输出数据目录
│ │ ├── error.dat # 错误数据输出
│ │ ├── miss.dat # 缺失数据输出
│ │ ├── monitor.dat # 监控数据输出
│ │ └── residue.dat # 残留数据输出
│ ├── logs/ # 日志文件目录
│ └── rescue/ # 救援数据目录
├── out/ # 输出目录
└── .run/ # 运行时数据目录
└── rule_mapping.dat # 规则映射数据
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
- 推荐系统:
- Linux:最佳性能,支持所有优化功能
- macOS:良好性能,部分优化功能受限
运行命令
# 进入 benchmark 目录
cd benchmark/file_blackhole
# 默认大规模性能测试(2000 万行数据)
./run.sh
# 中等规模测试(20 万行数据)
./run.sh -m
# 强制重新生成数据(即使已存在)
./run.sh -f
# 指定 worker 数量
./run.sh -w 8
# 使用特定 WPL 规则
./run.sh nginx
# 组合使用
./run.sh -m -w 8 -f nginx
运行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-m | 使用中等规模数据集 | 2000万 → 20万行 |
-f | 强制重新生成数据 | 智能检测 |
-w <cnt> | 指定 worker 数量 | 6 |
wpl_dir | WPL 规则目录名 | nginx |
speed | 生成器限速(行/秒) | 0(不限速) |
性能测试选项
- 默认测试:2000 万行数据,双路文件源,6 个 worker
- 中等测试:20 万行数据,适合快速验证
- 强制生成:
-f参数强制重新生成测试数据 - 自定义 WPL:支持 nginx、apache、sysmon 等规则
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境准备
- 加载 benchmark 公共函数库
- 解析命令行参数
- 设置默认值(大规模:2000万行,中等:20万行)
-
数据生成检查
- 检查
data/in_dat/gen.dat和data/in_dat/gen1.dat是否存在 - 如果不存在或使用
-f参数,则生成新数据
- 检查
-
数据生成(如需要)
- 启动
wpgen生成第一路数据到gen.dat - 启动
wpgen生成第二路数据到gen1.dat - 支持并发生成提高效率
- 启动
-
批处理执行
- 使用
wparse batch读取文件数据 - 应用 WPL 规则进行解析
- 数据输出到 blackhole(丢弃)
- 使用
-
性能统计
- 实时显示处理进度
- 记录吞吐量、处理时间等指标
- 输出最终性能报告
数据流向
wpgen 生成器 1 wpgen 生成器 2
↓ ↓
gen.dat gen1.dat
↓ ↓
┌────────────────────────────────┐
│ wparse batch │
│ - 读取文件数据 │
│ - 应用 WPL 规则解析 │
│ - 分发到 sinks │
└────────────────────────────────┘
↓
┌─────────────┬─────────────┐
│ blackhole │ monitor │
│ sink │ sink │
│ (丢弃数据) │ (收集统计) │
└─────────────┴─────────────┘
验证与故障排除
运行成功验证
-
检查性能输出
- 查看 terminal 输出的实时统计信息
- 关注 “Throughput”(吞吐量)指标
- 确认无错误或异常
-
验证输出文件
# 检查监控数据 ls -la data/out_dat/monitor.dat # 确认其他文件为空(无错误) ls -la data/out_dat/{error,miss,residue}.dat
性能
优化
-
系统级优化
Linux 系统:
# CPU 亲和性设置 taskset -c 0-5 ./run.sh -w 6 # I/O 调度器优化(SSD) echo noop | sudo tee /sys/block/sdX/queue/scheduler # 增大文件描述符限制 ulimit -n 65536macOS 系统:
# 调整文件描述符限制 ulimit -n 65536 # 调整系统参数(需要管理员权限) sudo sysctl -w kern.maxfiles=65536 sudo sysctl -w kern.maxfilesperproc=65536 -
应用级优化
- 增加 worker 数量:
-w 12(不超过 CPU 核心数) - 使用更快的 WPL 规则(如 nginx)
- 启用数据预生成并缓存
- 增加 worker 数量:
-
存储优化
- 使用 SSD 存储
- 使用 RAID 0 提高读写性能
- 考虑使用内存文件系统
影响因素
-
WPL 规则复杂度
- nginx:简单正则,性能最佳
- apache:中等复杂度
- sysmon:复杂规则,性能较低
-
数据特征
- 日志行长度
- 正则匹配复杂度
- 字段提取数量
-
系统配置
- CPU 核心数和频率
- 内存大小和速度
- 磁盘 I/O 性能(关键因素)
使用建议
-
选择 file_blackhole:
- 需要测试纯解析性能
- 批量数据处理场景
- 追求最高吞吐量
-
选择 tcp_blackhole:
- 需要可靠的网络传输
- 实时数据处理
- 模拟 TCP 数据源
-
选择 syslog_blackhole:
- 传统 syslog 集成
- 极限性能测试
- 日志收集场景
本文档最后更新时间:2025-12-16
file_file 说明
本用例演示“文件源 → 文件汇“的性能基准测试场景:使用 wpgen 生成测试数据文件,wparse 通过批处理模式读取并解析,输出到文件以测试完整的数据处理管道性能。
目录结构
benchmark/file_file/
├── README.md # 本说明文档
├── run.sh # 性能测试运行脚本
├── record.md # 运行记录文档
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ └── wpgen.toml # 文件生成器配置
├── data/ # 运行数据目录
│ ├── in_dat/ # 输入数据目录
│ │ └── gen.dat # 生成数据文件
│ ├── out_dat/ # 输出数据目录
│ │ ├── all.dat # 主输出文件
│ │ ├── error.dat # 错误数据输出
│ │ ├── miss.dat # 缺失数据输出
│ │ ├── monitor.dat # 监控数据输出
│ │ └── residue.dat # 残留数据输出
│ ├── logs/ # 日志文件目录
│ └── rescue/ # 救援数据目录
└── .run/ # 运行时数据目录
└── rule_mapping.dat # 规则映射数据
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
- 推荐系统:
- Linux:最佳性能,支持所有优化功能
- macOS:良好性能,部分优化功能受限
运行命令
# 进入 benchmark 目录
cd benchmark/file_file
# 默认大规模性能测试(2000 万行数据)
./run.sh
# 中等规模测试(20 万行数据)
./run.sh -m
# 强制重新生成数据(即使已存在)
./run.sh -f
# 指定 worker 数量
./run.sh -w 8
# 使用特定 WPL 规则
./run.sh nginx
# 组合使用
./run.sh -m -w 8 -f nginx
运行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-m | 使用中等规模数据集 | 2000万 → 20万行 |
-f | 强制重新生成数据 | 智能检测 |
-w <cnt> | 指定 worker 数量 | 2 |
wpl_dir | WPL 规则目录名 | nginx |
speed | 生成器限速(行/秒) | 0(不限速) |
性能测试选项
- 默认测试:2000 万行数据,单路文件源,2 个 worker
- 中等测试:20 万行数据,适合快速验证
- 强制生成:
-f参数强制重新生成测试数据 - 自定义 WPL:支持 nginx、apache、sysmon 等规则
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境准备
- 加载 benchmark 公共函数库
- 解析命令行参数
- 设置默认值(大规模:2000万行,中等:20万行)
-
初始化环境
- 初始化 release 模式环境
- 验证指定的 WPL 规则路径
- 清理历史数据和日志
-
数据生成检查
- 检查
data/in_dat/gen.dat是否存在 - 如果不存在或使用
-f参数,则生成新数据
- 检查
-
数据生成(如需要)
- 启动
wpgen生成数据到gen.dat - 支持并发和批量生成
- 启动
-
批处理执行
- 使用
wparse batch读取文件数据 - 应用 WPL 规则进行解析
- 数据输出到文件(all.dat)
- 使用
-
性能统计
- 实时显示处理进度
- 记录吞吐量、处理时间等指标
- 输出最终性能报告
数据流向
wpgen 生成器
↓
gen.dat (输入文件)
↓
┌────────────────────────────────┐
│ wparse batch │
│ - 读取文件数据 │
│ - 应用 WPL 规则解析 │
│ - 分发到 sinks │
└────────────────────────────────┘
↓
┌─────────────┬─────────────┐
│ all.dat │ monitor │
│ (主输出) │ sink │
│ │ (收集统计) │
└─────────────┴─────────────┘
使用建议
-
选择 file_file:
- 需要测试完整的数据处理管道
- 验证输出格式和内容
- 文件到文件转换场景
-
选择 file_blackhole:
- 只关心解析性能
- 批量数据处理
- 追求最高吞吐量
-
选择 tcp_blackhole:
- 网络数据源
- 实时处理需求
- 可靠传输要求
-
选择 syslog_blackhole:
- 日志集成
- 高频数据接收
- 传统 syslog 场景
贡献与反馈
如发现问题或有性能优化建议,请:
- 提交详细的测试环境信息(CPU、内存、存储配置)
- 包含完整的性能报告和 I/O 统计
- 分享存储优化经验和最佳实践
- 提供不同文件格式下的性能对比
本文档最后更新时间:2025-12-16
syslog_blackhole 说明
本用例演示“Syslog 源 → Blackhole 汇“的性能基准测试场景:使用 wpgen 通过 Syslog 协议发送数据,wparse 以 daemon 模式接收并处理,输出到 blackhole 以测试网络接收与解析的综合性能。
目录结构
benchmark/syslog_blackhole/
├── README.md # 本说明文档
├── run.sh # 性能测试运行脚本
├── record.md # 运行记录文档
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ ├── wpgen.toml # Syslog UDP 生成器配置
│ └── wpgen1.toml # Syslog TCP 生成器配置(可选)
├── data/ # 运行数据目录
│ ├── out_dat/ # 输出数据目录
│ │ ├── error.dat # 错误数据输出
│ │ ├── miss.dat # 缺失数据输出
│ │ ├── monitor.dat # 监控数据输出
│ │ └── residue.dat # 残留数据输出
│ ├── logs/ # 日志文件目录
│ └── rescue/ # 救援数据目录
├── logs/ # 额外的日志目录
└── .run/ # 运行时数据目录
└── rule_mapping.dat # 规则映射数据
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
- 支持 UDP/TCP 网络连接的系统环境
- 推荐系统:
- Linux:最佳性能,支持所有优化功能
- macOS:良好性能,部分优化功能受限
运行命令
# 进入 benchmark 目录
cd benchmark
# 默认大规模性能测试(2000 万行数据)
./syslog_blackhole/run.sh
# 中等规模测试(20 万行数据)
./syslog_blackhole/run.sh -m
# 指定 worker 数量
./syslog_blackhole/run.sh -w 8
# 使用特定 WPL 规则
./syslog_blackhole/run.sh nginx
# 使用 sysmon 规则并限速 50 万行/秒
./syslog_blackhole/run.sh sysmon 500000
# 组合使用
./syslog_blackhole/run.sh -m -w 4 nginx 300000
运行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-m | 使用中等规模数据集 | 2000万 → 20万行 |
-w <cnt> | 指定 worker 数量 | 2 |
wpl_dir | WPL 规则目录名 | nginx |
speed | 生成器限速(行/秒) | 0(不限速) |
性能测试选项
- 默认测试:2000 万行数据,Syslog UDP,2 个 worker
- 中等测试:20 万行数据,适合快速验证
- 自定义 WPL:支持 nginx、apache、sysmon 等规则
- 速率限制:可指定生成速率,测试流控性能
- 双协议支持:可切换 UDP/TCP 模式
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境准备
- 加载 benchmark 公共函数库
- 解析命令行参数
- 设置默认值(大规模:2000万行,中等:20万行)
-
初始化环境
- 初始化 release 模式环境
- 验证指定的 WPL 规则路径
- 清理历史数据和日志
-
启动 Daemon 模式
- 启动
wparse daemon监听 Syslog 端口 - 加载指定的 WPL 规则
- 等待 Syslog 连接
- 启动
-
数据生成与发送
- 启动
wpgen生成测试数据 - 通过 Syslog 协议发送到 wparse daemon
- 支持高并发发送
- 启动
-
性能监控
- 实时监控处理速度
- 记录吞吐量、延迟等指标
- 收集错误和异常统计
-
结果统计
- 停止 daemon 进程
- 输出性能报告
- 验证数据完整性
数据流向
wpgen 生成器
↓ Syslog 协议 (UDP/TCP, 端口 1514/1515)
┌────────────────────────────────┐
│ wparse daemon │
│ - 接收 Syslog 数据 │
│ - 应用 WPL 规则解析 │
│ - 分发到 sinks │
└────────────────────────────────┘
↓
┌─────────────┬─────────────┐
│ blackhole │ monitor │
│ sink │ sink │
│ (丢弃数据) │ (收集统计) │
└─────────────┴─────────────┘
syslog_blackhole 说明
本用例演示“Syslog 源 → Blackhole 汇“的性能基准测试场景:使用 wpgen 通过 Syslog 协议发送数据,wparse 以 daemon 模式接收并处理,输出到 blackhole 以测试网络接收与解析的综合性能。
目录结构
benchmark/syslog_blackhole/
├── README.md # 本说明文档
├── run.sh # 性能测试运行脚本
├── record.md # 运行记录文档
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ ├── wpgen.toml # Syslog UDP 生成器配置
│ └── wpgen1.toml # Syslog TCP 生成器配置(可选)
├── data/ # 运行数据目录
│ ├── out_dat/ # 输出数据目录
│ │ ├── error.dat # 错误数据输出
│ │ ├── miss.dat # 缺失数据输出
│ │ ├── monitor.dat # 监控数据输出
│ │ └── residue.dat # 残留数据输出
│ ├── logs/ # 日志文件目录
│ └── rescue/ # 救援数据目录
├── logs/ # 额外的日志目录
└── .run/ # 运行时数据目录
└── rule_mapping.dat # 规则映射数据
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
- 支持 UDP/TCP 网络连接的系统环境
- 推荐系统:
- Linux:最佳性能,支持所有优化功能
- macOS:良好性能,部分优化功能受限
运行命令
# 进入 benchmark 目录
cd benchmark
# 默认大规模性能测试(2000 万行数据)
./syslog_blackhole/run.sh
# 中等规模测试(20 万行数据)
./syslog_blackhole/run.sh -m
# 指定 worker 数量
./syslog_blackhole/run.sh -w 8
# 使用特定 WPL 规则
./syslog_blackhole/run.sh nginx
# 使用 sysmon 规则并限速 50 万行/秒
./syslog_blackhole/run.sh sysmon 500000
# 组合使用
./syslog_blackhole/run.sh -m -w 4 nginx 300000
运行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-m | 使用中等规模数据集 | 2000万 → 20万行 |
-w <cnt> | 指定 worker 数量 | 2 |
wpl_dir | WPL 规则目录名 | nginx |
speed | 生成器限速(行/秒) | 0(不限速) |
性能测试选项
- 默认测试:2000 万行数据,Syslog UDP,2 个 worker
- 中等测试:20 万行数据,适合快速验证
- 自定义 WPL:支持 nginx、apache、sysmon 等规则
- 速率限制:可指定生成速率,测试流控性能
- 双协议支持:可切换 UDP/TCP 模式
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境准备
- 加载 benchmark 公共函数库
- 解析命令行参数
- 设置默认值(大规模:2000万行,中等:20万行)
-
初始化环境
- 初始化 release 模式环境
- 验证指定的 WPL 规则路径
- 清理历史数据和日志
-
启动 Daemon 模式
- 启动
wparse daemon监听 Syslog 端口 - 加载指定的 WPL 规则
- 等待 Syslog 连接
- 启动
-
数据生成与发送
- 启动
wpgen生成测试数据 - 通过 Syslog 协议发送到 wparse daemon
- 支持高并发发送
- 启动
-
性能监控
- 实时监控处理速度
- 记录吞吐量、延迟等指标
- 收集错误和异常统计
-
结果统计
- 停止 daemon 进程
- 输出性能报告
- 验证数据完整性
数据流向
wpgen 生成器
↓ Syslog 协议 (UDP/TCP, 端口 1514/1515)
┌────────────────────────────────┐
│ wparse daemon │
│ - 接收 Syslog 数据 │
│ - 应用 WPL 规则解析 │
│ - 分发到 sinks │
└────────────────────────────────┘
↓
┌─────────────┬─────────────┐
│ blackhole │ monitor │
│ sink │ sink │
│ (丢弃数据) │ (收集统计) │
└─────────────┴─────────────┘
apt_tcp_to_blackhole
本测试用于验证 apt_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:APT 3K 威胁日志,TCP 输入到 BlackHole 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 APT 3K 威胁日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | BlackHole | 298,200 | 1008.72 | 693.55 % / 762.10 % | 408.87 MB / 481.27 MB |
| Vector | TCP | BlackHole | 46,100 | 155.94 | 849.30 % / 921.50 % | 421.18 MB / 445.80 MB |
结论
在本测试场景(APT 3K 威胁日志,TCP 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 298,200 EPS,约是 Vector (46,100 EPS) 的 6.47 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更低(693.55 % vs 849.30 %)。
- 内存: WarpParse 的内存占用基本持平(408.87 MB vs 421.18 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 6.47 倍),同时保持了更低的 CPU 占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
apt_tcp_to_file
本测试用于验证 apt_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:APT 3K 威胁日志,TCP 输入到 File 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 APT 3K 威胁日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | File | 179,600 | 607.53 | 605.69 % / 853.20 % | 1016.06 MB/ 1987.94 MB |
| Vector | TCP | File | 36,200 | 122.45 | 688.47 % / 754.70 % | 368.91 MB / 397.16 MB |
结论
在本测试场景(APT 3K 威胁日志,TCP 输入到 File 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 179,600 EPS,约是 Vector (36,200 EPS) 的 4.96 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更低(605.69 % vs 688.47 %)。
- 内存: WarpParse 的内存占用更高(1016.06 MB vs 368.91 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 4.96 倍),同时保持了更低的 CPU 占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
aws_tcp_to_blackhole
本测试用于验证 aws_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:AWS ELB 日志,TCP 输入到 BlackHole 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 AWS ELB 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | BlackHole | 884,700 | 346.76 | 612.28 % / 813.60 % | 709.96 MB / 742.78 MB |
| Vector | TCP | BlackHole | 163,600 | 64.12 | 628.67 % / 674.60 % | 264.21 MB / 275.98 MB |
结论
在本测试场景(AWS ELB 日志,TCP 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 884,700 EPS,约是 Vector (163,600 EPS) 的 5.41 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率基本持平(612.28 % vs 628.67 %)。
- 内存: WarpParse 的内存占用更高(709.96 MB vs 264.21 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 5.41 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
aws_tcp_to_file
本测试用于验证 aws_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:AWS ELB 日志,TCP 输入到 File 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 AWS ELB 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | File | 347,800 | 136.32 | 495.90 % / 615.00 % | 481.30 MB / 847.70 MB |
| Vector | TCP | File | 74,700 | 29.28 | 374.47 % / 409.50 % | 264.70 MB / 273.64 MB |
结论
在本测试场景(AWS ELB 日志,TCP 输入到 File 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 347,800 EPS,约是 Vector (74,700 EPS) 的 4.66 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(495.90 % vs 374.47 %)。
- 内存: WarpParse 的内存占用更高(481.30 MB vs 264.70 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 4.66 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
mixed_tcp_to_blackhole
本测试用于验证 mixed_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景覆盖两类混合日志:
- Mixed-1295B:四类日志 1:1:1:1 混合,平均 1295B。
- Mixed-867B:四类日志 3:2:1:1 混合,平均 867B。
链路为 TCP 输入到 BlackHole 输出,仅做日志解析。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Mixed 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Parse Only,Mac M4 Mini)
| 配比/平均大小 | 引擎 | EPS | MPS |
|---|---|---|---|
| 1:1:1:1 / 1295B | WarpParse | 446,300 | 551.18 |
| Vector | 110,200 | 136.10 | |
| 3:2:1:1 / 867B | WarpParse | 613,000 | 506.85 |
| Vector | 161,000 | 133.12 |
结论
在本测试场景(Mixed 日志,TCP 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 在两种混合配比下均显著领先。
- 1:1:1:1 配比:446,300 EPS(MPS 551.18),约为 Vector 的 4.0x。
- 3:2:1:1 配比:613,000 EPS(MPS 506.85),约为 Vector 的 3.8x。
-
系统资源开销: 资源详情见报告主表。
总结: 两种混合配比下,WarpParse 在 TCP→BlackHole 解析场景都保持明显吞吐优势。
mixed_tcp_to_file
本测试用于验证 mixed_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景覆盖两类混合日志:
- Mixed-1295B:四类日志 1:1:1:1 混合,平均 1295B。
- Mixed-867B:四类日志 3:2:1:1 混合,平均 867B。
链路为 TCP 输入到 File 输出,仅做日志解析。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Mixed 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证链路落盘吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Parse Only,Mac M4 Mini)
| 配比/平均大小 | 引擎 | EPS | MPS |
|---|---|---|---|
| 1:1:1:1 / 1295B | WarpParse | 229,100 | 282.94 |
| Vector | 61,000 | 75.34 | |
| 3:2:1:1 / 867B | WarpParse | 308,400 | 255.00 |
| Vector | 69,500 | 57.47 |
结论
在本测试场景(Mixed 日志,TCP 输入到 File 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 在两种混合配比下均领先。
- 1:1:1:1 配比:229,100 EPS(MPS 282.94),约为 Vector 的 3.8x。
- 3:2:1:1 配比:308,400 EPS(MPS 255.00),约为 Vector 的 4.4x。
-
系统资源开销: 资源详情见报告主表;落盘链路的内存峰值受缓冲策略影响。
总结: 两种混合配比下,WarpParse 在 TCP→File 解析场景保持明显吞吐优势。
nginx_tcp_to_blackhole
本测试用于验证 nginx_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:Nginx 访问日志,TCP 输入到 BlackHole 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Nginx 访问日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | BlackHole | 1,737,200 | 395.96 | 506.85 % / 650.90 % | 426.09 MB / 450.23 MB |
| Vector | TCP | BlackHole | 974,100 | 222.02 | 530.76 % / 660.60 % | 233.23 MB / 238.45 MB |
结论
在本测试场景(Nginx 访问日志,TCP 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 1,737,200 EPS,约是 Vector (974,100 EPS) 的 1.78 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率基本持平(506.85 % vs 530.76 %)。
- 内存: WarpParse 的内存占用更高(426.09 MB vs 233.23 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 1.78 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
nginx_tcp_to_file
本测试用于验证 nginx_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:Nginx 访问日志,TCP 输入到 File 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Nginx 访问日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | File | 1,084,600 | 247.21 | 541.19 % / 722.40 % | 696.63 MB / 699.62 MB |
| Vector | TCP | File | 91,200 | 20.79 | 186.35 % / 194.70 % | 230.62 MB / 244.22 MB |
结论
在本测试场景(Nginx 访问日志,TCP 输入到 File 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 1,084,600 EPS,约是 Vector (91,200 EPS) 的 11.89 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(541.19 % vs 186.35 %)。
- 内存: WarpParse 的内存占用更高(696.63 MB vs 230.62 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 11.89 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
sysmon_tcp_to_blackhole
本测试用于验证 sysmon_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:Sysmon 1K JSON 日志,TCP 输入到 BlackHole 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Sysmon 1K JSON 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | BlackHole | 418,900 | 393.90 | 720.42 % / 814.70 % | 455.91 MB / 461.02 MB |
| Vector | TCP | BlackHole | 111,900 | 105.22 | 720.04 % / 808.80 % | 362.95 MB / 376.90 MB |
结论
在本测试场景(Sysmon 1K JSON 日志,TCP 输入到 BlackHole 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 418,900 EPS,约是 Vector (111,900 EPS) 的 3.74 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率基本持平(720.42 % vs 720.04 %)。
- 内存: WarpParse 的内存占用更高(455.91 MB vs 362.95 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 3.74 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
sysmon_tcp_to_file
本测试用于验证 sysmon_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析)。
场景描述
本场景可概括为:Sysmon 1K JSON 日志,TCP 输入到 File 输出,执行 日志解析 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Sysmon 1K JSON 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证链路吞吐能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | File | 279,700 | 263.01 | 713.18 % / 789.30 % | 441.34 MB / 453.27 MB |
| Vector | TCP | File | 62,100 | 58.39 | 471.40 % / 543.40 % | 343.65 MB / 355.57 MB |
结论
在本测试场景(Sysmon 1K JSON 日志,TCP 输入到 File 输出,执行 日志解析 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 279,700 EPS,约是 Vector (62,100 EPS) 的 4.50 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(713.18 % vs 471.40 %)。
- 内存: WarpParse 的内存占用更高(441.34 MB vs 343.65 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 4.50 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
apt_tcp_to_blackhole
本测试用于验证 apt_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:APT 3K 威胁日志,TCP 输入到 BlackHole 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 APT 3K 威胁日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | BlackHole | 238,900 | 808.12 | 657.14 %/705.40 % | 364.73 MB/389.94 MB |
| Vector | TCP | BlackHole | 34,000 | 115.01 | 693.47 %/848.80 % | 408.92 MB/430.59 MB |
结论
在本测试场景(APT 3K 威胁日志,TCP 输入到 BlackHole 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 238,900 EPS,约是 Vector (34,000 EPS) 的 7.03 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更低(657.14 % vs 693.47 %)。
- 内存: WarpParse 的内存占用更低(364.73 MB vs 408.92 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 7.03 倍),同时系统资源开销(CPU & 内存)均显著降低。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
apt_tcp_to_file
本测试用于验证 apt_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:APT 3K 威胁日志,TCP 输入到 File 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 APT 3K 威胁日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | File | 169,800 | 574.38 | 663.90 %/883.80 % | 871.77 MB/1500.22 MB |
| Vector | TCP | File | 24,900 | 84.23 | 538.78 %/644.90 % | 393.26 MB/420.05 MB |
结论
在本测试场景(APT 3K 威胁日志,TCP 输入到 File 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 169,800 EPS,约是 Vector (24,900 EPS) 的 6.82 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(663.90 % vs 538.78 %)。
- 内存: WarpParse 的内存占用更高(871.77 MB vs 393.26 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 6.82 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
aws_tcp_to_blackhole
本测试用于验证 aws_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:AWS ELB 日志,TCP 输入到 BlackHole 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 AWS ELB 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | BlackHole | 611,800 | 239.80 | 624.17 %/753.00 % | 478.25 MB/487.42 MB |
| Vector | TCP | BlackHole | 152,900 | 59.93 | 611.53 %/677.50 % | 288.53 MB/294.42 MB |
结论
在本测试场景(AWS ELB 日志,TCP 输入到 BlackHole 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 611,800 EPS,约是 Vector (152,900 EPS) 的 4.00 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率基本持平(624.17 % vs 611.53 %)。
- 内存: WarpParse 的内存占用更高(478.25 MB vs 288.53 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 4.00 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
aws_tcp_to_file
本测试用于验证 aws_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:AWS ELB 日志,TCP 输入到 File 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 AWS ELB 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | File | 318,200 | 124.72 | 593.16 %/732.60 % | 409.21 MB/547.50 MB |
| Vector | TCP | File | 58,200 | 22.81 | 331.78 %/373.90 % | 276.99 MB/288.42 MB |
结论
在本测试场景(AWS ELB 日志,TCP 输入到 File 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 318,200 EPS,约是 Vector (58,200 EPS) 的 5.47 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(593.16 % vs 331.78 %)。
- 内存: WarpParse 的内存占用更高(409.21 MB vs 276.99 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 5.47 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
mixed_tcp_to_blackhole
本测试用于验证 mixed_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景覆盖两类混合日志:
- Mixed-1295B:四类日志 1:1:1:1 混合,平均 1295B。
- Mixed-867B:四类日志 3:2:1:1 混合,平均 867B。
链路为 TCP 输入到 BlackHole 输出,执行日志解析 + 转换。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Mixed 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证管线解析+转换能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确,转换链路正确执行。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Parse + Transform,Mac M4 Mini)
| 配比/平均大小 | 引擎 | EPS | MPS |
|---|---|---|---|
| 1:1:1:1 / 1295B | WarpParse | 387,400 | 478.44 |
| Vector | 108,400 | 133.87 | |
| 3:2:1:1 / 867B | WarpParse | 515,300 | 426.07 |
| Vector | 156,000 | 128.99 |
结论
在本测试场景(Mixed 日志,TCP 输入到 BlackHole 输出,执行 日志解析 + 转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 在两种混合配比下均显著领先。
- 1:1:1:1 配比:387,400 EPS(MPS 478.44),约为 Vector 的 3.6x。
- 3:2:1:1 配比:515,300 EPS(MPS 426.07),约为 Vector 的 3.3x。
-
系统资源开销: 资源详情见报告主表。
总结: 两种混合配比下,WarpParse 在 TCP→BlackHole 的解析+转换场景均保持明显吞吐优势。
mixed_tcp_to_file
本测试用于验证 mixed_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景覆盖两类混合日志:
- Mixed-1295B:四类日志 1:1:1:1 混合,平均 1295B。
- Mixed-867B:四类日志 3:2:1:1 混合,平均 867B。
链路为 TCP 输入到 File 输出,执行日志解析 + 转换。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Mixed 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证端到端落盘链路的解析+转换能力。
- 预期行为:
- 高频日志稳定消费,不丢失、不乱序,字段提取正确,转换链路正确执行。
- 在对应输入/输出链路下持续跑满数据源,不出现明显 backpressure。
- 监控指标可正常采集,用于后续性能对比。
Results(Parse + Transform,Mac M4 Mini)
| 配比/平均大小 | 引擎 | EPS | MPS |
|---|---|---|---|
| 1:1:1:1 / 1295B | WarpParse | 199,300 | 246.14 |
| Vector | 60,800 | 75.09 | |
| 3:2:1:1 / 867B | WarpParse | 299,600 | 247.72 |
| Vector | 69,500 | 57.47 |
结论
在本测试场景(Mixed 日志,TCP 输入到 File 输出,执行 日志解析 + 转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 在两种混合配比下均显著领先。
- 1:1:1:1 配比:199,300 EPS(MPS 246.14),约为 Vector 的 3.3x。
- 3:2:1:1 配比:299,600 EPS(MPS 247.72),约为 Vector 的 4.3x。
-
系统资源开销: 资源详情见报告主表;落盘链路的内存峰值受缓冲策略影响。
总结: 两种混合配比下,WarpParse 在 TCP→File 解析+转换场景保持明显吞吐优势。
nginx_tcp_to_blackhole
本测试用于验证 nginx_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:Nginx 访问日志,TCP 输入到 BlackHole 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Nginx 访问日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | BlackHole | 1,219,100 | 277.87 | 485.37 %/625.20 % | 415.22 MB/440.52 MB |
| Vector | TCP | BlackHole | 870,500 | 198.41 | 514.06 %/639.90 % | 238.50 MB/258.02 MB |
结论
在本测试场景(Nginx 访问日志,TCP 输入到 BlackHole 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 1,219,100 EPS,约是 Vector (870,500 EPS) 的 1.40 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更低(485.37 % vs 514.06 %)。
- 内存: WarpParse 的内存占用更高(415.22 MB vs 238.50 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 1.40 倍),同时保持了更低的 CPU 占用。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
nginx_tcp_to_file
本测试用于验证 nginx_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:Nginx 访问日志,TCP 输入到 File 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Nginx 访问日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | File | 797,700 | 181.82 | 492.15 %/621.20 % | 523.97 MB/540.97 MB |
| Vector | TCP | File | 70,800 | 16.14 | 160.79 %/180.60 % | 226.58 MB/236.41 MB |
结论
在本测试场景(Nginx 访问日志,TCP 输入到 File 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 797,700 EPS,约是 Vector (70,800 EPS) 的 11.27 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(492.15 % vs 160.79 %)。
- 内存: WarpParse 的内存占用更高(523.97 MB vs 226.58 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 11.27 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
sysmon_tcp_to_blackhole
本测试用于验证 sysmon_tcp_to_blackhole 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:Sysmon 1K JSON 日志,TCP 输入到 BlackHole 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Sysmon 1K JSON 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: BlackHole 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | BlackHole | 299,500 | 281.63 | 664.56 %/749.00 % | 367.47 MB/377.25 MB |
| Vector | TCP | BlackHole | 97,200 | 91.40 | 710.83 %/806.80 % | 399.64 MB/424.08 MB |
结论
在本测试场景(Sysmon 1K JSON 日志,TCP 输入到 BlackHole 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 299,500 EPS,约是 Vector (97,200 EPS) 的 3.08 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更低(664.56 % vs 710.83 %)。
- 内存: WarpParse 的内存占用更低(367.47 MB vs 399.64 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 3.08 倍),同时系统资源开销(CPU & 内存)均显著降低。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
sysmon_tcp_to_file
本测试用于验证 sysmon_tcp_to_file 场景下的引擎性能(Mac M4 Mini,日志解析+转换)。
场景描述
本场景可概括为:Sysmon 1K JSON 日志,TCP 输入到 File 输出,执行 日志解析+转换 能力。
本测试旨在评估 WarpParse 与 Vector 两款引擎在 Sysmon 1K JSON 日志 处理场景下的表现。
设计
- 测试目标: 对比两引擎在该日志场景下的吞吐、延迟、CPU/内存使用。
- 输入配置: TCP 输入,覆盖高并发/大吞吐压测场景。
- 输出配置: File 输出,用于验证链路吞吐能力。
- 预期行为:
- 解析与转换链路正确执行,字段映射/增强结果与规则期望一致。
- 高负载下转换不成为瓶颈,整体吞吐稳定,延迟可控。
- 性能与资源指标可正常采集,用于后续对比与回归。
Results(Mac M4 Mini)
| 引擎 | 输入模式 | 输出模式 | 消费速率(EPS) | MPS | CPU平均/峰值 | 内存平均/峰值 |
|---|---|---|---|---|---|---|
| WarpParse | TCP | File | 219,900 | 206.78 | 719.29 %/817.00 % | 431.93 MB/457.17 MB |
| Vector | TCP | File | 40,300 | 37.90 | 391.09 %/497.30 % | 394.67 MB/409.95 MB |
结论
在本测试场景(Sysmon 1K JSON 日志,TCP 输入到 File 输出,执行 日志解析+转换 能力)中,对比 WarpParse 与 Vector 的性能表现,得出以下结论:
-
吞吐性能: WarpParse 表现出显著优势。
- 消费速率达到 219,900 EPS,约是 Vector (40,300 EPS) 的 5.46 倍。
- 这意味着在相同硬件资源下,WarpParse 能够处理更大规模的数据流量。
-
系统资源开销:
- CPU: WarpParse 的 CPU 使用率更高(719.29 % vs 391.09 %)。
- 内存: WarpParse 的内存占用更高(431.93 MB vs 394.67 MB)。
总结: WarpParse 在该场景下展现了卓越的吞吐性能(领先约 5.46 倍),虽然在资源消耗上略有增加,但考虑到数倍的性能提升,整体能效比极高。对于追求高吞吐量的日志处理场景,WarpParse 是更优的选择。
tcp_blackhole 说明
本用例演示“TCP 源 → Blackhole 汇“的性能基准测试场景:使用 wpgen 通过 TCP 协议发送数据,wparse 以 daemon 模式接收并处理,输出到 blackhole 以测试可靠传输与解析的综合性能。
目录结构
benchmark/tcp_blackhole/
├── README.md # 本说明文档
├── run.sh # 性能测试运行脚本
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ ├── wpgen.toml # 第一路 TCP 生成器配置
│ └── wpgen2.toml # 第二路 TCP 生成器配置(可选)
├── models/ # 模型配置目录
│ ├── sinks/ # 数据汇配置
│ │ ├── defaults.toml # 默认配置
│ │ ├── business.d/ # 业务组配置
│ │ │ └── sink.toml # 业务汇组配置
│ │ └── infra.d/ # 基础设施组配置
│ │ ├── default.toml # 默认数据汇
│ │ ├── error.toml # 错误数据处理
│ │ ├── miss.toml # 缺失数据处理
│ │ ├── monitor.toml # 监控数据处理
│ │ └── residue.toml # 残留数据处理
│ ├── sources/ # 数据源配置
│ │ └── wpsrc.toml # TCP 源配置
│ ├── wpl/ # WPL 解析规则目录
│ │ ├── nginx/ # Nginx 日志规则
│ │ ├── apache/ # Apache 日志规则
│ │ └── sysmon/ # 系统监控规则
│ ├── oml/ # OML 转换规则目录(空)
│ └── knowledge/ # 知识库目录(空)
├── data/ # 运行数据目录
│ ├── out_dat/ # 输出数据目录
│ │ ├── error.dat # 错误数据输出
│ │ ├── miss.dat # 缺失数据输出
│ │ ├── monitor.dat # 监控数据输出
│ │ └── residue.dat # 残留数据输出
│ └── logs/ # 日志文件目录
└── .run/ # 运行时数据目录
└── rule_mapping.dat # 规则映射数据
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
- 支持 TCP 网络连接的系统环境
- 推荐系统:
- Linux:最佳性能,支持所有优化功能
- macOS:良好性能,部分优化功能受限
运行命令
# 进入 benchmark 目录
cd benchmark
# 默认大规模性能测试(2000 万行数据)
./tcp_blackhole/run.sh
# 中等规模测试(20 万行数据)
./tcp_blackhole/run.sh -m
# 使用 sysmon 规则并限速 100 万行/秒
./tcp_blackhole/run.sh sysmon 1000000
# 自定义测试参数
./tcp_blackhole/run.sh -w 8 nginx 500000
./tcp_blackhole/run.sh -w 8 sysmon 500000
运行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-m | 使用中等规模数据集 | 2000万 → 20万行 |
-w <cnt> | 指定 worker 数量 | 6 |
wpl_dir | WPL 规则目录名 | nginx |
speed | 生成器限速(行/秒) | 0(不限速) |
性能测试选项
- 默认测试:2000 万行 Nginx 日志,不限速,6 个 worker
- 中等测试:20 万行数据,适合快速验证
- 自定义 WPL:支持 nginx、apache、sysmon 等规则
- 速率限制:可指定生成速率,测试流控性能
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境准备
- 加载 benchmark 公共函数库
- 解析命令行参数
- 设置默认值(大规模:2000万行,中等:20万行)
-
初始化环境
- 初始化 release 模式环境
- 验证指定的 WPL 规则路径
- 清理历史数据和日志
-
启动 Daemon 模式
- 启动
wparse daemon监听 TCP 端口 - 加载指定的 WPL 规则
- 等待 TCP 连接
- 启动
-
数据生成与发送
- 启动
wpgen生成测试数据 - 通过 TCP 协议发送到 wparse daemon
- 支持单路或双路并发发送
- 启动
-
性能监控
- 实时监控处理速度
- 记录吞吐量、延迟等指标
- 收集错误和异常统计
-
结果统计
- 停止 daemon 进程
- 输出性能报告
- 验证数据完整性
数据流向
wpgen 生成器
↓ TCP 连接 (端口 19001)
┌────────────────────────────────┐
│ wparse daemon │
│ - 接收 TCP 数据 │
│ - 应用 WPL 规则解析 │
│ - 分发到 sinks │
└────────────────────────────────┘
↓
┌─────────────┬─────────────┐
│ blackhole │ monitor │
│ sink │ sink │
│ (丢弃数据) │ (收集统计) │
└─────────────┴─────────────┘
验证与故障排除
运行成功验证
-
检查性能输出
- 查看 terminal 输出的实时统计信息
- 关注 “Throughput”(吞吐量)指标
- 确认无错误或异常
-
验证输出文件
# 检查监控数据 ls -la data/out_dat/monitor.dat # 确认其他文件为空(无错误) ls -la data/out_dat/{error,miss,residue}.dat
常见问题与解决方案
1. TCP 连接被拒绝
错误信息:Connection refused
解决方案:
- 确认 wparse daemon 已成功启动
- 检查端口 19001 是否被占用
- 验证防火墙设置
# 检查端口占用
netstat -tlnp | grep 19001
# 或使用 ss 命令
ss -tlnp | grep 19001
2. daemon 进程未正常退出
解决方案:
# 查找并终止 wparse 进程
ps aux | grep wparse
kill -9 <PID>
# 清理可能残留的端口占用
sudo lsof -i :19001
性能
优化
-
系统级优化
Linux 系统:
# CPU 亲和性设置 taskset -c 0-5 ./run.sh -w 6 # 实时优先级(需要 root) sudo chrt -f 99 ./run.sh # 调整 TCP 缓冲区(需要 root) sudo sysctl -w net.core.wmem_max=26214400 sudo sysctl -w net.core.rmem_max=26214400
影响因素
-
WPL 规则复杂度
- nginx:简单正则,性能最佳
- apache:中等复杂度
- sysmon:复杂规则,性能较低
-
数据特征
- 日志行长度
- 正则匹配复杂度
- 字段提取数量
-
系统配置
- CPU 核心数和频率
- 内存大小和速度
- 磁盘 I/O(日志写入)
本文档最后更新时间:2025-12-16
tcp_blackhole 说明
本用例演示“TCP 源 → Blackhole 汇“的性能基准测试场景:使用 wpgen 通过 TCP 协议发送数据,wparse 以 daemon 模式接收并处理,输出到 blackhole 以测试可靠传输与解析的综合性能。
目录结构
benchmark/tcp_blackhole/
├── README.md # 本说明文档
├── run.sh # 性能测试运行脚本
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ ├── wpgen.toml # 第一路 TCP 生成器配置
│ └── wpgen2.toml # 第二路 TCP 生成器配置(可选)
├── models/ # 模型配置目录
│ ├── sinks/ # 数据汇配置
│ │ ├── defaults.toml # 默认配置
│ │ ├── business.d/ # 业务组配置
│ │ │ └── sink.toml # 业务汇组配置
│ │ └── infra.d/ # 基础设施组配置
│ │ ├── default.toml # 默认数据汇
│ │ ├── error.toml # 错误数据处理
│ │ ├── miss.toml # 缺失数据处理
│ │ ├── monitor.toml # 监控数据处理
│ │ └── residue.toml # 残留数据处理
│ ├── sources/ # 数据源配置
│ │ └── wpsrc.toml # TCP 源配置
│ ├── wpl/ # WPL 解析规则目录
│ │ ├── nginx/ # Nginx 日志规则
│ │ ├── apache/ # Apache 日志规则
│ │ └── sysmon/ # 系统监控规则
│ ├── oml/ # OML 转换规则目录(空)
│ └── knowledge/ # 知识库目录(空)
├── data/ # 运行数据目录
│ ├── out_dat/ # 输出数据目录
│ │ ├── error.dat # 错误数据输出
│ │ ├── miss.dat # 缺失数据输出
│ │ ├── monitor.dat # 监控数据输出
│ │ └── residue.dat # 残留数据输出
│ └── logs/ # 日志文件目录
└── .run/ # 运行时数据目录
└── rule_mapping.dat # 规则映射数据
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
- 支持 TCP 网络连接的系统环境
- 推荐系统:
- Linux:最佳性能,支持所有优化功能
- macOS:良好性能,部分优化功能受限
运行命令
# 进入 benchmark 目录
cd benchmark
# 默认大规模性能测试(2000 万行数据)
./tcp_blackhole/run.sh
# 中等规模测试(20 万行数据)
./tcp_blackhole/run.sh -m
# 使用 sysmon 规则并限速 100 万行/秒
./tcp_blackhole/run.sh sysmon 1000000
# 自定义测试参数
./tcp_blackhole/run.sh -w 8 nginx 500000
./tcp_blackhole/run.sh -w 8 sysmon 500000
运行参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-m | 使用中等规模数据集 | 2000万 → 20万行 |
-w <cnt> | 指定 worker 数量 | 6 |
wpl_dir | WPL 规则目录名 | nginx |
speed | 生成器限速(行/秒) | 0(不限速) |
性能测试选项
- 默认测试:2000 万行 Nginx 日志,不限速,6 个 worker
- 中等测试:20 万行数据,适合快速验证
- 自定义 WPL:支持 nginx、apache、sysmon 等规则
- 速率限制:可指定生成速率,测试流控性能
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境准备
- 加载 benchmark 公共函数库
- 解析命令行参数
- 设置默认值(大规模:2000万行,中等:20万行)
-
初始化环境
- 初始化 release 模式环境
- 验证指定的 WPL 规则路径
- 清理历史数据和日志
-
启动 Daemon 模式
- 启动
wparse daemon监听 TCP 端口 - 加载指定的 WPL 规则
- 等待 TCP 连接
- 启动
-
数据生成与发送
- 启动
wpgen生成测试数据 - 通过 TCP 协议发送到 wparse daemon
- 支持单路或双路并发发送
- 启动
-
性能监控
- 实时监控处理速度
- 记录吞吐量、延迟等指标
- 收集错误和异常统计
-
结果统计
- 停止 daemon 进程
- 输出性能报告
- 验证数据完整性
数据流向
wpgen 生成器
↓ TCP 连接 (端口 19001)
┌────────────────────────────────┐
│ wparse daemon │
│ - 接收 TCP 数据 │
│ - 应用 WPL 规则解析 │
│ - 分发到 sinks │
└────────────────────────────────┘
↓
┌─────────────┬─────────────┐
│ blackhole │ monitor │
│ sink │ sink │
│ (丢弃数据) │ (收集统计) │
└─────────────┴─────────────┘
验证与故障排除
运行成功验证
-
检查性能输出
- 查看 terminal 输出的实时统计信息
- 关注 “Throughput”(吞吐量)指标
- 确认无错误或异常
-
验证输出文件
# 检查监控数据 ls -la data/out_dat/monitor.dat # 确认其他文件为空(无错误) ls -la data/out_dat/{error,miss,residue}.dat
常见问题与解决方案
1. TCP 连接被拒绝
错误信息:Connection refused
解决方案:
- 确认 wparse daemon 已成功启动
- 检查端口 19001 是否被占用
- 验证防火墙设置
# 检查端口占用
netstat -tlnp | grep 19001
# 或使用 ss 命令
ss -tlnp | grep 19001
2. daemon 进程未正常退出
解决方案:
# 查找并终止 wparse 进程
ps aux | grep wparse
kill -9 <PID>
# 清理可能残留的端口占用
sudo lsof -i :19001
性能
优化
-
系统级优化
Linux 系统:
# CPU 亲和性设置 taskset -c 0-5 ./run.sh -w 6 # 实时优先级(需要 root) sudo chrt -f 99 ./run.sh # 调整 TCP 缓冲区(需要 root) sudo sysctl -w net.core.wmem_max=26214400 sudo sysctl -w net.core.rmem_max=26214400
影响因素
-
WPL 规则复杂度
- nginx:简单正则,性能最佳
- apache:中等复杂度
- sysmon:复杂规则,性能较低
-
数据特征
- 日志行长度
- 正则匹配复杂度
- 字段提取数量
-
系统配置
- CPU 核心数和频率
- 内存大小和速度
- 磁盘 I/O(日志写入)
本文档最后更新时间:2025-12-16
Linux性能测试报告
1. 技术概述与测试背景
1.1 测试背景
本报告旨在深度对比 WarpParse 与 Vector 在高性能日志处理场景下的能力差异。基于 Linux 平台测试数据,覆盖从轻量级 Web 日志到复杂的安全威胁日志,重点评估两者在单机环境下的解析(Parse)与转换(Transform)性能、资源消耗及规则维护成本。
1.2 被测对象
- WarpParse: 大禹安全公司研发的高性能 ETL 核心引擎,采用 Rust 构建,专为极致吞吐和复杂安全日志分析设计。
- Vector: 开源领域标杆级可观测性数据管道工具,同样采用 Rust 构建,以高性能和广泛的生态兼容性著称。
2. 测试环境与方法
2.1 测试环境(Test Environment)
平台信息(Platform)
- 平台类型:AWS EC2
- 操作系统:Ubuntu 24.04 LTS
- 系统架构:x86_64
计算资源(Compute)
- CPU:8 vCPU
- 内存:16 GiB
存储配置(Storage)
- 存储类型:Amazon EBS
- 卷类型:通用型 SSD(gp3)
- 卷大小:128 GiB
- IOPS:30,000
- 吞吐量:200 MiB/s
说明(Notes)
- gp3 卷支持 IOPS 与吞吐量独立配置,用于避免容量与性能强绑定
- 当前配置提供较高的随机 I/O 能力(IOPS),并具备中等顺序 I/O 吞吐能力
2.2 测试范畴 (Scope)
- 日志类型:
- Nginx Access Log (239B): 典型 Web 访问日志,高吞吐场景。
- AWS ELB Log (411B): 云设施负载均衡日志,中等复杂度。
- Sysmon JSON (1K): 终端安全监控日志,JSON 结构,字段较多。
- APT Threat Log (3K): 模拟的高级持续性威胁日志,大体积、长文本。
- Mixed Log: 上述四类日志混合形成的日志类型。
- 数据拓扑:
- File -> BlackHole: 测算引擎极限 I/O 读取与处理能力 (基准)。
- TCP -> BlackHole: 测算网络接收与处理能力。
- TCP -> File: 测算端到端完整落地能力。
- 测试能力:
- 解析 (Parse): 仅进行正则提取/JSON解析与字段标准化。
- 解析+转换 (Parse+Transform): 在解析基础上增加字段映射、富化、类型转换等逻辑。
2.3 评估指标
- EPS (Events Per Second): 每秒处理事件数(核心吞吐指标)。
- MPS (MiB/s): 每秒处理数据量。
- CPU/Memory: 进程平均与峰值资源占用。
- Rule Size: 规则配置文件体积,评估分发与维护成本。
3. 详细性能对比分析
3.1 日志解析能力 (Parse Only)
3.1.1 Nginx Access Log (239B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 790,900 | 180.27 | 549% / 583% | 66 MB / 67 MB | 4.1x |
| Vector | File -> BlackHole | 192,015 | 43.77 | 350% / 364% | 143 MB / 152 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 767,000 | 174.82 | 468% / 605% | 188 MB / 532 MB | 2.1x |
| Vector | TCP -> BlackHole | 371,100 | 84.58 | 519% / 540% | 153 MB / 157 MB | 1.0x |
| WarpParse | TCP -> File | 397,200 | 90.53 | 616% / 666% | 181 MB / 511 MB | 21.5x |
| Vector | TCP -> File | 18,500 | 4.22 | 186% / 195% | 231 MB / 244 MB | 1.0x |
解析规则大小:
- WarpParse:174B
- Vector:416B
3.1.2 AWS ELB Log (411B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 394,500 | 154.63 | 757% / 775% | 421 MB / 541 MB | 7.5x |
| Vector | File -> BlackHole | 52,875 | 20.72 | 534% / 585% | 145 MB / 152 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 367,700 | 144.12 | 686% / 724% | 205 MB / 564 MB | 6.3x |
| Vector | TCP -> BlackHole | 58,200 | 22.81 | 479% / 531% | 172 MB / 183 MB | 1.0x |
| WarpParse | TCP -> File | 169,700 | 66.52 | 704% / 731% | 170 MB / 222 MB | 11.1x |
| Vector | TCP -> File | 15,300 | 6.00 | 249% / 269% | 159 MB / 163 MB | 1.0x |
解析规则大小:
- WarpParse:1153B
- Vector:2289B
3.1.3 Sysmon JSON Log (1K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 152,500 | 143.40 | 726% / 776% | 318 MB / 368 MB | 5.1x |
| Vector | File -> BlackHole | 29,444 | 27.68 | 458% / 501% | 202 MB / 213 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 149,800 | 140.86 | 711% / 763% | 221 MB / 678 MB | 4.0x |
| Vector | TCP -> BlackHole | 37,400 | 35.17 | 580% / 650% | 236 MB / 246 MB | 1.0x |
| WarpParse | TCP -> File | 104,900 | 98.64 | 750% / 764% | 169 MB / 505 MB | 7.7x |
| Vector | TCP -> File | 13,600 | 12.79 | 323% / 352% | 213 MB / 222 MB | 1.0x |
解析规则大小:
- WarpParse:1552B
- Vector:3259B
3.1.4 APT Threat Log (3K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 134,700 | 455.65 | 465% / 565% | 136 MB / 161 MB | 9.8x |
| Vector | File -> BlackHole | 13,780 | 46.61 | 534% / 614% | 190 MB / 193 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 129,600 | 438.40 | 502% / 606% | 237 MB / 273 MB | 7.4x |
| Vector | TCP -> BlackHole | 17,400 | 58.86 | 783% / 795% | 228 MB / 246 MB | 1.0x |
| WarpParse | TCP -> File | 63,500 | 214.80 | 492% / 560% | 423 MB / 1161 MB | 7.8x |
| Vector | TCP -> File | 8,100 | 27.40 | 457% / 528% | 217 MB / 226 MB | 1.0x |
解析规则大小:
- WarpParse:985B
- Vector:1759B
3.1.5 Mixed Log (平均日志大小:867B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 267,600 | 221.26 | 649% / 758% | 298 MB / 347 MB | 4.7x |
| Vector | File -> BlackHole | 56,774 | 46.94 | 794% / 800% | 178 MB / 182 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 259,000 | 214.15 | 706% / 822% | 309 MB / 320 MB | 4.4x |
| Vector | TCP -> BlackHole | 58,500 | 48.37 | 778% / 787% | 205 MB / 216 MB | 1.0x |
| WarpParse | TCP -> File | 159,900 | 132.21 | 696% / 728% | 121 MB / 185 MB | 10.8x |
| Vector | TCP -> File | 14,800 | 12.24 | 294% / 318% | 203 MB / 215 MB | 1.0x |
解析规则大小:
- WarpParse:6102B
- Vector:9373B
混合日志规则:
- 4类日志按照3:2:1:1混合
3.2 解析 + 转换能力 (Parse + Transform)
3.2.1 Nginx Access Log(239B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 649,100 | 147.95 | 659% / 704% | 194 MB / 505 MB | 3.6x |
| Vector | File -> BlackHole | 181,739 | 41.42 | 381% / 397% | 156 MB / 169 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 574,200 | 130.88 | 522% / 613% | 138 MB / 383 MB | 1.8x |
| Vector | TCP -> BlackHole | 318,900 | 72.69 | 462% / 538% | 161 MB / 167 MB | 1.0x |
| WarpParse | TCP -> File | 299,900 | 68.36 | 583% / 644% | 145 MB / 348 MB | 16.9x |
| Vector | TCP -> File | 17,700 | 4.03 | 146% / 151% | 137 MB / 140 MB | 1.0x |
解析+转换规则大小:
- WarpParse:521B
- Vector:682B
3.2.2 AWS ELB Log(411B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 265,800 | 104.18 | 626% / 713% | 248 MB / 362 MB | 5.1x |
| Vector | File -> BlackHole | 52,380 | 20.53 | 495% / 551% | 171 MB / 181 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 239,600 | 93.91 | 576% / 628% | 120 MB / 166 MB | 4.3x |
| Vector | TCP -> BlackHole | 55,800 | 21.87 | 483% / 520% | 180 MB / 184 MB | 1.0x |
| WarpParse | TCP -> File | 139,900 | 54.84 | 679% / 741% | 183 MB / 284 MB | 7.8x |
| Vector | TCP -> File | 17,900 | 7.02 | 261% / 281% | 169 MB / 174 MB | 1.0x |
解析+转换规则大小:
- WarpParse:1694B
- Vector:2650B
3.2.3 Sysmon JSON Log (1K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 126,800 | 119.23 | 748% / 793% | 281 MB / 422 MB | 4.5x |
| Vector | File -> BlackHole | 28,157 | 26.48 | 454% / 511% | 221 MB / 232 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 119,900 | 112.74 | 715% / 772% | 180 MB / 563 MB | 3.5x |
| Vector | TCP -> BlackHole | 34,200 | 32.16 | 568% / 701% | 255 MB / 266 MB | 1.0x |
| WarpParse | TCP -> File | 84,900 | 79.83 | 706% / 764% | 170 MB / 384 MB | 5.8x |
| Vector | TCP -> File | 14,700 | 13.82 | 344% / 414% | 240 MB / 252 MB | 1.0x |
解析+转换规则大小:
- WarpParse:2249B
- Vector:3782B
3.2.4 APT Threat Log (3K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 122,500 | 414.38 | 542% / 637% | 161 MB / 204 MB | 9.6x |
| Vector | File -> BlackHole | 12,783 | 43.24 | 546% / 580% | 194 MB / 198 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 114,800 | 388.33 | 534% / 543% | 234 MB / 277 MB | 7.3x |
| Vector | TCP -> BlackHole | 15,700 | 53.11 | 786% / 796% | 236 MB / 249 MB | 1.0x |
| WarpParse | TCP -> File | 58,700 | 198.56 | 473% / 569% | 682 MB / 1296 MB | 6.4x |
| Vector | TCP -> File | 9,200 | 31.12 | 487% / 521% | 224 MB / 233 MB | 1.0x |
解析+转换规则大小:
- WarpParse:1638B
- Vector:2259B
3.2.5 Mixed Log (平均日志大小:867B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 223,300 | 184.63 | 673% / 777% | 328 MB / 387 MB | 3.9x |
| Vector | File -> BlackHole | 56,666 | 46.85 | 792% / 798% | 181 MB / 184 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 209,300 | 173.06 | 659% / 701% | 128 MB / 161 MB | 3.7x |
| Vector | TCP -> BlackHole | 57,300 | 47.38 | 782% / 787% | 202 MB / 211 MB | 1.0x |
| WarpParse | TCP -> File | 134,900 | 111.54 | 695% / 736% | 121 MB / 154 MB | 7.0x |
| Vector | TCP -> File | 19,400 | 16.04 | 308% / 317% | 209 MB / 213 MB | 1.0x |
解析+转换规则大小:
- WarpParse:6102B
- Vector:9373B
混合日志规则:
- 4类日志按照3:2:1:1混合
4. 核心发现与架构优势分析
4.1 性能与资源效率
核心发现:
- 吞吐量领先: Linux 平台各测试场景下,WarpParse 在解析场景领先 2.0x - 21.5x,解析+转换场景领先 1.8x - 16.9x。
- 算力利用率: WarpParse 依然采用“以算力换吞吐”的策略,CPU 占用高于 Vector,但换取数倍吞吐回报。
- 大日志处理: 在 APT (3K) 场景下,WarpParse 维持高吞吐与高 MPS,Vector 吞吐下降明显。
4.2 规则与维护成本
优势分析:
- 规则体积更小: 同等语义下,WarpParse 的规则体积显著小于 Vector 的 VRL 脚本。
- Nginx: 174B (WarpParse) vs 416B (Vector)
- APT: 985B (WarpParse) vs 1759B (Vector)
- 维护性: 规则体积更小意味着更快的分发与更短的冷启动时间,适合大规模 Agent 或边缘场景。
4.3 稳定性
- 压力测试过程中,WarpParse 保持稳定吞吐,未观察到明显背压导致的处理崩塌。
- 注意点: 在 TCP -> File 场景下,WarpParse 的内存占用在大包场景会有上升(如 APT 场景 1GB+),与其缓冲策略相关。
5. 总结与建议
| 决策维度 | 建议方案 | 理由 |
|---|---|---|
| 追求极致性能 | WarpParse | Linux 场景下 WarpParse 提供 2-20x 的性能优势,特别是 TCP -> File 端到端链路表现突出。 |
| 资源受限环境 | WarpParse | 峰值 CPU 较高,但完成同等数据量所需的总 CPU 时间更少;小包场景内存控制优秀。 |
| 边缘/Agent部署 | WarpParse | 规则文件小,便于快速热更新;单机处理能力强,减少中心端压力。 |
| 通用生态兼容 | WarpParse | 提供面向开发者的 API 与插件扩展机制,支持自定义输入/输出模块,兼顾性能与生态扩展能力。 |
结论: Linux 平台测试显示,WarpParse 在吞吐、规则体积与端到端能力上均优于 Vector,特别适用于 SIEM/SOC 等实时高吞吐日志处理场景。
Mac 性能测试报告
1. 技术概述与测试背景
1.1 测试背景
本报告旨在深度对比 WarpParse 与 Vector 在高性能日志处理场景下的能力差异。基于最新基线数据,测试覆盖了从轻量级 Web 日志到复杂的安全威胁日志,重点评估两者在单机环境下的解析(Parse)与转换(Transform)性能、资源消耗及规则维护成本。
1.2 被测对象
- WarpParse: 大禹安全公司研发的高性能 ETL 核心引擎,采用 Rust 构建,专为极致吞吐和复杂安全日志分析设计。
- Vector: 开源领域标杆级可观测性数据管道工具,同样采用 Rust 构建,以高性能和广泛的生态兼容性著称。
2. 测试环境与方法
2.1 测试环境
- 平台: Mac M4 Mini
- 操作系统: MacOS
- 硬件规格: 10C16G
2.2 测试范畴 (Scope)
- 日志类型:
- Nginx Access Log (239B): 典型 Web 访问日志,高吞吐场景。
- AWS ELB Log (411B): 云设施负载均衡日志,中等复杂度。
- Sysmon JSON (1K): 终端安全监控日志,JSON 结构,字段较多。
- APT Threat Log (3K): 模拟的高级持续性威胁日志,大体积、长文本。
- Mixed Log (): 上述四类日志混合起来形成的日志类型。
- 数据拓扑:
- File -> BlackHole: 测算引擎极限 I/O 读取与处理能力 (基准)。
- TCP -> BlackHole: 测算网络接收与处理能力。
- TCP -> File: 测算端到端完整落地能力。
- 测试能力:
- 解析 (Parse): 仅进行正则提取/JSON解析与字段标准化。
- 解析+转换 (Parse+Transform): 在解析基础上增加字段映射、富化、类型转换等逻辑。
2.3 评估指标
- EPS (Events Per Second): 每秒处理事件数(核心吞吐指标)。
- MPS (MiB/s): 每秒处理数据量。
- CPU/Memory: 进程平均与峰值资源占用。
- Rule Size: 规则配置文件体积,评估分发与维护成本。
3. 详细性能对比分析
3.1 日志解析能力 (Parse Only)
在纯解析场景下,WarpParse 展现出压倒性的性能优势,尤其在小包高并发场景下。
3.1.1 Nginx Access Log (239B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 2,456,100 | 559.81 | 684% / 825% | 107 MB / 120 MB | 4.5x |
| Vector | File -> BlackHole | 540,540 | 123.20 | 342% / 405% | 231 MB / 251 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 1,737,200 | 395.96 | 507% / 651% | 426 MB / 450 MB | 1.8x |
| Vector | TCP -> BlackHole | 974,100 | 222.02 | 531% / 661% | 233 MB / 238 MB | 1.0x |
| WarpParse | TCP -> File | 1,084,600 | 247.21 | 541% / 722% | 697 MB / 700 MB | 11.9x |
| Vector | TCP -> File | 91,200 | 20.79 | 186% / 195% | 231 MB / 244 MB | 1.0x |
解析规则大小:
- WarpParse:174B
- Vector:416B
3.1.2 AWS ELB Log (411B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 1,012,400 | 396.82 | 827% / 938% | 237 MB / 264 MB | 6.4x |
| Vector | File -> BlackHole | 158,730 | 62.22 | 634% / 730% | 297 MB / 307 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 884,700 | 346.76 | 612% / 814% | 710 MB / 743 MB | 5.4x |
| Vector | TCP -> BlackHole | 163,600 | 64.12 | 629% / 675% | 264 MB / 276 MB | 1.0x |
| WarpParse | TCP -> File | 347,800 | 136.32 | 496% / 615% | 481 MB / 848 MB | 4.7x |
| Vector | TCP -> File | 74,700 | 29.28 | 374% / 410% | 265 MB / 274 MB | 1.0x |
解析规则大小:
- WarpParse:1153B
- Vector:2289B
3.1.3 Sysmon JSON Log (1K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 440,000 | 413.74 | 852% / 944% | 224 MB / 338 MB | 5.7x |
| Vector | File -> BlackHole | 76,717 | 72.14 | 463% / 564% | 295 MB / 313 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 418,900 | 393.90 | 720% / 815% | 456 MB / 461 MB | 3.7x |
| Vector | TCP -> BlackHole | 111,900 | 105.22 | 720% / 809% | 363 MB / 377 MB | 1.0x |
| WarpParse | TCP -> File | 279,700 | 263.01 | 713% / 789% | 441 MB / 453 MB | 4.5x |
| Vector | TCP -> File | 62,100 | 58.39 | 471% / 543% | 344 MB / 356 MB | 1.0x |
解析规则大小:
- WarpParse:1552B
- Vector:3259B
3.1.4 APT Threat Log (3K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 314,200 | 1062.84 | 700% / 826% | 176 MB / 181 MB | 9.3x |
| Vector | File -> BlackHole | 33,614 | 113.71 | 563% / 678% | 261 MB / 278 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 298,200 | 1008.72 | 694% / 762% | 409 MB / 481 MB | 6.5x |
| Vector | TCP -> BlackHole | 46,100 | 155.94 | 849% / 922% | 421 MB / 446 MB | 1.0x |
| WarpParse | TCP -> File | 179,600 | 607.53 | 606% / 853% | 1016 MB / 1988 MB | 5.0x |
| Vector | TCP -> File | 36,200 | 122.45 | 688% / 755% | 369 MB / 397 MB | 1.0x |
解析规则大小:
- WarpParse:985B
- Vector:1759B
3.1.5 Mixed log (平均日志大小:867B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 672,500 | 556.05 | 815% / 904% | 218 MB / 250 MB | 4.7x |
| Vector | File -> BlackHole | 143,608 | 118.74 | 845% / 958% | 271 MB / 290 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 613,000 | 506.85 | 652% / 805% | 365 MB / 580 MB | 3.8x |
| Vector | TCP -> BlackHole | 161,000 | 133.12 | 919% / 957% | 324 MB / 333 MB | 1.0x |
| WarpParse | TCP -> File | 308,400 | 255.00 | 535% / 598% | 320 MB / 346 MB | 4.4x |
| Vector | TCP -> File | 69,500 | 57.47 | 447% / 478% | 370 MB / 388 MB | 1.0x |
解析规则大小:
- WarpParse:3864B
- Vector:7723B
混合日志规则:
- 4类日志按照3:2:1:1混合
3.2 解析 + 转换能力 (Parse + Transform)
引入转换逻辑后,WarpParse 依然保持显著领先,表明其数据处理管线极其高效,转换操作未成为瓶颈。
3.2.1 Nginx Access Log(239B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 1,749,200 | 398.69 | 763% / 866% | 143 MB / 159 MB | 3.7x |
| Vector | File -> BlackHole | 470,312 | 107.20 | 372% / 423% | 254 MB / 280 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 1,219,100 | 277.87 | 485% / 625% | 415 MB / 440 MB | 1.4x |
| Vector | TCP -> BlackHole | 870,500 | 198.41 | 514% / 640% | 238 MB / 258 MB | 1.0x |
| WarpParse | TCP -> File | 797,700 | 181.82 | 492% / 621% | 523 MB / 540 MB | 11.3x |
| Vector | TCP -> File | 70,800 | 16.14 | 161% / 181% | 226 MB / 236 MB | 1.0x |
解析+转换规则大小:
- WarpParse:521B
- Vector:682B
3.2.2 AWS ELB Log(411B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 710,400 | 278.45 | 837% / 912% | 230 MB / 252 MB | 5.5x |
| Vector | File -> BlackHole | 129,743 | 50.85 | 593% / 665% | 283 MB / 298 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 611,800 | 239.80 | 624% / 753% | 478 MB / 487 MB | 4.0x |
| Vector | TCP -> BlackHole | 152,900 | 59.93 | 612% / 678% | 288 MB / 294 MB | 1.0x |
| WarpParse | TCP -> File | 318,200 | 124.72 | 593% / 733% | 409 MB / 547 MB | 5.5x |
| Vector | TCP -> File | 58,200 | 22.81 | 332% / 374% | 276 MB / 288 MB | 1.0x |
解析+转换规则大小:
- WarpParse:1694B
- Vector:2650B
3.2.3 Sysmon JSON Log (1K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 354,800 | 333.63 | 880% / 935% | 157 MB / 170 MB | 6.1x |
| Vector | File -> BlackHole | 58,200 | 54.73 | 431% / 528% | 296 MB / 317 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 299,500 | 281.63 | 665% / 749% | 367 MB / 377 MB | 3.1x |
| Vector | TCP -> BlackHole | 97,200 | 91.40 | 711% / 807% | 399 MB / 424 MB | 1.0x |
| WarpParse | TCP -> File | 219,900 | 206.78 | 719% / 817% | 431 MB / 457 MB | 5.5x |
| Vector | TCP -> File | 40,300 | 37.90 | 391% / 497% | 394 MB / 409 MB | 1.0x |
解析+转换规则大小:
- WarpParse:2249B
- Vector:3782B
3.2.4 APT Threat Log (3K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 280,000 | 947.15 | 769% / 869% | 172 MB / 178 MB | 9.1x |
| Vector | File -> BlackHole | 30,612 | 103.55 | 561% / 654% | 248 MB / 273 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 238,900 | 808.12 | 657% / 705% | 364 MB / 389 MB | 7.0x |
| Vector | TCP -> BlackHole | 34,000 | 115.01 | 693% / 849% | 408 MB / 430 MB | 1.0x |
| WarpParse | TCP -> File | 169,800 | 574.38 | 664% / 884% | 871 MB / 1500 MB | 6.8x |
| Vector | TCP -> File | 24,900 | 84.23 | 539% / 645% | 393 MB / 420 MB | 1.0x |
解析+转换规则大小:
- WarpParse:1638B
- Vector:2259B
3.2.5 Mixed Log (平均日志大小:1295B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 396,300 | 489.43 | 833% / 948% | 203MB / 223MB | 4.0x |
| Vector | File -> BlackHole | 98,704 | 121.90 | 871% / 971% | 299MB / 318MB | 1.0x |
| WarpParse | TCP -> BlackHole | 387,400 | 478.44 | 757% / 853% | 389MB / 411MB | 3.6x |
| Vector | TCP -> BlackHole | 108,400 | 133.87 | 938% / 965% | 302MB / 317MB | 1.0x |
| WarpParse | TCP -> File | 199,300 | 246.14 | 576% / 776% | 329MB / 496MB | 3.3x |
| Vector | TCP -> File | 60,800 | 75.09 | 566% / 614% | 371MB / 389MB | 1.0x |
解析+转换规则大小:
- WarpParse:6102B
- Vector:9373B
混合日志规则:
- 4类日志按照1:1:1:1混合
3.2.6 Mixed Log (平均日志大小:867B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 560,600 | 463.52 | 865% / 931% | 228 MB / 239 MB | |
| Vector | File -> BlackHole | 138,157 | 114.23 | 851% / 971% | 261 MB / 283 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 515,300 | 426.07 | 706% / 822% | 309 MB / 320 MB | |
| Vector | TCP -> BlackHole | 156,000 | 128.99 | 885% / 955% | 337 MB / 351 MB | 1.0x |
| WarpParse | TCP -> File | 299,600 | 247.72 | 649% / 761% | 415 MB / 500 MB | |
| Vector | TCP -> File | 69,500 | 57.47 | 457% / 505% | 367 MB / 393 MB | 1.0x |
解析+转换规则大小:
- WarpParse:6102B
- Vector:9373B
混合日志规则:
- 4类日志按照3:2:1:1混合
3.3 linux测试数据
3.3.1 Nginx Access Log (239B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 790,900 | 180.27 | 549% / 583% | 66 MB / 67 MB | 4.1x |
| Vector | File -> BlackHole | 192,015 | 43.77 | 350% / 364% | 143 MB / 152 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 767,000 | 174.82 | 468% / 605% | 188 MB / 532 MB | 2.1x |
| Vector | TCP -> BlackHole | 371,100 | 84.58 | 519% / 540% | 153 MB / 157 MB | 1.0x |
| WarpParse | TCP -> File | 397,200 | 90.53 | 616% / 666% | 181 MB / 511 MB | 21.5x |
| Vector | TCP -> File | 18,500 | 4.22 | 186% / 195% | 231 MB / 244 MB | 1.0x |
解析规则大小:
- WarpParse:174B
- Vector:416B
3.3.2 AWS ELB Log (411B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 394,500 | 154.63 | 757% / 775% | 421 MB / 541 MB | 7.5x |
| Vector | File -> BlackHole | 52,875 | 20.72 | 534% / 585% | 145 MB / 152 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 367,700 | 144.12 | 686% / 724% | 205 MB / 564 MB | 6.3x |
| Vector | TCP -> BlackHole | 58,200 | 22.81 | 479% / 531% | 172 MB / 183 MB | 1.0x |
| WarpParse | TCP -> File | 169,700 | 66.52 | 704% / 731% | 170 MB / 222 MB | 11.1x |
| Vector | TCP -> File | 15,300 | 6.00 | 249% / 269% | 159 MB / 163 MB | 1.0x |
解析规则大小:
- WarpParse:1153B
- Vector:2289B
3.3.3 Sysmon JSON Log (1K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 152,500 | 143.40 | 726% / 776% | 318 MB / 368 MB | 2.0x |
| Vector | File -> BlackHole | 76,717 | 72.14 | 463% / 564% | 295 MB / 313 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 149,800 | 140.86 | 711% / 763% | 221 MB / 678 MB | 4.0x |
| Vector | TCP -> BlackHole | 37,400 | 35.17 | 580% / 650% | 236 MB / 246 MB | 1.0x |
| WarpParse | TCP -> File | 104,900 | 98.64 | 750% / 764% | 169 MB / 505 MB | 7.7x |
| Vector | TCP -> File | 13,600 | 12.79 | 323% / 352% | 213 MB / 222 MB | 1.0x |
解析规则大小:
- WarpParse:1552B
- Vector:3259B
3.3.4 APT Threat Log (3K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 134,700 | 455.65 | 465% / 565% | 136 MB / 161 MB | 9.8x |
| Vector | File -> BlackHole | 13,780 | 46.61 | 534% / 614% | 190 MB / 193 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 129,600 | 438.40 | 502% / 606% | 237 MB / 273 MB | 7.4x |
| Vector | TCP -> BlackHole | 17,400 | 58.86 | 783% / 795% | 228 MB / 246 MB | 1.0x |
| WarpParse | TCP -> File | 63,500 | 214.80 | 492% / 560% | 423 MB / 1161 MB | 7.8x |
| Vector | TCP -> File | 8,100 | 27.40 | 457% / 528% | 217 MB / 226 MB | 1.0x |
解析规则大小:
- WarpParse:985B
- Vector:1759B
3.3.5 Mixed Log (平均日志大小:867B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 267,600 | 221.26 | 649% / 758% | 298 MB / 347 MB | 4.7x |
| Vector | File -> BlackHole | 56,774 | 46.94 | 794% / 800% | 178 MB / 182 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 259,000 | 214.15 | 706% / 822% | 309 MB / 320 MB | 4.4x |
| Vector | TCP -> BlackHole | 58,500 | 48.37 | 778% / 787% | 205 MB / 216 MB | 1.0x |
| WarpParse | TCP -> File | 159,900 | 132.21 | 696% / 728% | 121 MB / 185 MB | 10.8x |
| Vector | TCP -> File | 14,800 | 12.24 | 294% / 318% | 203 MB / 215 MB | 1.0x |
解析+转换规则大小:
- WarpParse:6102B
- Vector:9373B
混合日志规则:
- 4类日志按照3:2:1:1混合
3.4.1 Nginx Access Log(239B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 649,100 | 147.95 | 659% / 704% | 194 MB / 505 MB | 3.6x |
| Vector | File -> BlackHole | 181,739 | 41.42 | 381% / 397% | 156 MB / 169 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 574,200 | 130.88 | 522% / 613% | 138 MB / 383 MB | 1.8x |
| Vector | TCP -> BlackHole | 318,900 | 72.69 | 462% / 538% | 161 MB / 167 MB | 1.0x |
| WarpParse | TCP -> File | 299,900 | 68.36 | 583% / 644% | 145 MB / 348 MB | 16.9x |
| Vector | TCP -> File | 17,700 | 4.03 | 146% / 151% | 137 MB / 140 MB | 1.0x |
解析+转换规则大小:
- WarpParse:521B
- Vector:682B
3.4.2 AWS ELB Log(411B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 265,800 | 104.18 | 626% / 713% | 248 MB / 362 MB | 5.1x |
| Vector | File -> BlackHole | 52,380 | 20.53 | 495% / 551% | 171 MB / 181 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 239,600 | 93.91 | 576% / 628% | 120 MB / 166 MB | 4.3x |
| Vector | TCP -> BlackHole | 55,800 | 21.87 | 483% / 520% | 180 MB / 184 MB | 1.0x |
| WarpParse | TCP -> File | 139,900 | 54.84 | 679% / 741% | 183 MB / 284 MB | 7.8x |
| Vector | TCP -> File | 17,900 | 7.02 | 261% / 281% | 169 MB / 174 MB | 1.0x |
解析+转换规则大小:
- WarpParse:1694B
- Vector:2650B
3.4.3 Sysmon JSON Log (1K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 126,800 | 119.23 | 748% / 793% | 281 MB / 422 MB | 4.5x |
| Vector | File -> BlackHole | 28,157 | 26.48 | 454% / 511% | 221 MB / 232 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 119,900 | 112.74 | 715% / 772% | 180 MB / 563 MB | 3.5x |
| Vector | TCP -> BlackHole | 34,200 | 32.16 | 568% / 701% | 255 MB / 266 MB | 1.0x |
| WarpParse | TCP -> File | 84,900 | 79.83 | 706% / 764% | 170 MB / 384 MB | 5.8x |
| Vector | TCP -> File | 14,700 | 13.82 | 344% / 414% | 240 MB / 252 MB | 1.0x |
解析+转换规则大小:
- WarpParse:2249B
- Vector:3782B
3.4.4 APT Threat Log (3K)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 122,500 | 414.38 | 542% / 637% | 161 MB / 204 MB | 9.6x |
| Vector | File -> BlackHole | 12,783 | 43.24 | 546% / 580% | 194 MB / 198 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 114,800 | 388.33 | 534% / 543% | 234 MB / 277 MB | 7.3x |
| Vector | TCP -> BlackHole | 15,700 | 53.11 | 786% / 796% | 236 MB / 249 MB | 1.0x |
| WarpParse | TCP -> File | 58,700 | 198.56 | 473% / 569% | 682 MB / 1296 MB | 6.4x |
| Vector | TCP -> File | 9,200 | 31.12 | 487% / 521% | 224 MB / 233 MB | 1.0x |
解析+转换规则大小:
- WarpParse:1638B
- Vector:2259B
3.4.5 Mixed Log (平均日志大小:867B)
| 引擎 | 拓扑 | EPS | MPS | CPU (Avg/Peak) | MEM (Avg/Peak) | 性能倍数 |
|---|---|---|---|---|---|---|
| WarpParse | File -> BlackHole | 223,300 | 184.63 | 673% / 777% | 328 MB / 387 MB | 3.9x |
| Vector | File -> BlackHole | 56,666 | 46.85 | 792% / 798% | 181 MB / 184 MB | 1.0x |
| WarpParse | TCP -> BlackHole | 209,300 | 173.06 | 659% / 701% | 128 MB / 161 MB | 3.7x |
| Vector | TCP -> BlackHole | 57,300 | 47.38 | 782% / 787% | 202 MB / 211 MB | 1.0x |
| WarpParse | TCP -> File | 134,900 | 111.54 | 695% / 736% | 121 MB / 154 MB | 7.0x |
| Vector | TCP -> File | 19,400 | 16.04 | 308% / 317% | 209 MB / 213 MB | 1.0x |
解析+转换规则大小:
- WarpParse:6102B
- Vector:9373B
混合日志规则:
- 4类日志按照3:2:1:1混合
4. 核心发现与架构优势分析
4.1 性能与资源效率
核心发现:
- 吞吐量碾压: 在所有 24 组对比测试中,WarpParse 均取得领先。解析场景下平均领先 3.7x - 11.9x,解析+转换场景下领先 1.4x - 11.3x。
- 算力利用率: WarpParse 倾向于“以算力换吞吐“,CPU 占用率普遍高于 Vector,但换来了数倍的处理能力。例如在 Sysmon 解析中,WarpParse 用 1.8 倍的 CPU 换取了 Vector 5.7 倍的吞吐。
- 大日志处理: 在 APT (3K) 这种大体积日志场景下,WarpParse 展现出极强的稳定性,MPS 达到 1062 MiB/s,接近千兆处理能力,而 Vector 在该场景下吞吐下降明显。
4.2 规则与维护成本
优势分析:
- 规则体积更小: 同等语义下,WarpParse 的 WPL/OML 规则体积显著小于 Vector 的 VRL 脚本。
- Nginx: 174B (WarpParse) vs 416B (Vector)
- APT: 985B (WarpParse) vs 1759B (Vector)
- 维护性: 更小的规则体积意味着更快的网络分发速度、更短的冷启动时间,这在边缘计算或大规模 Agent 下发场景中至关重要。
4.3 稳定性
- 在整个高压测试过程中,WarpParse 保持了极高的吞吐稳定性,未观察到显著的 Backpressure(背压)导致的处理崩塌。
- 注意点: 在 TCP -> File 的端到端场景中,WarpParse 的内存占用在部分大包场景下会有所上升(如 APT 场景达到 1GB+),这与其为了维持高吞吐而使用的缓冲策略有关。
5. 总结与建议
| 决策维度 | 建议方案 | 理由 |
|---|---|---|
| 追求极致性能 | WarpParse | 无论是小包高频还是大包吞吐,WarpParse 均提供 5-10倍 的性能红利。 |
| 资源受限环境 | WarpParse | 尽管峰值 CPU 较高,但完成同等数据量所需的总 CPU 时间远少于 Vector;且小包场景内存控制优异。 |
| 边缘/Agent部署 | WarpParse | 规则文件极小,便于快速热更新;单机处理能力强,减少对中心端的压力。 |
| 通用生态兼容 | WarpParse | 提供面向开发者的 API 与插件扩展机制,支持用户快速开发自定义输入 / 输出模块;在满足性能要求的同时,也具备良好的生态扩展能力。 |
结论: 对于专注于日志分析、安全事件处理(SIEM/SOC)、以及对实时性有苛刻要求的 ETL 场景,WarpParse 是优于 Vector 的选择。它通过更高效的 Rust 实现和专用的 WPL/OML 语言,成功打破了通用 ETL 工具的性能天花板。
Rule Definitions
本文档汇总了测试中使用的解析与解析+转换规则,按日志类型与引擎归档,并用 Markdown 对“解析配置 / 解析+转换配置”作清晰标注。
1. Nginx Access Log (239B)
WarpParse
- 解析配置(WPL)
package /nginx/ {
rule nginx {
(ip:sip,_^2,chars:timestamp<[,]>,http/request:http_request",chars:status,chars:size,chars:referer",http/agent:http_agent",_")
}
}
- 解析+转换配置(WPL + OML)
package /nginx/ {
rule nginx {
(ip:sip,_^2,chars:timestamp<[,]>,http/request:http_request",chars:status,chars:size,chars:referer",http/agent:http_agent",_")
}
}
name : nginx
rule : /nginx/*
---
size : digit = take(size);
status : digit = take(status);
str_status = match read(option:[status]) {
digit(500) => chars(Internal Server Error);
digit(404) => chars(Not Found);
};
match_chars = match read(option:[wp_src_ip]) {
ip(127.0.0.1) => chars(localhost);
!ip(127.0.0.1) => chars(attack_ip);
};
* : auto = read();
Vector
- 解析配置(VRL)
source = '''
parsed = parse_regex!(.message, r'^(?P<client>\S+) \S+ \S+ \[(?P<time>[^\]]+)\] "(?P<request>[^"]*)" (?P<status>\d{3}) (?P<size>\d+) "(?P<referer>[^"]*)" "(?P<agent>[^"]*)" "(?P<extra>[^"]*)"')
.sip = parsed.client
.http_request = parsed.request
.status = parsed.status
.size = parsed.size
.referer = parsed.referer
.http_agent = parsed.agent
.timestamp = parsed.time
del(.message)
'''
- 解析+转换配置(VRL)
source = '''
parsed = parse_regex!(.message, r'^(?P<client>\S+) \S+ \S+ \[(?P<time>[^\]]+)\] "(?P<request>[^"]*)" (?P<status>\d{3}) (?P<size>\d+) "(?P<referer>[^"]*)" "(?P<agent>[^"]*)" "(?P<extra>[^"]*)"')
.sip = parsed.client
.http_request = parsed.request
.referer = parsed.referer
.http_agent = parsed.agent
.timestamp = parsed.time
del(.message)
.status = to_int!(parsed.status)
.size = to_int!(parsed.size)
if .host == "127.0.0.1" {
.match_chars = "localhost"
} else if .host != "127.0.0.1" {
.match_chars = "attack_ip"
}
if .status == 500 {
.str_status = "Internal Server Error"
} else if .status == 404 {
.str_status = "Not Found"
}
'''
2. AWS ELB Log (411B)
WarpParse
- 解析配置(WPL)
package /aws/ {
rule aws {
(
symbol(http),
chars:timestamp,
chars:elb,
chars:client_host,
chars:target_host,
chars:request_processing_time,
chars:target_processing_time,
chars:response_processing_time,
chars:elb_status_code,
chars:target_status_code,
chars:received_bytes,
chars:sent_bytes,
chars:request | (chars:request_method, chars:request_url, chars:request_protocol),
chars:user_agent,
chars:ssl_cipher,
chars:ssl_protocol,
chars:target_group_arn,
chars:trace_id,
chars:domain_name,
chars:chosen_cert_arn,
chars:matched_rule_priority,
chars:request_creation_time,
chars:actions_executed,
chars:redirect_url,
chars:error_reason,
chars:target_port_list,
chars:target_status_code_list,
chars:classification,
chars:classification_reason,
chars:traceability_id,
)
}
}
- 解析+转换配置(WPL + OML)
package /aws/ {
rule aws {
(
symbol(http),
chars:timestamp,
chars:elb,
chars:client_host,
chars:target_host,
chars:request_processing_time,
chars:target_processing_time,
chars:response_processing_time,
chars:elb_status_code,
chars:target_status_code,
chars:received_bytes,
chars:sent_bytes,
chars:request | (chars:request_method, chars:request_url, chars:request_protocol),
chars:user_agent,
chars:ssl_cipher,
chars:ssl_protocol,
chars:target_group_arn,
chars:trace_id,
chars:domain_name,
chars:chosen_cert_arn,
chars:matched_rule_priority,
chars:request_creation_time,
chars:actions_executed,
chars:redirect_url,
chars:error_reason,
chars:target_port_list,
chars:target_status_code_list,
chars:classification,
chars:classification_reason,
chars:traceability_id,
)
}
}
name : aws
rule : /aws/*
---
sent_bytes:digit = take(sent_bytes) ;
target_status_code:digit = take(target_status_code) ;
elb_status_code:digit = take(elb_status_code) ;
extends : obj = object {
ssl_cipher = read(ssl_cipher);
ssl_protocol = read(ssl_protocol);
};
match_chars = match read(option:[wp_src_ip]) {
ip(127.0.0.1) => chars(localhost);
!ip(127.0.0.1) => chars(attack_ip);
};
str_elb_status = match read(option:[elb_status_code]) {
digit(200) => chars(ok);
digit(404) => chars(error);
};
* : auto = read();
Vector
- 解析配置(VRL)
source = '''
parsed = parse_regex!(.message, r'^(?P<type>\S+) (?P<timestamp>\S+) (?P<elb>\S+) (?P<client_host>\S+) (?P<target_host>\S+) (?P<request_processing_time>[-\d\.]+) (?P<target_processing_time>[-\d\.]+) (?P<response_processing_time>[-\d\.]+) (?P<elb_status_code>\S+) (?P<target_status_code>\S+) (?P<received_bytes>\d+) (?P<sent_bytes>\d+) "(?P<request_method>\S+) (?P<request_url>[^ ]+) (?P<request_protocol>[^"]+)" "(?P<user_agent>[^"]*)" "(?P<ssl_cipher>[^"]*)" "(?P<ssl_protocol>[^"]*)" (?P<target_group_arn>\S+) "(?P<trace_id>[^"]*)" "(?P<domain_name>[^"]*)" "(?P<chosen_cert_arn>[^"]*)" (?P<matched_rule_priority>\S+) (?P<request_creation_time>\S+) "(?P<actions_executed>[^"]*)" "(?P<redirect_url>[^"]*)" "(?P<error_reason>[^"]*)" "(?P<target_port_list>[^"]*)" "(?P<target_status_code_list>[^"]*)" "(?P<classification>[^"]*)" "(?P<classification_reason>[^"]*)" (?P<traceability_id>\S+)$')
.timestamp = parsed.timestamp
.symbol = parsed.type
.elb = parsed.elb
.client_host = parsed.client_host
.target_host = parsed.target_host
.request_processing_time = parsed.request_processing_time
.target_processing_time = parsed.target_processing_time
.response_processing_time = parsed.response_processing_time
.elb_status_code = parsed.elb_status_code
.target_status_code = parsed.target_status_code
.received_bytes = parsed.received_bytes
.sent_bytes = parsed.sent_bytes
.request_method = parsed.request_method
.request_url = parsed.request_url
.request_protocol = parsed.request_protocol
.user_agent = parsed.user_agent
.ssl_cipher = parsed.ssl_cipher
.ssl_protocol = parsed.ssl_protocol
.target_group_arn = parsed.target_group_arn
.trace_id = parsed.trace_id
.domain_name = parsed.domain_name
.chosen_cert_arn = parsed.chosen_cert_arn
.matched_rule_priority = parsed.matched_rule_priority
.request_creation_time = parsed.request_creation_time
.actions_executed = parsed.actions_executed
.redirect_url = parsed.redirect_url
.error_reason = parsed.error_reason
.target_port_list = parsed.target_port_list
.target_status_code_list = parsed.target_status_code_list
.classification = parsed.classification
.classification_reason = parsed.classification_reason
.traceability_id = parsed.traceability_id
del(.message)
'''
- 解析+转换配置(VRL)
source = '''
parsed = parse_regex!(.message, r'^(?P<type>\S+) (?P<timestamp>\S+) (?P<elb>\S+) (?P<client_host>\S+) (?P<target_host>\S+) (?P<request_processing_time>[-\d\.]+) (?P<target_processing_time>[-\d\.]+) (?P<response_processing_time>[-\d\.]+) (?P<elb_status_code>\S+) (?P<target_status_code>\S+) (?P<received_bytes>\d+) (?P<sent_bytes>\d+) "(?P<request_method>\S+) (?P<request_url>[^ ]+) (?P<request_protocol>[^"]+)" "(?P<user_agent>[^"]*)" "(?P<ssl_cipher>[^"]*)" "(?P<ssl_protocol>[^"]*)" (?P<target_group_arn>\S+) "(?P<trace_id>[^"]*)" "(?P<domain_name>[^"]*)" "(?P<chosen_cert_arn>[^"]*)" (?P<matched_rule_priority>\S+) (?P<request_creation_time>\S+) "(?P<actions_executed>[^"]*)" "(?P<redirect_url>[^"]*)" "(?P<error_reason>[^"]*)" "(?P<target_port_list>[^"]*)" "(?P<target_status_code_list>[^"]*)" "(?P<classification>[^"]*)" "(?P<classification_reason>[^"]*)" (?P<traceability_id>\S+)$')
.timestamp = parsed.timestamp
.symbol = parsed.type
.elb = parsed.elb
.client_host = parsed.client_host
.target_host = parsed.target_host
.request_processing_time = parsed.request_processing_time
.target_processing_time = parsed.target_processing_time
.response_processing_time = parsed.response_processing_time
.received_bytes = parsed.received_bytes
.request_method = parsed.request_method
.request_url = parsed.request_url
.request_protocol = parsed.request_protocol
.user_agent = parsed.user_agent
.ssl_cipher = parsed.ssl_cipher
.ssl_protocol = parsed.ssl_protocol
.target_group_arn = parsed.target_group_arn
.trace_id = parsed.trace_id
.domain_name = parsed.domain_name
.chosen_cert_arn = parsed.chosen_cert_arn
.matched_rule_priority = parsed.matched_rule_priority
.request_creation_time = parsed.request_creation_time
.actions_executed = parsed.actions_executed
.redirect_url = parsed.redirect_url
.error_reason = parsed.error_reason
.target_port_list = parsed.target_port_list
.target_status_code_list = parsed.target_status_code_list
.classification = parsed.classification
.classification_reason = parsed.classification_reason
.traceability_id = parsed.traceability_id
del(.message)
.elb_status_code = to_int!(parsed.elb_status_code)
.target_status_code = to_int!(parsed.target_status_code)
.sent_bytes = to_int!(parsed.sent_bytes)
if .host == "127.0.0.1" {
.match_chars = "localhost"
} else if .host != "127.0.0.1" {
.match_chars = "attack_ip"
}
if .elb_status_code == 200 {
.str_elb_status = "ok"
} else if .elb_status_code == 404 {
.str__elb_status = "error"
}
.extends = {
"ssl_cipher": .ssl_cipher,
"ssl_protocol": .ssl_protocol,
}
'''
3. Sysmon Log (1K, JSON)
WarpParse
- 解析配置(WPL)
package /sysmon/ {
rule sysmon {
(_:pri<<,>>,3*_,_),(_\S\y\s\m\o\n\:,
json(
@Id:id,
@Description/ProcessId:process_id,
@Level:severity,
@Opcode:Opcode,
@ProcessId:ProcessId,
@Task:Task,
@ThreadId:ThreadId
@Version:Version,
@Description/CommandLine:cmd_line,
@Description/ParentCommandLine:parent_cmd_line,
@Description/LogonGuid:logon_guid,
@Description/LogonId:logon_id,
@Description/Image:process_path,
@Description/ParentImage:parent_process_path,
@Description/ParentProcessGuid:parent_process_guid,
@Description/ParentProcessId:parent_process_id,
@Description/ParentUser:parent_process_user,
@Description/ProcessGuid:process_guid,
@Description/Company:product_company,
@Description/Description:process_desc,
@Description/FileVersion:file_version,
chars@Description/Hashes:Hashes
@Description/IntegrityLevel:integrity_level,
@Description/OriginalFileName:origin_file_name,
@Description/Product:product_name,
@Description/RuleName:rule_name,
@Description/User:user_name,
chars@Description/UtcTime:occur_time,
@Description/TerminalSessionId:terminal_session_id,
@Description/CurrentDirectory:current_dir,
@Keywords:keywords
)
)
}
}
- 解析+转换配置(WPL + OML)
package /sysmon/ {
rule sysmon {
(_:pri<<,>>,3*_,_),(_\S\y\s\m\o\n\:,
json(
@Id:id,
@Description/ProcessId:process_id,
@Level:severity,
@Opcode:Opcode,
@ProcessId:ProcessId,
@Task:Task,
@ThreadId:ThreadId
@Version:Version,
@Description/CommandLine:cmd_line,
@Description/ParentCommandLine:parent_cmd_line,
@Description/LogonGuid:logon_guid,
@Description/LogonId:logon_id,
@Description/Image:process_path,
@Description/ParentImage:parent_process_path,
@Description/ParentProcessGuid:parent_process_guid,
@Description/ParentProcessId:parent_process_id,
@Description/ParentUser:parent_process_user,
@Description/ProcessGuid:process_guid,
@Description/Company:product_company,
@Description/Description:process_desc,
@Description/FileVersion:file_version,
chars@Description/Hashes:Hashes
@Description/IntegrityLevel:integrity_level,
@Description/OriginalFileName:origin_file_name,
@Description/Product:product_name,
@Description/RuleName:rule_name,
@Description/User:user_name,
chars@Description/UtcTime:occur_time,
@Description/TerminalSessionId:terminal_session_id,
@Description/CurrentDirectory:current_dir,
@Keywords:keywords
)
)
}
}
name : sysmon
rule : /sysmon/*
---
Id:digit = take(id) ;
LogonId:digit = take(logon_id) ;
enrich_level = match read(option:[severity]) {
chars(4) => chars(severity);
chars(3) => chars(normal);
};
extends : obj = object {
OriginalFileName = read(origin_file_name);
ParentCommandLine = read(parent_cmd_line);
};
extends_dir = object {
ParentProcessPath = read(parent_process_path);
Process_path = read(process_path);
};
match_chars = match read(option:[wp_src_ip]) {
ip(127.0.0.1) => chars(localhost);
!ip(127.0.0.1) => chars(attack_ip);
};
num_range = match read(option:[Id]) {
in ( digit(0), digit(1000) ) => read(Id) ;
_ => digit(0) ;
};
* : auto = read();
Vector
- 解析配置(VRL)
source = '''
parsed_msg = parse_regex!(.message, r'^[^{]*(?P<body>\{.*)$')
parsed = parse_regex!(parsed_msg.body, r'(?s)\{"Id":(?P<Id>[^,]+),"Version":(?P<Version>[^,]+),"Level":(?P<Level>[^,]+),"Task":(?P<Task>[^,]+),"Opcode":(?P<Opcode>[^,]+),"Keywords":(?P<Keywords>[^,]+),"RecordId":(?P<RecordId>[^,]+),"ProviderName":"(?P<ProviderName>[^"]*)","ProviderId":"(?P<ProviderId>[^"]*)","LogName":"(?P<LogName>[^"]*)","ProcessId":(?P<ProcessId>[^,]+),"ThreadId":(?P<ThreadId>[^,]+),"MachineName":"(?P<MachineName>[^"]*)","TimeCreated":"(?P<TimeCreated>[^"]*)","ActivityId":(?P<ActivityId>[^,]+),"RelatedActivityId":(?P<RelatedActivityId>[^,]+),"Qualifiers":(?P<Qualifiers>[^,]+),"LevelDisplayName":"(?P<LevelDisplayName>[^"]*)","OpcodeDisplayName":"(?P<OpcodeDisplayName>[^"]*)","TaskDisplayName":"(?P<TaskDisplayName>[^"]*)","Description":\{"RuleName":"(?P<RuleName>[^"]*)","UtcTime":"(?P<UtcTime>[^"]*)","ProcessGuid":"(?P<ProcessGuid>[^"]*)","ProcessId":"(?P<DescProcessId>[^"]*)","Image":"(?P<Image>[^"]*)","FileVersion":"(?P<FileVersion>[^"]*)","Description":"(?P<Description>[^"]*)","Product":"(?P<Product>[^"]*)","Company":"(?P<Company>[^"]*)","OriginalFileName":"(?P<OriginalFileName>[^"]*)","CommandLine":"(?P<CommandLine>[^"]*)","CurrentDirectory":"(?P<CurrentDirectory>[^"]*)","User":"(?P<User>[^"]*)","LogonGuid":"(?P<LogonGuid>[^"]*)","LogonId":"(?P<LogonId>[^"]*)","TerminalSessionId":"(?P<TerminalSessionId>[^"]*)","IntegrityLevel":"(?P<IntegrityLevel>[^"]*)","Hashes":"(?P<Hashes>[^"]*)","ParentProcessGuid":"(?P<ParentProcessGuid>[^"]*)","ParentProcessId":"(?P<ParentProcessId>[^"]*)","ParentImage":"(?P<ParentImage>[^"]*)","ParentCommandLine":"(?P<ParentCommandLine>[^"]*)","ParentUser":"(?P<ParentUser>[^"]*)"\},"DescriptionRawMessage":"(?P<DescriptionRawMessage>[^"]*)"\}$')
.cmd_line = parsed.CommandLine
.product_company = parsed.Company
.process_id = parsed.ProcessId
.Opcode = parsed.Opcode
.ProcessId = parsed.ProcessId
.Task = parsed.Task
.ThreadId = parsed.ThreadId
.Version = parsed.Version
.current_dir = parsed.CurrentDirectory
.process_desc = parsed.Description
.file_version = parsed.FileVersion
.Hashes = parsed.Hashes
.process_path = parsed.Image
.integrity_level = parsed.IntegrityLevel
.logon_guid = parsed.LogonGuid
.logon_id = parsed.LogonId
.origin_file_name = parsed.OriginalFileName
.parent_cmd_line = parsed.ParentCommandLine
.parent_process_path = parsed.ParentImage
.parent_process_guid = parsed.ParentProcessGuid
.parent_process_id = parsed.ParentProcessId
.parent_process_user = parsed.ParentUser
.process_guid = parsed.ProcessGuid
.product_name = parsed.Product
.rule_name = parsed.RuleName
.terminal_session_id = parsed.TerminalSessionId
.user_name = parsed.User
.occur_time = parsed.UtcTime
.DescriptionRawMessage = parsed.DescriptionRawMessage
.id = parsed.Id
.keywords = parsed.Keywords
.severity = parsed.Level
.LevelDisplayName = parsed.LevelDisplayName
.LogName = parsed.LogName
.MachineName = parsed.MachineName
.OpcodeDisplayName = parsed.OpcodeDisplayName
.ProviderId = parsed.ProviderId
.ProviderName = parsed.ProviderName
.TaskDisplayName = parsed.TaskDisplayName
.TimeCreated = parsed.TimeCreated
del(.message)
- 解析+转换配置(VRL)
source = '''
parsed_msg = parse_regex!(.message, r'^[^{]*(?P<body>\{.*)$')
parsed = parse_regex!(parsed_msg.body, r'(?s)\{"Id":(?P<Id>[^,]+),"Version":(?P<Version>[^,]+),"Level":(?P<Level>[^,]+),"Task":(?P<Task>[^,]+),"Opcode":(?P<Opcode>[^,]+),"Keywords":(?P<Keywords>[^,]+),"RecordId":(?P<RecordId>[^,]+),"ProviderName":"(?P<ProviderName>[^"]*)","ProviderId":"(?P<ProviderId>[^"]*)","LogName":"(?P<LogName>[^"]*)","ProcessId":(?P<ProcessId>[^,]+),"ThreadId":(?P<ThreadId>[^,]+),"MachineName":"(?P<MachineName>[^"]*)","TimeCreated":"(?P<TimeCreated>[^"]*)","ActivityId":(?P<ActivityId>[^,]+),"RelatedActivityId":(?P<RelatedActivityId>[^,]+),"Qualifiers":(?P<Qualifiers>[^,]+),"LevelDisplayName":"(?P<LevelDisplayName>[^"]*)","OpcodeDisplayName":"(?P<OpcodeDisplayName>[^"]*)","TaskDisplayName":"(?P<TaskDisplayName>[^"]*)","Description":\{"RuleName":"(?P<RuleName>[^"]*)","UtcTime":"(?P<UtcTime>[^"]*)","ProcessGuid":"(?P<ProcessGuid>[^"]*)","ProcessId":"(?P<DescProcessId>[^"]*)","Image":"(?P<Image>[^"]*)","FileVersion":"(?P<FileVersion>[^"]*)","Description":"(?P<Description>[^"]*)","Product":"(?P<Product>[^"]*)","Company":"(?P<Company>[^"]*)","OriginalFileName":"(?P<OriginalFileName>[^"]*)","CommandLine":"(?P<CommandLine>[^"]*)","CurrentDirectory":"(?P<CurrentDirectory>[^"]*)","User":"(?P<User>[^"]*)","LogonGuid":"(?P<LogonGuid>[^"]*)","LogonId":"(?P<LogonId>[^"]*)","TerminalSessionId":"(?P<TerminalSessionId>[^"]*)","IntegrityLevel":"(?P<IntegrityLevel>[^"]*)","Hashes":"(?P<Hashes>[^"]*)","ParentProcessGuid":"(?P<ParentProcessGuid>[^"]*)","ParentProcessId":"(?P<ParentProcessId>[^"]*)","ParentImage":"(?P<ParentImage>[^"]*)","ParentCommandLine":"(?P<ParentCommandLine>[^"]*)","ParentUser":"(?P<ParentUser>[^"]*)"\},"DescriptionRawMessage":"(?P<DescriptionRawMessage>[^"]*)"\}$')
.cmd_line = parsed.CommandLine
.product_company= parsed.Company
.Opcode = parsed.Opcode
.process_id = parsed.ProcessId
.ProcessId = parsed.ProcessId
.Task = parsed.Task
.ThreadId = parsed.ThreadId
.Version = parsed.Version
.current_dir = parsed.CurrentDirectory
.process_desc = parsed.Description
.file_version = parsed.FileVersion
.Hashes = parsed.Hashes
.process_path = parsed.Image
.integrity_level = parsed.IntegrityLevel
.logon_guid = parsed.LogonGuid
.origin_file_name = parsed.OriginalFileName
.parent_cmd_line = parsed.ParentCommandLine
.parent_process_path = parsed.ParentImage
.parent_process_guid = parsed.ParentProcessGuid
.parent_process_id = parsed.ParentProcessId
.parent_process_user = parsed.ParentUser
.process_guid = parsed.ProcessGuid
.product_name = parsed.Product
.rule_name = parsed.RuleName
.terminal_session_id = parsed.TerminalSessionId
.user_name = parsed.User
.occur_time = parsed.UtcTime
.DescriptionRawMessage = parsed.DescriptionRawMessage
.keywords = parsed.Keywords
.severity = parsed.Level
.LevelDisplayName = parsed.LevelDisplayName
.LogName = parsed.LogName
.MachineName = parsed.MachineName
.OpcodeDisplayName = parsed.OpcodeDisplayName
.ProviderId = parsed.ProviderId
.ProviderName = parsed.ProviderName
.TaskDisplayName = parsed.TaskDisplayName
.TimeCreated = parsed.TimeCreated
del(.message)
.LogonId = to_int!(parsed.LogonId)
.Id = to_int!(parsed.Id)
if .host == "127.0.0.1" {
.match_chars = "localhost"
} else if .host != "127.0.0.1" {
.match_chars = "attack_ip"
}
if .severity == "4" {
.enrich_level = "severity"
} else if .Level == "3" {
.enrich_level = "normal"
}
.extends = {
"OriginalFileName": .origin_file_name,
"ParentCommandLine": .parent_cmd_line,
}
.extends_dir = {
"ParentProcessPath": .parent_process_path,
"Process_path": .process_path,
}
.num_range = if .Id >= 0 && .Id <= 1000 {
.Id
} else {
0
}
'''
4. APT Threat Log (3K)
WarpParse
- 解析配置(WPL)
package /apt/ {
rule apt {
(
_\#,
time:timestamp,
_,
chars:Hostname,
_\%\%,
chars:ModuleName\/,
chars:SeverityHeader\/,
symbol(ANTI-APT)\(,
chars:type\),
chars:Count<[,]>,
_\:,
chars:Content\(,
),
(
kv(chars@SyslogId),
kv(chars@VSys),
kv(chars@Policy),
kv(chars@SrcIp),
kv(chars@DstIp),
kv(chars@SrcPort),
kv(chars@DstPort),
kv(chars@SrcZone),
kv(chars@DstZone),
kv(chars@User),
kv(chars@Protocol),
kv(chars@Application),
kv(chars@Profile),
kv(chars@Direction),
kv(chars@ThreatType),
kv(chars@ThreatName),
kv(chars@Action),
kv(chars@FileType),
kv(chars@Hash)\),
)\,
}
}
- 解析+转换配置(WPL + OML)
package /apt/ {
rule apt {
(
_\#,
time:timestamp,
_,
chars:Hostname,
_\%\%,
chars:ModuleName\/,
chars:SeverityHeader\/,
symbol(ANTI-APT)\(,
chars:type\),
chars:Count<[,]>,
_\:,
chars:Content\(,
),
(
kv(chars@SyslogId),
kv(chars@VSys),
kv(chars@Policy),
kv(chars@SrcIp),
kv(chars@DstIp),
kv(chars@SrcPort),
kv(chars@DstPort),
kv(chars@SrcZone),
kv(chars@DstZone),
kv(chars@User),
kv(chars@Protocol),
kv(chars@Application),
kv(chars@Profile),
kv(chars@Direction),
kv(chars@ThreatType),
kv(chars@ThreatName),
kv(chars@Action),
kv(chars@FileType),
kv(chars@Hash)\),
)\,
}
}
name : apt
rule : /apt/*
---
count:digit = take(Count) ;
severity:digit = take(SeverityHeader) ;
match_chars = match read(option:[wp_src_ip]) {
ip(127.0.0.1) => chars(localhost);
!ip(127.0.0.1) => chars(attack_ip);
};
num_range = match read(option:[count]) {
in ( digit(0), digit(1000) ) => read(count) ;
_ => digit(0) ;
};
src_system_log_type = match read(option:[type]) {
chars(l) => chars(日志信息);
chars(s) => chars(安全日志信息);
};
extends_ip : obj = object {
DstIp = read(DstIp);
SrcIp = read(SrcIp);
};
extends_info : obj = object {
hostname = read(Hostname);
source_type = read(wp_src_key)
};
* : auto = read();
Vector
- 解析配置(VRL)
source = '''
parsed_log = parse_regex!(.message, r'(?s)^#(?P<timestamp>\w+\s+\d+\s+\d{4}\s+\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2})\s+(?P<hostname>\S+)\s+%%(?P<ModuleName>\d+[^/]+)/(?P<SeverityHeader>\d+)/(?P<symbol>[^(]+)\((?P<type>[^)]+)\)\[(?P<count>\d+)\]:\s*(?P<content>[^()]+?)\s*\(SyslogId=(?P<SyslogId>[^,]+),\s+VSys="(?P<VSys>[^"]+)",\s+Policy="(?P<Policy>[^"]+),\s+SrcIp=(?P<SrcIp>[^,]+),\s+DstIp=(?P<DstIp>[^,]+),\s+SrcPort=(?P<SrcPort>[^,]+),\s+DstPort=(?P<DstPort>[^,]+),\s+SrcZone=(?P<SrcZone>[^,]+),\s+DstZone=(?P<DstZone>[^,]+),\s+User="(?P<User>[^"]+)",\s+Protocol=(?P<Protocol>[^,]+),\s+Application="(?P<Application>[^"]+)",\s+Profile="(?P<Profile>[^"]+)",\s+Direction=(?P<Direction>[^,]+),\s+ThreatType=(?P<ThreatType>[^,]+),\s+ThreatName=(?P<ThreatName>[^,]+),\s+Action=(?P<Action>[^,]+),\s+FileType=(?P<FileType>[^,]+),\s+Hash=(?P<Hash>.*)\)$')
.Hostname = parsed_log.hostname
.SrcPort = parsed_log.SrcPort
.SeverityHeader = parsed_log.SeverityHeader
.type = parsed_log.type
.Count = parsed_log.count
.Content = parsed_log.content
.VSys = parsed_log.VSys
.DstPort = parsed_log.DstPort
.Policy = parsed_log.Policy
.SrcIp = parsed_log.SrcIp
.DstIp = parsed_log.DstIp
.SrcZone = parsed_log.SrcZone
.DstZone = parsed_log.DstZone
.User = parsed_log.User
.Protocol = parsed_log.Protocol
.ModuleName = parsed_log.ModuleName
.symbol = parsed_log.symbol
.timestamp = parsed_log.timestamp
.SyslogId = parsed_log.SyslogId
.Application = parsed_log.Application
.Profile = parsed_log.Profile
.Direction = parsed_log.Direction
.ThreatType = parsed_log.ThreatType
.ThreatName = parsed_log.ThreatName
.Action = parsed_log.Action
.FileType = parsed_log.FileType
.Hash = parsed_log.Hash
del(.message)
'''
- 解析+转换配置(VRL)
source = '''
parsed_log = parse_regex!(.message, r'(?s)^#(?P<timestamp>\w+\s+\d+\s+\d{4}\s+\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2})\s+(?P<hostname>\S+)\s+%%(?P<ModuleName>\d+[^/]+)/(?P<SeverityHeader>\d+)/(?P<symbol>[^(]+)\((?P<type>[^)]+)\)\[(?P<count>\d+)\]:\s*(?P<content>[^()]+?)\s*\(SyslogId=(?P<SyslogId>[^,]+),\s+VSys="(?P<VSys>[^"]+)",\s+Policy="(?P<Policy>[^"]+)",\s+SrcIp=(?P<SrcIp>[^,]+),\s+DstIp=(?P<DstIp>[^,]+),\s+SrcPort=(?P<SrcPort>[^,]+),\s+DstPort=(?P<DstPort>[^,]+),\s+SrcZone=(?P<SrcZone>[^,]+),\s+DstZone=(?P<DstZone>[^,]+),\s+User="(?P<User>[^"]+)",\s+Protocol=(?P<Protocol>[^,]+),\s+Application="(?P<Application>[^"]+)",\s+Profile="(?P<Profile>[^"]+)",\s+Direction=(?P<Direction>[^,]+),\s+ThreatType=(?P<ThreatType>[^,]+),\s+ThreatName=(?P<ThreatName>[^,]+),\s+Action=(?P<Action>[^,]+),\s+FileType=(?P<FileType>[^,]+),\s+Hash=(?P<Hash>.*)\)$')
.Hostname = parsed_log.hostname
.SrcPort = parsed_log.SrcPort
.SeverityHeader = parsed_log.SeverityHeader
.type = parsed_log.type
.Content = parsed_log.content
.VSys = parsed_log.VSys
.DstPort = parsed_log.DstPort
.Policy = parsed_log.Policy
.SrcIp = parsed_log.SrcIp
.DstIp = parsed_log.DstIp
.SrcZone = parsed_log.SrcZone
.DstZone = parsed_log.DstZone
.User = parsed_log.User
.Protocol = parsed_log.Protocol
.ModuleName = parsed_log.ModuleName
.symbol = parsed_log.symbol
.timestamp = parsed_log.timestamp
.SyslogId = parsed_log.SyslogId
.Application = parsed_log.Application
.Profile = parsed_log.Profile
.Direction = parsed_log.Direction
.ThreatType = parsed_log.ThreatType
.ThreatName = parsed_log.ThreatName
.Action = parsed_log.Action
.FileType = parsed_log.FileType
.Hash = parsed_log.Hash
del(.message)
.severity = to_int!(parsed_log.SeverityHeader)
.count = to_int!(parsed_log.count)
if .host == "127.0.0.1" {
.match_chars = "localhost"
} else if .host != "127.0.0.1" {
.match_chars = "attack_ip"
}
if .type == "l" {
.src_system_log_type = "日志信息"
} else if .type == "s" {
.src_system_log_type = "安全日志信息"
}
.extends_ip = {
"DstIp": .DstIp,
"SrcIp": .SrcIp,
}
.extends_info = {
"hostname": .Hostname,
"source_type": .source_type,
}
.num_range = if .count >= 0 && .count <= 1000 {
.count
} else {
0
}
'''
Test Data Samples
本文档展示了四类日志在经过解析与转换后的输出数据样本 (Output Samples)。
1. Nginx Access Log Samples
样本数据
180.57.30.148 - - [21/Jan/2025:01:40:02 +0800] "GET /nginx-logo.png HTTP/1.1" 500 368 "http://207.131.38.110/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" "-"
解析结果 (Parsed):
- WarpParse:
{
"wp_event_id": 1764645169882925000,
"sip": "180.57.30.148",
"timestamp": "21/Jan/2025:01:40:02 +0800",
"http_request": "GET /nginx-logo.png HTTP/1.1",
"status": "500",
"size": "368",
"referer": "http://207.131.38.110/",
"http_agent": "Mozilla/5.0(Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 ",
"wp_src_key": "socket",
"wp_src_ip": "127.0.0.1"
}
- Vector:
{
"host": "127.0.0.1",
"http_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
"http_request": "GET /nginx-logo.png HTTP/1.1",
"port": 58102,
"referer": "http://207.131.38.110/",
"sip": "180.57.30.148",
"size": "368",
"source_type": "socket",
"status": "500",
"timestamp": "21/Jan/2025:01:40:02 +0800"
}
解析+转换结果 (Transformed):
- WarpParse:
{
"host": "127.0.0.1",
"http_agent": "Mozilla/5.0(Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 ",
"http_request": "GET /nginx-logo.png HTTP/1.1",
"match_chars": "localhost",
"referer": "http://207.131.38.110/",
"sip": "180.57.30.148",
"size": 368,
"source_type": "socket",
"status": 500,
"str_status": "Internal Server Error",
"timestamp": "21/Jan/2025:01:40:02 +0800"
}
- Vector:
{
"host": "127.0.0.1",
"http_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
"http_request": "GET /nginx-logo.png HTTP/1.1",
"match_chars": "localhost",
"port": 53894,
"referer": "http://207.131.38.110/",
"sip": "180.57.30.148",
"size": 368,
"source_type": "socket",
"status": 500,
"str_status": "Internal Server Error",
"timestamp": "21/Jan/2025:01:40:02 +0800"
}
2. AWS ELB Log Samples
样本数据
http 2018-11-30T22:23:00.186641Z app/my-lb 192.168.1.10:2000 10.0.0.15:8080 0.01 0.02 0.01 200 200 100 200 "POST https://api.example.com/u?p=1&sid=2&t=3 HTTP/1.1" "Mozilla/5.0 (Win) Chrome/90" "ECDHE" "TLSv1.3" arn:aws:elb:us:123:tg "Root=1-test" "api.example.com" "arn:aws:acm:us:123:cert/short" 1 2018-11-30T22:22:48.364000Z "forward" "https://auth.example.com/r" "err" "10.0.0.1:80" "200" "cls" "rsn" TID_x1
解析结果 (Parsed):
- WarpParse:
{
"wp_event_id": 1764646097464011000,
"symbol": "http",
"timestamp": "2018-11-30T22:23:00.186641Z",
"elb": "app/my-lb",
"client_host": "192.168.1.10:2000",
"target_host": "10.0.0.15:8080",
"request_processing_time": "0.01",
"target_processing_time": "0.02",
"response_processing_time": "0.01",
"elb_status_code": "200",
"target_status_code": "200",
"received_bytes": "100",
"sent_bytes": "200",
"request_method": "POST",
"request_url": "https://api.example.com/u?p=1&sid=2&t=3",
"request_protocol": "HTTP/1.1",
"user_agent": "Mozilla/5.0 (Win) Chrome/90",
"ssl_cipher": "ECDHE",
"ssl_protocol": "TLSv1.3",
"target_group_arn": "arn:aws:elb:us:123:tg",
"trace_id": "Root=1-test",
"domain_name": "api.example.com",
"chosen_cert_arn": "arn:aws:acm:us:123:cert/short",
"matched_rule_priority": "1",
"request_creation_time": "2018-11-30T22:22:48.364000Z",
"actions_executed": "forward",
"redirect_url": "https://auth.example.com/r",
"error_reason": "err",
"target_port_list": "10.0.0.1:80",
"target_status_code_list": "200",
"classification": "cls",
"classification_reason": "rsn",
"traceability_id": "TID_x1",
"wp_src_key": "socket",
"wp_src_ip": "127.0.0.1"
}
- Vector:
{
"actions_executed": "forward",
"chosen_cert_arn": "arn:aws:acm:us:123:cert/short",
"classification": "cls",
"classification_reason": "rsn",
"client_host": "192.168.1.10:2000",
"domain_name": "api.example.com",
"elb": "app/my-lb",
"elb_status_code": "200",
"error_reason": "err",
"host": "127.0.0.1",
"matched_rule_priority": "1",
"port": 58786,
"received_bytes": "100",
"redirect_url": "https://auth.example.com/r",
"request_creation_time": "2018-11-30T22:22:48.364000Z",
"request_method": "POST",
"request_processing_time": "0.01",
"request_protocol": "HTTP/1.1",
"request_url": "https://api.example.com/u?p=1&sid=2&t=3",
"response_processing_time": "0.01",
"sent_bytes": "200",
"source_type": "socket",
"ssl_cipher": "ECDHE",
"ssl_protocol": "TLSv1.3",
"symbol": "http",
"target_group_arn": "arn:aws:elb:us:123:tg",
"target_host": "10.0.0.15:8080",
"target_port_list": "10.0.0.1:80",
"target_processing_time": "0.02",
"target_status_code": "200",
"target_status_code_list": "200",
"timestamp": "2018-11-30T22:23:00.186641Z",
"trace_id": "Root=1-test",
"traceability_id": "TID_x1",
"user_agent": "Mozilla/5.0 (Win) Chrome/90"
}
解析+转换结果 (Transformed):
- WarpParse:
{
"timestamp": "2018-11-30T22:23:00.186641Z",
"actions_executed": "forward",
"chosen_cert_arn": "arn:aws:acm:us:123:cert/short",
"classification": "cls",
"classification_reason": "rsn",
"client_host": "192.168.1.10:2000",
"domain_name": "api.example.com",
"elb": "app/my-lb",
"elb_status_code": 200,
"error_reason": "err",
"extends": {
"ssl_cipher": "ECDHE",
"ssl_protocol": "TLSv1.3"
},
"host": "127.0.0.1",
"match_chars": "localhost",
"matched_rule_priority": "1",
"received_bytes": "100",
"redirect_url": "https://auth.example.com/r",
"request_creation_time": "2018-11-30T22:22:48.364000Z",
"request_method": "POST",
"request_processing_time": "0.01",
"request_protocol": "HTTP/1.1",
"request_url": "https://api.example.com/u?p=1&sid=2&t=3",
"response_processing_time": "0.01",
"sent_bytes": 200,
"source_type": "socket",
"ssl_cipher": "ECDHE",
"ssl_protocol": "TLSv1.3",
"str_elb_status": "ok",
"target_group_arn": "arn:aws:elb:us:123:tg",
"target_host": "10.0.0.15:8080",
"target_port_list": "10.0.0.1:80",
"target_processing_time": "0.02",
"target_status_code": 200,
"target_status_code_list": "200",
"trace_id": "Root=1-test",
"traceability_id": "TID_x1",
"user_agent": "Mozilla/5.0 (Win) Chrome/90"
}
- Vector:
{
"actions_executed": "forward",
"chosen_cert_arn": "arn:aws:acm:us:123:cert/short",
"classification": "cls",
"classification_reason": "rsn",
"client_host": "192.168.1.10:2000",
"domain_name": "api.example.com",
"elb": "app/my-lb",
"elb_status_code": 200,
"error_reason": "err",
"extends": {
"ssl_cipher": "ECDHE",
"ssl_protocol": "TLSv1.3"
},
"host": "127.0.0.1",
"match_chars": "localhost",
"matched_rule_priority": "1",
"port": 53995,
"received_bytes": "100",
"redirect_url": "https://auth.example.com/r",
"request_creation_time": "2018-11-30T22:22:48.364000Z",
"request_method": "POST",
"request_processing_time": "0.01",
"request_protocol": "HTTP/1.1",
"request_url": "https://api.example.com/u?p=1&sid=2&t=3",
"response_processing_time": "0.01",
"sent_bytes": 200,
"source_type": "socket",
"ssl_cipher": "ECDHE",
"ssl_protocol": "TLSv1.3",
"str_elb_status": "ok",
"symbol": "http",
"target_group_arn": "arn:aws:elb:us:123:tg",
"target_host": "10.0.0.15:8080",
"target_port_list": "10.0.0.1:80",
"target_processing_time": "0.02",
"target_status_code": 200,
"target_status_code_list": "200",
"timestamp": "2018-11-30T22:23:00.186641Z",
"trace_id": "Root=1-test",
"traceability_id": "TID_x1",
"user_agent": "Mozilla/5.0 (Win) Chrome/90"
}
3. Sysmon Log Samples
样本数据
<14>Apr 09 18:37:27 10.77.32.19 Microsoft-Windows-Sysmon:{"Id":1,"Version":1,"Level":4,"Task":1,"Opcode":0,"Keywords":0,"RecordId":null,"ProviderName":"P","ProviderId":"PID","LogName":"L","ProcessId":1,"ThreadId":1,"MachineName":"A","TimeCreated":"2025-04-10T14:17:28.693228+08:00","ActivityId":null,"RelatedActivityId":null,"Qualifiers":null,"LevelDisplayName":"信息","OpcodeDisplayName":"信息","TaskDisplayName":"Process Create","Description":{"RuleName":"R","UtcTime":"2025-04-10 06:17:28.503","ProcessGuid":"{G}","ProcessId":"1","Image":"C:\\Windows\\a.exe","FileVersion":"1","Description":"D","Product":"P","Company":"C","OriginalFileName":"a.exe","CommandLine":"a.exe","CurrentDirectory":"C:\\","User":"U","LogonGuid":"{LG}","LogonId":"1","TerminalSessionId":"1","IntegrityLevel":"M","Hashes":"H","ParentProcessGuid":"{PG}","ParentProcessId":"1","ParentImage":"C:\\Windows\\b.exe","ParentCommandLine":"b.exe","ParentUser":"U"},"DescriptionRawMessage":"Process Create\r\nRuleName: R"}
解析结果 (Parsed):
- WarpParse:
{
"wp_event_id": 1764657738662604000,
"cmd_line": "a.exe",
"product_company": "C",
"current_dir": "C:\\\\",
"process_desc": "D",
"file_version": "1",
"Hashes": "H",
"process_path": "C:\\\\Windows\\\\a.exe",
"integrity_level": "M",
"logon_guid": "{LG}",
"logon_id": "1",
"origin_file_name": "a.exe",
"parent_cmd_line": "b.exe",
"parent_process_path": "C:\\\\Windows\\\\b.exe",
"parent_process_guid": "{PG}",
"parent_process_id": "1",
"parent_process_user": "U",
"process_guid": "{G}",
"process_id": "1",
"product_name": "P",
"rule_name": "R",
"terminal_session_id": "1",
"user_name": "U",
"occur_time": "2025-04-10 06:17:28.503",
"DescriptionRawMessage": "Process Create\\r\\nRuleName: R",
"id": "1",
"keywords": "0",
"severity": "4",
"LevelDisplayName": "信息",
"LogName": "L",
"MachineName": "A",
"Opcode": "0",
"OpcodeDisplayName": "信息",
"ProcessId": "1",
"ProviderId": "PID",
"ProviderName": "P",
"Task": "1",
"TaskDisplayName": "Process Create",
"ThreadId": "1",
"TimeCreated": "2025-04-10T14:17:28.693228+08:00",
"Version": "1",
"wp_src_key": "socket",
"wp_src_ip": "127.0.0.1"
}
- Vector:
{
"DescriptionRawMessage": "Process Create\\r\\nRuleName: R",
"Hashes": "H",
"LevelDisplayName": "信息",
"LogName": "L",
"MachineName": "A",
"Opcode": "0",
"OpcodeDisplayName": "信息",
"ProcessId": "1",
"ProviderId": "PID",
"ProviderName": "P",
"Task": "1",
"TaskDisplayName": "Process Create",
"ThreadId": "1",
"TimeCreated": "2025-04-10T14:17:28.693228+08:00",
"Version": "1",
"cmd_line": "a.exe",
"current_dir": "C:\\\\",
"file_version": "1",
"host": "127.0.0.1",
"id": "1",
"integrity_level": "M",
"keywords": "0",
"logon_guid": "{LG}",
"logon_id": "1",
"occur_time": "2025-04-10 06:17:28.503",
"origin_file_name": "a.exe",
"parent_cmd_line": "b.exe",
"parent_process_guid": "{PG}",
"parent_process_id": "1",
"parent_process_path": "C:\\\\Windows\\\\b.exe",
"parent_process_user": "U",
"port": 50558,
"process_desc": "D",
"process_guid": "{G}",
"process_id": "1",
"process_path": "C:\\\\Windows\\\\a.exe",
"product_company": "C",
"product_name": "P",
"rule_name": "R",
"severity": "4",
"source_type": "socket",
"terminal_session_id": "1",
"timestamp": "2025-12-02T06:33:53.716258Z",
"user_name": "U"
}
解析+转换结果 (Transformed):
- WarpParse:
{
"Id": 1,
"LogonId": 1,
"enrich_level": "severity",
"extends": {
"OriginalFileName": "a.exe",
"ParentCommandLine": "b.exe"
},
"extends_dir": {
"ParentProcessPath": "C:\\\\Windows\\\\b.exe",
"Process_path": "C:\\\\Windows\\\\a.exe"
},
"match_chars": "localhost",
"num_range": 1,
"wp_event_id": 1764813339134818000,
"cmd_line": "a.exe",
"product_company": "C",
"current_dir": "C:\\\\",
"process_desc": "D",
"file_version": "1",
"Hashes": "H",
"process_path": "C:\\\\Windows\\\\a.exe",
"integrity_level": "M",
"logon_guid": "{LG}",
"origin_file_name": "a.exe",
"parent_cmd_line": "b.exe",
"parent_process_path": "C:\\\\Windows\\\\b.exe",
"parent_process_guid": "{PG}",
"parent_process_id": "1",
"parent_process_user": "U",
"process_guid": "{G}",
"process_id": "1",
"product_name": "P",
"rule_name": "R",
"terminal_session_id": "1",
"user_name": "U",
"occur_time": "2025-04-10 06:17:28.503",
"DescriptionRawMessage": "Process Create\\\\r\\\\nRuleName: R",
"keywords": "0",
"severity": "4",
"LevelDisplayName": "信息",
"LogName": "L",
"MachineName": "A",
"Opcode": "0",
"OpcodeDisplayName": "信息",
"ProcessId": "1",
"ProviderId": "PID",
"ProviderName": "P",
"Task": "1",
"TaskDisplayName": "Process Create",
"ThreadId": "1",
"TimeCreated": "2025-04-10T14:17:28.693228+08:00",
"Version": "1",
"wp_src_key": "socket",
"wp_src_ip": "127.0.0.1"
}
- Vector:
{
"DescriptionRawMessage": "Process Create\\\\r\\\\nRuleName: R",
"Hashes": "H",
"Id": 1,
"LevelDisplayName": "信息",
"LogName": "L",
"LogonId": 1,
"MachineName": "A",
"Opcode": "0",
"OpcodeDisplayName": "信息",
"ProcessId": "1",
"ProviderId": "PID",
"ProviderName": "P",
"Task": "1",
"TaskDisplayName": "Process Create",
"ThreadId": "1",
"TimeCreated": "2025-04-10T14:17:28.693228+08:00",
"Version": "1",
"cmd_line": "a.exe",
"current_dir": "C:\\\\",
"enrich_level": "severity",
"extends": {
"OriginalFileName": "a.exe",
"ParentCommandLine": "b.exe"
},
"extends_dir": {
"ParentProcessPath": "C:\\\\Windows\\\\b.exe",
"Process_path": "C:\\\\Windows\\\\a.exe"
},
"file_version": "1",
"host": "127.0.0.1",
"integrity_level": "M",
"keywords": "0",
"logon_guid": "{LG}",
"match_chars": "localhost",
"num_range": 1,
"occur_time": "2025-04-10 06:17:28.503",
"origin_file_name": "a.exe",
"parent_cmd_line": "b.exe",
"parent_process_guid": "{PG}",
"parent_process_id": "1",
"parent_process_path": "C:\\\\Windows\\\\b.exe",
"parent_process_user": "U",
"port": 49838,
"process_desc": "D",
"process_guid": "{G}",
"process_id": "1",
"process_path": "C:\\\\Windows\\\\a.exe",
"product_company": "C",
"product_name": "P",
"rule_name": "R",
"severity": "4",
"source_type": "socket",
"terminal_session_id": "1",
"timestamp": "2025-12-04T02:04:24.686378Z",
"user_name": "U"
}
4. APT Threat Log Samples
样本数据
#Feb 7 2025 15:07:18+08:00 USG1000E %%01ANTI-APT/4/ANTI-APT(l)[29]: An advanced persistent threat was detected. (SyslogId=1, VSys="public-long-virtual-system-name-for-testing-extra-large-value-to-simulate-enterprise-scenario", Policy="trust-untrust-high-risk-policy-with-deep-inspection-and-layer7-protection-enabled-for-advanced-threat-detection", SrcIp=192.168.1.123, DstIp=182.150.63.102, SrcPort=51784, DstPort=10781, SrcZone=trust-zone-with-multiple-segments-for-internal-security-domains-and-access-control, DstZone=untrust-wide-area-network-zone-with-external-facing-interfaces-and-honeynet-integration, User="unknown-long-user-field-used-for-simulation-purpose-with-extra-description-and-tags-[tag1][tag2][tag3]-to-reach-required-size", Protocol=TCP, Application="HTTP-long-application-signature-identification-with-multiple-behavior-patterns-and-deep-packet-inspection-enabled", Profile="IPS_default_advanced_extended_profile_with_ml_detection-long", Direction=aaa-long-direction-field-used-to-extend-size-with-additional-info-about-traffic-orientation-from-client-to-server, ThreatType=File Reputation with additional descriptive context of multi-layer analysis engine including sandbox-behavioral-signature-ml-static-analysis-and-network-correlation-modules-working-together, ThreatName=bbb-advanced-threat-campaign-with-code-name-operation-shadow-storm-and-related-IOCs-collected-over-multiple-incidents-in-the-wild-attached-metadata-[phase1][phase2][phase3], Action=ccc-block-and-alert-with-deep-scan-followed-by-quarantine-and-forensic-dump-generation-for-further-investigation, FileType=ddd-executable-binary-with-multiple-packed-layers-suspicious-import-table-behavior-and-evasion-techniques, Hash=eee1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef-long-hash-value-used-for-testing-purpose-extended-with-multiple-hash-representations-[MD5:aaa111bbb222ccc333]-[SHA1:bbb222ccc333ddd444]-[SHA256:ccc333ddd444eee555]-[SSDEEP:ddd444eee555fff666]-end-of-hash-section, Extr... [truncated]
解析结果 (Parsed):
- WarpParse:
{
"wp_event_id": 1764661811871722000,
"timestamp": "2025-02-07 15:07:18",
"Hostname": "USG1000E",
"ModuleName": "01ANTI-APT",
"SeverityHeader": "4",
"symbol": "ANTI-APT",
"type": "l",
"Count": "29",
"Content": "An advanced persistent threat was detected.",
"SyslogId": "1",
"VSys": "public-long-virtual-system-name-for-testing-extra-large-value-to-simulate-enterprise-scenario",
"Policy": "trust-untrust-high-risk-policy-with-deep-inspection-and-layer7-protection-enabled-for-advanced-threat-detection",
"SrcIp": "192.168.1.123",
"DstIp": "182.150.63.102",
"SrcPort": "51784",
"DstPort": "10781",
"SrcZone": "trust-zone-with-multiple-segments-for-internal-security-domains-and-access-control",
"DstZone": "untrust-wide-area-network-zone-with-external-facing-interfaces-and-honeynet-integration",
"User": "unknown-long-user-field-used-for-simulation-purpose-with-extra-description-and-tags-[tag1][tag2][tag3]-to-reach-required-size",
"Protocol": "TCP",
"Application": "HTTP-long-application-signature-identification-with-multiple-behavior-patterns-and-deep-packet-inspection-enabled",
"Profile": "IPS_default_advanced_extended_profile_with_ml_detection-long",
"Direction": "aaa-long-direction-field-used-to-extend-size-with-additional-info-about-traffic-orientation-from-client-to-server",
"ThreatType": "File Reputation with additional descriptive context of multi-layer analysis engine including sandbox-behavioral-signature-ml-static-analysis-and-network-correlation-modules-working-together",
"ThreatName": "bbb-advanced-threat-campaign-with-code-name-operation-shadow-storm-and-related-IOCs-collected-over-multiple-incidents-in-the-wild-attached-metadata-[phase1][phase2][phase3]",
"Action": "ccc-block-and-alert-with-deep-scan-followed-by-quarantine-and-forensic-dump-generation-for-further-investigation",
"FileType": "ddd-executable-binary-with-multiple-packed-layers-suspicious-import-table-behavior-and-evasion-techniques",
"Hash": "eee1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef-long-hash-value-used-for-testing-purpose-extended-with-multiple-hash-representations-[MD5:aaa111bbb222ccc333]-[SHA1:bbb222ccc333ddd444]-[SHA256:ccc333ddd444eee555]-[SSDEEP:ddd444eee555fff666]-end-of-hash-section, ExtraInfo=\"This is additional extended information purposely added to inflate the total log size for stress testing of log ingestion engines such as Vector, Fluent Bit, self-developed ETL pipelines, and any high-throughput log processing systems. It contains repeated segments to simulate realistic verbose threat intelligence attachment blocks. [SEG-A-BEGIN] The threat was part of a coordinated multi-vector campaign observed across various geographic regions targeting enterprise networks with spear-phishing, watering-hole attacks, and supply-chain compromise vectors. Enriched indicators include C2 domains, malware families, behavioral clusters, sandbox detonation traces, and network telemetry correlation. [SEG-A-END] [SEG-B-BEGIN] Further analysis revealed that the payload exhibited persistence techniques including registry autoruns, scheduled tasks, masquerading, process injection, and lateral movement attempts leveraging remote service creation and stolen credentials. The binary contains multiple obfuscation layers, anti-debugging, anti-VM checks, and unusual API call sequences. [SEG-B-END] [SEG-C-BEGIN] IOC Bundle: Domains=malicious-domain-example-01.com,malicious-domain-example-02.net,malicious-update-service.info; IPs=103.21.244.0,198.51.100.55,203.0.113.77; FileNames=update_service.exe,winlog_service.dll,mscore_update.bin; RegistryKeys=HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run,HKLM\\\\System\\\\Services\\\\FakeService; Mutex=Global\\\\A1B2C3D4E5F6G7H8; YARA Matches=[rule1,rule2,rule3]. [SEG-C-END] EndOfExtraInfo\",
"wp_src_key": "socket",
"wp_src_ip": "127.0.0.1"
}
- Vector:
{
"Action": "ccc-block-and-alert-with-deep-scan-followed-by-quarantine-and-forensic-dump-generation-for-further-investigation",
"Application": "HTTP-long-application-signature-identification-with-multiple-behavior-patterns-and-deep-packet-inspection-enabled",
"Content": "An advanced persistent threat was detected.",
"Count": "29",
"Direction": "aaa-long-direction-field-used-to-extend-size-with-additional-info-about-traffic-orientation-from-client-to-server",
"DstIp": "182.150.63.102",
"DstPort": "10781",
"DstZone": "untrust-wide-area-network-zone-with-external-facing-interfaces-and-honeynet-integration",
"FileType": "ddd-executable-binary-with-multiple-packed-layers-suspicious-import-table-behavior-and-evasion-techniques",
"Hash": "eee1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef-long-hash-value-used-for-testing-purpose-extended-with-multiple-hash-representations-[MD5:aaa111bbb222ccc333]-[SHA1:bbb222ccc333ddd444]-[SHA256:ccc333ddd444eee555]-[SSDEEP:ddd444eee555fff666]-end-of-hash-section, ExtraInfo=\"This is additional extended information purposely added to inflate the total log size for stress testing of log ingestion engines such as Vector, Fluent Bit, self-developed ETL pipelines, and any high-throughput log processing systems. It contains repeated segments to simulate realistic verbose threat intelligence attachment blocks. [SEG-A-BEGIN] The threat was part of a coordinated multi-vector campaign observed across various geographic regions targeting enterprise networks with spear-phishing, watering-hole attacks, and supply-chain compromise vectors. Enriched indicators include C2 domains, malware families, behavioral clusters, sandbox detonation traces, and network telemetry correlation. [SEG-A-END] [SEG-B-BEGIN] Further analysis revealed that the payload exhibited persistence techniques including registry autoruns, scheduled tasks, masquerading, process injection, and lateral movement attempts leveraging remote service creation and stolen credentials. The binary contains multiple obfuscation layers, anti-debugging, anti-VM checks, and unusual API call sequences. [SEG-B-END] [SEG-C-BEGIN] IOC Bundle: Domains=malicious-domain-example-01.com,malicious-domain-example-02.net,malicious-update-service.info; IPs=103.21.244.0,198.51.100.55,203.0.113.77; FileNames=update_service.exe,winlog_service.dll,mscore_update.bin; RegistryKeys=HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run,HKLM\\\\System\\\\Services\\\\FakeService; Mutex=Global\\\\A1B2C3D4E5F6G7H8; YARA Matches=[rule1,rule2,rule3]. [SEG-C-END] EndOfExtraInfo\",
"Hostname": "USG1000E",
"ModuleName": "01ANTI-APT",
"Policy": "trust-untrust-high-risk-policy-with-deep-inspection-and-layer7-protection-enabled-for-advanced-threat-detection",
"Profile": "IPS_default_advanced_extended_profile_with_ml_detection-long",
"Protocol": "TCP",
"SeverityHeader": "4",
"SrcIp": "192.168.1.123",
"SrcPort": "51784",
"SrcZone": "trust-zone-with-multiple-segments-for-internal-security-domains-and-access-control",
"SyslogId": "1",
"ThreatName": "bbb-advanced-threat-campaign-with-code-name-operation-shadow-storm-and-related-IOCs-collected-over-multiple-incidents-in-the-wild-attached-metadata-[phase1][phase2][phase3]",
"ThreatType": "File Reputation with additional descriptive context of multi-layer analysis engine including sandbox-behavioral-signature-ml-static-analysis-and-network-correlation-modules-working-together",
"User": "unknown-long-user-field-used-for-simulation-purpose-with-extra-description-and-tags-[tag1][tag2][tag3]-to-reach-required-size",
"VSys": "public-long-virtual-system-name-for-testing-extra-large-value-to-simulate-enterprise-scenario",
"host": "127.0.0.1",
"port": 55771,
"source_type": "socket",
"symbol": "ANTI-APT",
"timestamp": "Feb 7 2025 15:07:18+08:00",
"type": "l"
}
解析+转换结果 (Transformed):
- WarpParse:
{
"count": 29,
"severity": 4,
"match_chars": "localhost",
"num_range": 29,
"src_system_log_type": "日志信息",
"extends_ip": {
"DstIp": "182.150.63.102",
"SrcIp": "192.168.1.123"
},
"extends_info": {
"hostname": "USG1000E",
"source_type": "socket"
},
"wp_event_id": 1764815397395451000,
"timestamp": "2025-02-07 15:07:18",
"Hostname": "USG1000E",
"ModuleName": "01ANTI-APT",
"symbol": "ANTI-APT",
"type": "l",
"Content": "An advanced persistent threat was detected.",
"SyslogId": "1",
"VSys": "public-long-virtual-system-name-for-testing-extra-large-value-to-simulate-enterprise-scenario",
"Policy": "trust-untrust-high-risk-policy-with-deep-inspection-and-layer7-protection-enabled-for-advanced-threat-detection",
"SrcIp": "192.168.1.123",
"DstIp": "182.150.63.102",
"SrcPort": "51784",
"DstPort": "10781",
"SrcZone": "trust-zone-with-multiple-segments-for-internal-security-domains-and-access-control",
"DstZone": "untrust-wide-area-network-zone-with-external-facing-interfaces-and-honeynet-integration",
"User": "unknown-long-user-field-used-for-simulation-purpose-with-extra-description-and-tags-[tag1][tag2][tag3]-to-reach-required-size",
"Protocol": "TCP",
"Application": "HTTP-long-application-signature-identification-with-multiple-behavior-patterns-and-deep-packet-inspection-enabled",
"Profile": "IPS_default_advanced_extended_profile_with_ml_detection-long",
"Direction": "aaa-long-direction-field-used-to-extend-size-with-additional-info-about-traffic-orientation-from-client-to-server",
"ThreatType": "File Reputation with additional descriptive context of multi-layer analysis engine including sandbox-behavioral-signature-ml-static-analysis-and-network-correlation-modules-working-together",
"ThreatName": "bbb-advanced-threat-campaign-with-code-name-operation-shadow-storm-and-related-IOCs-collected-over-multiple-incidents-in-the-wild-attached-metadata-[phase1][phase2][phase3]",
"Action": "ccc-block-and-alert-with-deep-scan-followed-by-quarantine-and-forensic-dump-generation-for-further-investigation",
"FileType": "ddd-executable-binary-with-multiple-packed-layers-suspicious-import-table-behavior-and-evasion-techniques",
"Hash": "eee1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef-long-hash-value-used-for-testing-purpose-extended-with-multiple-hash-representations-[MD5:aaa111bbb222ccc333]-[SHA1:bbb222ccc333ddd444]-[SHA256:ccc333ddd444eee555]-[SSDEEP:ddd444eee555fff666]-end-of-hash-section, ExtraInfo=\"This is additional extended information purposely added to inflate the total log size for stress testing of log ingestion engines such as Vector, Fluent Bit, self-developed ETL pipelines, and any high-throughput log processing systems. It contains repeated segments to simulate realistic verbose threat intelligence attachment blocks. [SEG-A-BEGIN] The threat was part of a coordinated multi-vector campaign observed across various geographic regions targeting enterprise networks with spear-phishing, watering-hole attacks, and supply-chain compromise vectors. Enriched indicators include C2 domains, malware families, behavioral clusters, sandbox detonation traces, and network telemetry correlation. [SEG-A-END] [SEG-B-BEGIN] Further analysis revealed that the payload exhibited persistence techniques including registry autoruns, scheduled tasks, masquerading, process injection, and lateral movement attempts leveraging remote service creation and stolen credentials. The binary contains multiple obfuscation layers, anti-debugging, anti-VM checks, and unusual API call sequences. [SEG-B-END] [SEG-C-BEGIN] IOC Bundle: Domains=malicious-domain-example-01.com,malicious-domain-example-02.net,malicious-update-service.info; IPs=103.21.244.0,198.51.100.55,203.0.113.77; FileNames=update_service.exe,winlog_service.dll,mscore_update.bin; RegistryKeys=HKCU\\\\\\\\Software\\\\\\\\Microsoft\\\\\\\\Windows\\\\\\\\CurrentVersion\\\\\\\\Run,HKLM\\\\\\\\System\\\\\\\\Services\\\\\\\\FakeService; Mutex=Global\\\\\\\\A1B2C3D4E5F6G7H8; YARA Matches=[rule1,rule2,rule3]. [SEG-C-END] EndOfExtraInfo\",
"wp_src_key": "socket",
"wp_src_ip": "127.0.0.1"
}
- Vector:
{
"Action": "ccc-block-and-alert-with-deep-scan-followed-by-quarantine-and-forensic-dump-generation-for-further-investigation",
"Application": "HTTP-long-application-signature-identification-with-multiple-behavior-patterns-and-deep-packet-inspection-enabled",
"Content": "An advanced persistent threat was detected.",
"Direction": "aaa-long-direction-field-used-to-extend-size-with-additional-info-about-traffic-orientation-from-client-to-server",
"DstIp": "182.150.63.102",
"DstPort": "10781",
"DstZone": "untrust-wide-area-network-zone-with-external-facing-interfaces-and-honeynet-integration",
"FileType": "ddd-executable-binary-with-multiple-packed-layers-suspicious-import-table-behavior-and-evasion-techniques",
"Hash": "eee1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef-long-hash-value-used-for-testing-purpose-extended-with-multiple-hash-representations-[MD5:aaa111bbb222ccc333]-[SHA1:bbb222ccc333ddd444]-[SHA256:ccc333ddd444eee555]-[SSDEEP:ddd444eee555fff666]-end-of-hash-section, ExtraInfo=\"This is additional extended information purposely added to inflate the total log size for stress testing of log ingestion engines such as Vector, Fluent Bit, self-developed ETL pipelines, and any high-throughput log processing systems. It contains repeated segments to simulate realistic verbose threat intelligence attachment blocks. [SEG-A-BEGIN] The threat was part of a coordinated multi-vector campaign observed across various geographic regions targeting enterprise networks with spear-phishing, watering-hole attacks, and supply-chain compromise vectors. Enriched indicators include C2 domains, malware families, behavioral clusters, sandbox detonation traces, and network telemetry correlation. [SEG-A-END] [SEG-B-BEGIN] Further analysis revealed that the payload exhibited persistence techniques including registry autoruns, scheduled tasks, masquerading, process injection, and lateral movement attempts leveraging remote service creation and stolen credentials. The binary contains multiple obfuscation layers, anti-debugging, anti-VM checks, and unusual API call sequences. [SEG-B-END] [SEG-C-BEGIN] IOC Bundle: Domains=malicious-domain-example-01.com,malicious-domain-example-02.net,malicious-update-service.info; IPs=103.21.244.0,198.51.100.55,203.0.113.77; FileNames=update_service.exe,winlog_service.dll,mscore_update.bin; RegistryKeys=HKCU\\\\\\\\Software\\\\\\\\Microsoft\\\\\\\\Windows\\\\\\\\CurrentVersion\\\\\\\\Run,HKLM\\\\\\\\System\\\\\\\\Services\\\\\\\\FakeService; Mutex=Global\\\\\\\\A1B2C3D4E5F6G7H8; YARA Matches=[rule1,rule2,rule3]. [SEG-C-END] EndOfExtraInfo\",
"Hostname": "USG1000E",
"ModuleName": "01ANTI-APT",
"Policy": "trust-untrust-high-risk-policy-with-deep-inspection-and-layer7-protection-enabled-for-advanced-threat-detection",
"Profile": "IPS_default_advanced_extended_profile_with_ml_detection-long",
"Protocol": "TCP",
"SeverityHeader": "4",
"SrcIp": "192.168.1.123",
"SrcPort": "51784",
"SrcZone": "trust-zone-with-multiple-segments-for-internal-security-domains-and-access-control",
"SyslogId": "1",
"ThreatName": "bbb-advanced-threat-campaign-with-code-name-operation-shadow-storm-and-related-IOCs-collected-over-multiple-incidents-in-the-wild-attached-metadata-[phase1][phase2][phase3]",
"ThreatType": "File Reputation with additional descriptive context of multi-layer analysis engine including sandbox-behavioral-signature-ml-static-analysis-and-network-correlation-modules-working-together",
"User": "unknown-long-user-field-used-for-simulation-purpose-with-extra-description-and-tags-[tag1][tag2][tag3]-to-reach-required-size",
"VSys": "public-long-virtual-system-name-for-testing-extra-large-value-to-simulate-enterprise-scenario",
"count": 29,
"extends_info": {
"hostname": "USG1000E",
"source_type": "socket"
},
"extends_ip": {
"DstIp": "182.150.63.102",
"SrcIp": "192.168.1.123"
},
"host": "127.0.0.1",
"match_chars": "localhost",
"num_range": 29,
"port": 51272,
"severity": 4,
"source_type": "socket",
"src_system_log_type": "日志信息",
"symbol": "ANTI-APT",
"timestamp": "Feb 7 2025 15:07:18+08:00",
"type": "l"
}
wpgen_test 场景说明
本用例专门用于测试 wpgen 数据生成器的性能:仅生成样本数据,不启动 wparse 解析。适用于评估数据生成能力、验证生成规则正确性,以及为其他基准测试准备数据。
场景特点
- 纯生成测试:仅测试 wpgen 生成能力,不启动 wparse
- 多规则集:支持 nginx 和 benchmark 两套规则
- 多速度档位:测试不同限速下的生成性能
- 大规模数据:默认生成 800 万行 + 600 行样本
目录结构
wpgen_test/
├── conf/
│ ├── wparse.toml # 主配置(本用例不使用)
│ └── wpgen.toml # 生成器配置
├── models/
│ ├── oml/ # OML 转换模型
│ ├── sinks/ # Sink 配置
│ ├── sources/ # 源配置
│ └── wpl/ # WPL 规则
│ ├── nginx/ # nginx 规则
│ └── benchmark/ # benchmark 规则
├── data/
│ └── logs/ # 日志目录
└── run.sh # 运行脚本
快速使用
cd benchmark
# 默认测试(nginx + benchmark 两套规则)
./wpgen_test/run.sh
# 指定 profile(release/debug)
./wpgen_test/run.sh release
./wpgen_test/run.sh debug
参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
-w <cnt> | worker 参数(本脚本会忽略) | - |
profile | 构建 profile | release |
注意:
-w参数仅为保持与其他 benchmark 脚本接口一致,本脚本不使用。
执行流程
- 初始化 release 环境
- 清理旧数据
- 生成高速 nginx 样本(800 万行,200 万行/秒)
- 生成高速 benchmark 样本(800 万行,200 万行/秒)
- 生成低速 nginx 样本(6000 行,1000 行/秒)
测试配置
脚本中的测试配置:
# 高速生成测试
LINE_CNT=8000000
SPEED_MAX=2000000
wpgen sample -n $LINE_CNT -s $SPEED_MAX --stat 2 -p --wpl ./models/wpl/nginx
wpgen sample -n $LINE_CNT -s $SPEED_MAX --stat 2 -p --wpl ./models/wpl/benchmark
# 低速生成测试
LINE_CNT=6000
SPEED_MAX=1000
wpgen sample -n $LINE_CNT -s $SPEED_MAX --stat 2 -p --wpl ./models/wpl/nginx
性能指标
预期吞吐
- 无限速:取决于 CPU 和磁盘 I/O
- 限速 200 万/秒:稳定达到目标速率
- 限速 1000/秒:精确控制生成速率
影响因素
- CPU 性能:规则复杂度影响生成速度
- 磁盘 I/O:文件写入瓶颈
- 规则复杂度:字段数量和类型
输出示例
gen 2000000
[STAT] generated: 8000000, speed: 2000000/s, elapsed: 4.0s
[STAT] generated: 8000000, speed: 2000000/s, elapsed: 4.0s
gen 1000
[STAT] generated: 6000, speed: 1000/s, elapsed: 6.0s
常见问题
Q1: 生成速度未达到限速值
- 检查 CPU 使用率是否已满
- 检查磁盘 I/O 是否瓶颈
- 考虑降低规则复杂度
Q2: 内存占用过高
- 减少并行度(
parallel参数) - 分批生成数据
Q3: 生成数据格式错误
- 检查 WPL gen_rule.wpl 规则
- 使用
wpkit验证规则语法
与其他基准测试的关系
| 脚本 | wpgen 使用 | wparse 使用 |
|---|---|---|
| wpgen_test | 专门测试 | 不使用 |
| wpls_test | 生成数据 | 多 worker 测试 |
| file_blackhole | 生成数据 | batch 测试 |
| tcp_blackhole | 生成+发送 | daemon 测试 |
相关文档
Core用例
本目录收录核心端到端用例与场景化配置,便于快速验证解析、路由、过滤、度量与校验能力。
目录规范(V2)
- 每个用例的标准布局(已逐步迁移):
conf/:引擎与工具配置(wparse.toml等)connectors/source.d/、connectors/sink.d/:源/汇连接器(file/syslog/kafka/DB 等)models/:规则与路由(models/wpl、models/oml、models/sources/wpsrc.toml、models/sinks/{business.d,infra.d,defaults.toml})data/:运行数据目录(data/in_dat、data/out_dat、data/rescue、logs/)- 其它:脚本与 README 按各场景自述
常用命令(wproj / wparse)
- 初始化 & 校验
wproj conf clean|init|check生成与校验conf/、connectors/、models/(源配置默认写入models/sources/wpsrc.toml)wproj data clean|check清理输出或校验/构建源(v2)
- 数据生成
wpgen conf init生成生成器配置wpgen sample -n N --stat S生成样本到data/in_dat/
- 解析运行
wparse batch --stat S -p [-n N]批处理运行
- 统计与校验
wproj stat file|src-file|sink-file [--json]wproj validate sink-file [-v] [--input-cnt N] [--json]
全局约定
- sink 命名
name:单个 sink 的名称,需在同一sink_group内唯一;未显式提供时按索引回退为[0]、[1]…full_name = sink_group.name + "/" + name,CLI 展示与运行期内部标识统一使用full_name。
- filter 语义
filter是“拦截条件”:表达式为true时该 sink 丢弃本条数据并转发至基础组intercept;为false时才写入该 sink。
- 校验(validate)
- 三层期望:
defaults.expect(全局默认)→sink_group.expect(组级)→sink.expect(单项) ratio±tol或[min,max]二选一;min_samples控制分母阈值。
- 三层期望:
- CLI 展示
wproj stat file与wproj validate sink-file的 Sink 列统一显示full_name。
快速开始(完整指南)
- 文档入口:
docs/README.md - 快速入门:
docs/getting-started/quickstart.md
快速开始(命令摘要)
- 构建:
cargo build --workspace --all-features - 进入用例目录并运行:
./case_verify.sh - 单步:
- 统计:
wproj stat file - 校验:
wproj validate sink-file -v
- 统计:
用例清单
1) getting_started(初始化示例)
- 目的:最小可运行工程模板,初始化 source/oml/sink 与基础组。
- 入口:
usecase/core/getting_started/case_verify.sh - 业务组:
sink/business.d/benchmark.toml→/sink/benchmark - 基础组:
sink/infra.d/*.toml(default/miss/residue/intercept/error/monitor)
2) multi_sink(多汇与占比)
- 目的:同一
sink_group下多种输出格式与占比校验。 - 入口:
usecase/core/multi_sink/case_verify.sh - 业务组:
sink/business.d/simple.toml- 组名:
/sink/simple - sinks:
dat/json/kv(各 1/3 占比)
- 组名:
3) wpl_success / wpl_missing(规则成功/缺失场景)
- wpl_success:成功解析全链路
- wpl_missing:字段缺失容错;已统一
sink_group为/sink/simple,sinks 命名为dat/json/kv - 入口:
usecase/core/wpl_success|wpl_missing/case_verify.sh
4) source_file(多文件源与对半分流)
- 目的:演示
Benchmark1/Benchmark2两路对半分流(KV 输出) - 业务组:
sink/business.d/benchmark1.toml→/sink/benchmark1,benchmark2.toml→/sink/benchmark2 - 建议:如需更直观,可改为
/sink/benchmark/kv1、/sink/benchmark/kv2
5) sink_filter(按 sink 过滤/拦截)
- 目的:按规则将数据划分为全量与安全两路;命中过滤条件的样本进入
intercept - 业务组:
sink/business.d/filter.toml→/sink/filterall:不设置filter,收全量safe:filter = "./sink/business.d/filter.conf"(请在文件中写“非安全”条件,命中则拦截)
- 入口:
usecase/core/sink_filter/case_verify.sh
6) prometheus_metrics(Prometheus 指标导出)
- 目的:经 Prometheus sink 导出内部指标,curl
/metrics拉取 - 业务组:
sink/business.d/benchmark.toml(样本) - 基础组:
sink/infra.d/monitor.toml→ 建议改为 Prometheus 连接器- 添加连接器:
usecase/core/connectors/sink.d/10-prometheus.toml - 修改
monitor.toml,connect = "prometheus_sink"(或覆盖 endpoint 为127.0.0.1:35666)
- 添加连接器:
- 验证:
curl -s http://127.0.0.1:35666/metrics
7) sink_recovery(故障切换与救援)
- 目的:写入失败时使用 rescue;可在
logs/wparse.log中观察 fallback/repair - 业务组:
sink/business.d/benchmark.toml、example.toml(可为 sinks 添加primary/backup等更语义化名称)
8) oml_examples(OML 转换示例)
- 目的:多种 OML 转换与输出格式
- 业务组:
sink/business.d/skyeye_stat.toml、work_case.toml、csv_example.toml - 建议:给 sinks 显式命名(如
skyeye_adm/skyeye_pdm),便于full_name识别
9) error_reporting(错误数据报表)
- 目的:针对错误数据路径输出多格式报表
- 业务组:
sink/business.d/skyeye_stat.toml(json/kv 两路)
10) config_errors(配置错误场景)
- no_source/less_dvadm 两个子场景;用于校验 CLI 诊断输出与错误处理
命名建议(可按需逐步收敛)
- 业务组名:短小、语义明确,如
/sink/simple、/sink/filter、/sink/benchmark - sink 名:描述输出内容或用途,如
dat/json/kv、all/safe、primary/backup、adm/pdm - 已调整:
wpl_missing/sink/business.d/simple.toml统一为/sink/simple,并为 sinks 增加dat/json/kv名称
常见问题
- filter 未生效:
- 路径基于当前工作目录解析;确保
filter.conf相对sink_root可访问 - 表达式需能被 TCondParser 解析;可先用简单表达式烟囱测试
- 路径基于当前工作目录解析;确保
- Prometheus 未启动:
- 未配置 Prometheus 连接器并将
monitor组切换到该连接器时,不会有/metrics端点
- 未配置 Prometheus 连接器并将
- 覆盖参数失败:
params的键必须在连接器allow_override白名单中
约定优于配置:尽量为每个 sink 显式给出
name,以获得稳定的full_name与更可读的校验报表;对过滤型用例,请把拦截条件放在filter.conf文件,便于复用与审阅。
配置使用变量
error_reporting
本用例演示“错误数据报表与多格式输出“的场景:针对 skyeye_stat 类型的系统监控日志进行解析,通过 OML 进行数据转换,并支持多种输出格式(JSON、KV 等)。适用于错误数据的收集、分析与报表生成。
目录结构
conf/:配置目录conf/wparse.toml:主配置conf/wpgen.toml:数据生成器配置
models/:规则与路由models/wpl/skyeye_stat/:skyeye_stat 解析规则models/wpl/example/simple/:示例解析规则models/oml/skyeye_stat.oml:OML 转换模型models/sinks/business.d/:业务路由models/sinks/infra.d/:基础组models/sources/wpsrc.toml:源配置
data/:运行数据目录
WPL 解析规则
skyeye_stat 规则 (models/wpl/skyeye_stat/parse.wpl)
解析 skyeye 系统监控日志,提取 CPU、内存、磁盘等系统指标:
package skyeye_stat {
#[copy_raw(name:"raw_msg")]
rule case1 {
(digit<<,>>, digit, symbol(skyeye), _,
time:updatetime\|\!, ip:sip\|\!, chars:log_type\|\![),
some_of (
json( symbol(空闲CPU百分比)@name, @value:cpu_free),
json( symbol(空闲内存kB)@name, @value:memory_free),
json( symbol(1分钟平均CPU负载)@name, @value:cpu_used_by_one_min),
// ... 更多指标
)\,
}
}
OML 转换模型
skyeye_stat.oml
对解析后的数据进行二次转换与增强:
name : skyeye_stat
rule : skyeye_stat/*
---
src_key : chars = take() ;
recv_time : time = Time::now() ;
pos_sn : chars = take() ;
updatetime : time = take() ;
sip : chars = take() ;
log_type : chars = take() ;
cust_tag : chars = fmt("[{pos_sn}-{sip}]", @pos_sn, @sip ) ;
value : obj = object {
process,memory_free : float = take() ;
cpu_free,cpu_used_by_one_min, cpu_used_by_fifty_min : float = take() ;
disk_free,disk_used,disk_used_by_one_min, disk_used_by_fify_min : float = take() ;
} ;
time_all : array = collect take( keys : [ *time* ] ) ;
raw_msg : chars = pipe take() | base64_en ;
快速使用
构建项目
cargo build --workspace --all-features
运行用例
cd core/error_reporting
./run.sh
脚本执行流程:
- 初始化环境与配置(保留 conf 以加载自定义配置)
- 使用 wpgen 生成样本数据
- 运行 wparse 批处理解析
- 校验输出统计
手动执行
# 初始化配置
wproj check
wproj data clean
wpgen data clean
# 生成样本数据
wpgen sample -n 3000 --stat 3
# 运行批处理解析
wparse batch --stat 3 -p -n 3000
# 校验输出
wproj data stat
wproj data validate
可调参数
通过环境变量覆盖:
LINE_CNT:生成行数(默认 3000)STAT_SEC:统计间隔秒数(默认 3)
业务组配置
skyeye_stat 业务组 (models/sinks/business.d/skyeye_stat.toml)
支持多种输出格式:
- JSON 格式输出
- KV 格式输出
OML 特性演示
本用例展示了以下 OML 特性:
take():从解析结果中提取字段Time::now():获取当前时间fmt():字符串格式化object {}:创建嵌套对象collect:收集匹配字段pipe ... | base64_en:管道处理与 Base64 编码
常见问题
Q1: 解析失败
- 确认输入数据格式符合 WPL 规则定义
- 查看
data/logs/wparse.log中的详细错误信息 - 检查
some_of中的可选字段是否正确匹配
Q2: OML 转换失败
- 确认 OML 中
rule匹配的 WPL package 路径正确 - 确认字段名与 WPL 解析结果一致
相关文档
FileSource
knowdb_case
本用例演示“知识库(KnowDB)查询与数据关联“的场景:通过 WPL 规则解析日志后,使用 OML 中的 select ... from ... where 语句从知识库中查询关联数据,实现日志解析与业务数据的动态关联。
目录结构
conf/:配置目录conf/wpgen.toml:数据生成器配置(UDP syslog 输出)
models/:规则与路由models/wpl/example/:WPL 解析规则(nginx 日志解析)models/knowledge/example/:知识库数据(CSV 格式)models/sinks/business.d/:业务路由models/sinks/infra.d/:基础组models/sources/wpsrc.toml:源配置(UDP syslog)
data/:运行数据目录data/in_dat/:输入数据data/out_dat/:sink 输出data/logs/:日志目录
知识库配置
知识库表定义 (models/knowledge/example/)
models/knowledge/example/
├── create.sql # 表结构定义
├── data.csv # 数据文件
└── insert.sql # 数据插入语句
示例数据 (data.csv):
name,pinying
令狐冲,linghuchong
任盈盈,renyingying
知识库配置 (models/knowledge/knowdb.toml)
定义知识库的加载路径与表映射关系。
WPL 解析规则
解析规则 (models/wpl/example/parse.wpl)
package /example {
#[tag(from_dc: "warplog/cs/nginx")]
rule nginx {
(ip:sip,_^2,time<[,]>,http/request",http/status,digit,chars",http/agent",_")
}
}
oml_examples
本用例演示“OML(Object Modeling Language)转换“的多种场景:通过丰富的 OML 示例展示数据转换、字段映射、条件匹配、知识库查询等高级特性。适用于学习 OML 语法与最佳实践。
目录结构
core/oml_examples/
├── README.md # 本说明文档
├── run.sh # 一键运行脚本
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ └── wpgen.toml # 数据生成器配置
├── models/ # 规则与模型目录
│ ├── oml/ # OML 转换模型
│ │ ├── csv_example.oml # CSV 数据处理与条件匹配
│ │ ├── skyeye_stat.oml # 系统监控数据转换
│ │ └── work_case.oml # 工作案例数据处理
│ ├── knowledge/ # 知识库数据
│ │ ├── knowdb.toml # 知识库主配置
│ │ ├── address/ # 地址信息知识库
│ │ │ ├── create.sql # 建表语句
│ │ │ ├── data.csv # 地址数据
│ │ │ └── insert.sql # 插入语句
│ │ ├── example/ # 示例数据知识库
│ │ │ ├── create.sql # 建表语句
│ │ │ ├── data.csv # 示例数据
│ │ │ └── insert.sql # 插入语句
│ │ └── example_score/ # 分数数据知识库
│ │ ├── create.sql # 建表语句
│ │ ├── data.csv # 分数数据
│ │ └── insert.sql # 插入语句
│ ├── sinks/ # 数据汇配置
│ │ ├── defaults.toml # 默认配置
│ │ ├── business.d/ # 业务路由配置
│ │ │ ├── csv_example.toml # CSV 示例输出
│ │ │ ├── skyeye_stat.toml # 系统监控输出
│ │ │ └── work_case.toml # 工作案例输出
│ │ └── infra.d/ # 基础设施配置
│ │ ├── default.toml # 默认数据汇
│ │ ├── error.toml # 错误数据处理
│ │ ├── miss.toml # 缺失数据处理
│ │ ├── monitor.toml # 监控数据处理
│ │ └── residue.toml # 残留数据处理
│ ├── sources/ # 数据源配置(空)
│ └── wpl/ # WPL 解析规则(空)
├── data/ # 运行数据目录
│ ├── in_dat/ # 输入数据目录
│ ├── out_dat/ # 输出数据目录
│ │ ├── csv_example.dat # CSV 处理结果
│ │ ├── skyeye_adm.json # SkyEye ADM 输出
│ │ ├── skyeye_pdm.json # SkyEye PDM 输出
│ │ └── work_case.json # 工作案例输出
│ └── logs/ # 日志文件目录
│ ├── gen.dat # 生成的样本数据
│ └── *.log # 各类日志文件
└── .run/ # 运行时数据目录
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
运行命令
# 进入用例目录
cd core/oml_examples
# 运行完整流程(默认生成 3000 条测试数据)
./run.sh
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境初始化
- 保留必要的配置文件(wparse.toml, wpgen.toml)
- 清理历史运行数据
- 创建必要的目录结构
- 初始化知识库数据
-
服务检查
- 使用
wproj check验证配置和模型 - 确保所有依赖项正常
- 使用
-
数据清理
- 清空输入输出数据目录
- 重置日志文件
- 清理生成器缓存
-
生成样本数据
- 使用
wpgen sample生成测试数据 - 数据包含 CSV、JSON 等多种格式
- 模拟真实的业务场景数据
- 使用
-
执行数据解析
- 启动 WarpParse 批处理模式
- 加载 OML 模型进行数据转换
- 应用知识库查询增强数据
-
验证输出结果
- 统计各输出文件的数据量
- 验证数据转换的正确性
- 检查知识库查询结果
数据流向
生成数据 (data/logs/gen.dat)
↓
WarpParse OML 引擎
↓
┌─────────────┬─────────────┬─────────────┐
│ csv_example │ skyeye_stat │ work_case │
│ 处理 │ 转换 │ 解析 │
└─────────────┴─────────────┴─────────────┘
↓ ↓ ↓
┌─────────────┬─────────────┬─────────────┐
│csv_example │skyeye_adm │work_case │
│ .dat │ .json │ .json │
└─────────────┴─────────────┴─────────────┘
└─────────────┘
skyeye_pdm
.json
OML 示例详解
1. csv_example.oml - CSV 数据处理与条件匹配
name: csv_example
rule : csv_example/*
---
occur_time = Time::now() ;
year = take();
sid = digit(10);
quart = match read(month) {
in ( digit(1) , digit(3) ) => chars(Q1);
in ( digit(4) , digit(6) ) => chars(Q2);
in ( digit(7) , digit(9) ) => chars(Q3);
in ( digit(10) , digit(12) ) => chars(Q4);
_ => chars(Q5);
};
level = match ( read(city) , read(count) ) {
( chars(cs) , in ( digit(81) , digit(200) ) ) => chars(GOOD);
( chars(cs) , in ( digit(0) , digit(80) ) ) => chars(BAD);
( chars(bj) , in ( digit(101) , digit(200) ) ) => chars(GOOD);
( chars(bj) , in ( digit(0) , digit(100) ) ) => chars(BAD);
_ => chars(NOR);
};
vender = match read(product) {
chars(warp) => chars(warp-rd)
!chars(warp) => chars(other)
};
severity: chars = match take(option:[severity]) {
digit(0) => chars(未知);
digit(1) => chars(信息);
digit(2) => chars(低危);
digit(3) => chars(高危(漏洞));
};
math_score = select math from example_score where id = read(sid) ;
* = take() ;
特性演示:
- 时间戳生成:
Time::now()获取当前时间 - 范围匹配:
in (digit(1), digit(3))匹配数值范围 - 元组匹配:
(read(city), read(count))多字段联合匹配 - 否定匹配:
!chars(warp)排除特定值 - 可选字段:
take(option:[severity])处理可选字段 - 知识库查询:
select ... from ... where动态查询数据 - 透传字段:
* = take()保留所有未处理字段
2. skyeye_stat.oml - 系统监控数据转换
name : skyeye_stat
rule : skyeye_stat/*
---
vendor = chars(wparse) ;
v_ip = ip(127.0.0.1) ;
recv_time = Time::now() ;
cust_tag = fmt("[{pos_sn}-{sip}]", @pos_sn, @sip ) ;
value = object {
process,memory_free : float = take() ;
cpu_free,cpu_used_by_one_min, cpu_used_by_fifty_min : float = take() ;
disk_free,disk_used,disk_used_by_one_min, disk_used_by_fify_min : float = take() ;
} ;
time_all = collect take( keys : [ *time* ] ) ;
raw_msg = pipe take() | base64_en ;
特性演示:
- 常量赋值:
chars(wparse)、ip(127.0.0.1)固定值 - 格式化字符串:
fmt()模板字符串 - 嵌套对象:
object { ... }创建结构化数据 - 字段收集:
collect take(keys: [*time*])动态收集字段 - 管道处理:
pipe ... | base64_en数据流处理
3. work_case.oml - 工作案例数据处理
name : work_case
rule : work_case/*
---
agent_id = take() ;
symbol = take() ;
botnet = take() ;
# 条件分支处理
symbol: chars = match read(symbol) {
chars(web_cve) => chars(Web漏洞);
chars(os_cve) => chars(系统漏洞);
_ => read(symbol);
};
# 动态路径收集
path_list = collect read(keys: [details*path]) ;
# 透传剩余字段
* = take() ;
特性演示:
- 简单字段提取:基础的数据提取
- 条件替换:基于值的字段映射
- 通配符收集:
[details*path]模糊匹配收集 - 剩余字段处理:保留所有未定义字段
配置说明
主配置文件 (conf/wparse.toml)
version = "1.0"
robust = "normal"
[models]
wpl = "./models/wpl"
oml = "./models/oml"
sources = "./models/sources"
sinks = "./models/sinks"
[performance]
rate_limit_rps = 500000 # 高速率限制,适合批处理
parse_workers = 2 # 解析工作线程数
[rescue]
path = "./data/rescue"
[log_conf]
level = "warn,ctrl=info,launch=info,source=info,sink=info,stat=info,runtime=warn,oml=warn,wpl=warn,klib=warn,orion_error=error,orion_sens=warn"
output = "File"
[stat]
window_sec = 60
数据生成器配置 (conf/wpgen.toml)
[generator]
mode = "sample" # 使用预定义样本
count = 1000 # 生成数据条数
speed = 1000 # 生成速度(条/秒)
parallel = 1 # 并发数
[output]
connect = "file_raw_sink"
[output.params]
base = "data/in_dat"
file = "gen.dat"
[log_conf]
level = "info"
output = "File"
知识库配置 (models/knowledge/knowdb.toml)
version = "2.0"
[default]
transaction = true # 启用事务
batch_size = 2000 # 批处理大小
[csv]
has_header = true # CSV 包含表头
delimiter = "," # 分隔符
encoding = "utf-8" # 编码
[table.example_score]
mapping = "header" # 按表头映射
range = "5,110" # 数据行范围
[table.address]
mapping = "index" # 按索引映射
range = "5,110" # 数据行范围
业务 Sink 配置示例 (models/sinks/business.d/csv_example.toml)
version = "2.0"
[sink]
name = "csv_example"
type = "file_csv_sink"
connect = "csv_sink"
[sink.params]
base = "data/out_dat"
file = "csv_example.dat"
[sink.expect]
basis = "total_input"
ratio = 0.7 # 期望 70% 的数据进入此 sink
deviation = 0.01 # 允许 1% 的偏差
验证
运行成功验证
-
输出文件统计
wproj data stat -
验证数据完整性
wproj data validate -
查看输出样例
# CSV 输出 head -20 data/out_dat/csv_example.dat # JSON 输出 jq . data/out_dat/skyeye_adm.json | head -40
使用不同的输出格式
配置不同的 Sink 类型:
- JSON 输出:
type = "file_json_sink" - CSV 输出:
type = "file_csv_sink" - KV 输出:
type = "file_kv_sink" - 原始输出:
type = "file_raw_sink"
本文档最后更新时间:2025-12-16
prometheus_metrics
本用例演示“Prometheus 指标导出“的场景:通过 Prometheus sink 导出 warp-flow 的内部运行指标,支持通过 HTTP /metrics 端点拉取指标数据。适用于监控系统集成与性能观测。
目录结构
conf/:配置目录conf/wparse.toml:主配置(含 Prometheus 导出配置)
models/:规则与路由models/wpl/:WPL 解析规则models/oml/:OML 转换模型models/sinks/business.d/:业务路由models/sinks/infra.d/:基础组(含 monitor 组)models/sources/wpsrc.toml:源配置(UDP syslog)
data/:运行数据目录
Prometheus 配置
Monitor 组配置
在 models/sinks/infra.d/monitor.toml 中配置 Prometheus sink:
[[sink_group]]
name = "/sink/infra/monitor"
connect = "prometheus_sink"
[[sink_group.sinks]]
name = "prometheus_exporter"
Prometheus 连接器
在 connectors/sink.d/ 中添加 Prometheus 连接器:
[connector]
id = "prometheus_sink"
type = "prometheus"
[connector.params]
endpoint = "127.0.0.1:35666"
快速使用
构建项目
cargo build --workspace --all-features
运行用例
cd core/prometheus_metrics
./run.sh
脚本执行流程:
- 初始化环境与配置
- 启动 wparse(syslog 接收 + Prometheus 导出)
- 等待服务启动(约 3 秒)
- 使用 wpgen 生成并发送样本数据
- 停止服务并校验输出
手动执行
# 初始化配置
wproj data clean
# 启动解析服务(后台)
wparse daemon --stat 2 -p &
# 等待服务启动
sleep 3
# 生成并发送样本
wpgen sample -n 1000 --stat 1 -p
# 拉取 Prometheus 指标
curl -s http://localhost:35666/metrics
# 停止服务
kill $(cat ./.run/wparse.pid)
# 校验输出
wproj data stat
wproj data validate --input-cnt 1000
可调参数
LINE_CNT:生成行数(默认 1000)STAT_SEC:统计间隔秒数(默认 2)
Prometheus 指标
示例指标
# HELP wparse_input_total Total number of input records
# TYPE wparse_input_total counter
wparse_input_total 1000
# HELP wparse_output_total Total number of output records by sink
# TYPE wparse_output_total counter
wparse_output_total{sink="benchmark"} 950
wparse_output_total{sink="default"} 50
# HELP wparse_parse_duration_seconds Parse duration histogram
# TYPE wparse_parse_duration_seconds histogram
wparse_parse_duration_seconds_bucket{le="0.001"} 800
wparse_parse_duration_seconds_bucket{le="0.01"} 990
wparse_parse_duration_seconds_bucket{le="+Inf"} 1000
指标类型
- Counter:输入/输出计数、错误计数
- Gauge:队列深度、活跃连接数
- Histogram:解析延迟、处理时长
Grafana 集成
添加数据源
- 在 Grafana 中添加 Prometheus 数据源
- URL:
http://localhost:35666
示例查询
# 输入速率
rate(wparse_input_total[1m])
# 输出分布
sum by (sink) (wparse_output_total)
# P99 延迟
histogram_quantile(0.99, wparse_parse_duration_seconds_bucket)
常见问题
Q1: Prometheus 端点无响应
- 确认
conf/wparse.toml中启用了 Prometheus 导出 - 确认
monitor组连接器配置为prometheus_sink - 检查端口是否被占用:
lsof -i :35666
Q2: 指标为空
- 确认 wparse 已接收到数据
- 检查
data/logs/wparse.log中的错误信息 - 确认 sinks 路由配置正确
Q3: 指标延迟
- Prometheus 指标通常有几秒的采集延迟
- 确认 scrape_interval 配置合理
相关文档
sink_filter
本用例演示“按 sink 过滤/分流”的场景:依据业务规则将输入样本分发到不同的 sink 路径(all/safe/residue 等),并通过 defaults.expect 与单项 expect 对输出比例进行离线校验。适用于验证过滤逻辑正确性、残留/错误路径占比是否符合预期。
目录结构
conf/:wparse.toml(主配置)、wpsrc.toml(v2 源配置)connectors/source.d/:文件源连接器(可按需添加更多)sink/(作为sink_root)infra.d/:基础组(default/miss/residue/intercept/error/monitor)business.d/:过滤型业务组路由(示例:filter/*.toml)defaults.toml:默认期望[defaults.expect]
wpl/、oml/:规则与对象模型data/:运行输出(data/out_dat/、data/logs/等;初始化后生成)case_verify.sh:端到端校验脚本
默认期望(defaults.expect)
在 sink/defaults.toml 中设置默认组级期望(示例):
[defaults.expect]
basis = "total_input" # 以总输入作为分母校验比例
min_samples = 1
mode = "warn"
- 固定组(default/miss/residue/intercept/error)与
monitor组若未显式设置[group.expect],会继承该默认值。 - 若某个组需要自定义期望,可在该组下声明
[group.expect]覆盖默认。 - 每个 sink 的单项约束在
[group.sinks.expect]下配置:- 目标区间:
ratio + tol(表示ratio±tol) - 上下限:
min/max
- 目标区间:
过滤型业务组(示例)
- 业务组定义:
sink/filter/sink.toml - 过滤规则:
sink/filter/filter.conf(命中条件) - 常见做法:
- 主路径 sink(例如
all.dat)不设置 ratio,仅设置其他路径的上限max或设置sum_tol控制多个 ratio 的和 - 安全路径 sink(例如
safe.dat)设置较高的min,确保大部分样本进入安全路径 - 错误/残留路径设置
max,避免过高比例
- 主路径 sink(例如
快速使用
在仓库根目录构建:
cargo build --workspace --all-features
在用例目录统计/校验:
cd usecase/core/sink_filter
# 统计源与 sink(文本/JSON)
../../../target/debug/wproj stat file
../../../target/debug/wproj stat file --json
# 离线校验(文本/JSON)
../../../target/debug/wproj validate sink-file
../../../target/debug/wproj validate sink-file --json
校验提示策略(WARN)
- 当组级分母为 0(无样本)或小于
min_samples时,校验会忽略该组,但打印 WARN 提示;仅ERROR/PANIC会导致 FAIL。
端到端脚本(可选)
如需完整跑一遍生成/过滤/校验流程,可执行:
./case_verify.sh
脚本会执行构建、生成样本、启动服务与校验。若你只需要离线校验与统计,可以直接使用 wproj stat/validate。
建议:新增业务组时,统一在 sink/defaults.toml 维护 [defaults.expect],各组仅在确需与默认不同的场景下覆盖组级 expect;对单个 sink 的比例约束,请放在 [group.sinks.expect] 下设置。
中断与恢复
本用例演示 sink 中断与恢复流程:当业务 sink 写入失败时,数据会落入 rescue/ 目录;随后通过恢复流程(wprescue daemon)将救急文件回放到原目标 sink。
核心要点:
- 使用
test_rescue作为业务 sink 的后端,周期性切换可用性(约每 2 秒一次)。 - 中断阶段产生的救急文件命名形如:
<sink_name>-YYYY-MM-DD_HH:MM:SS.dat.lock;句柄释放时去掉.lock才可参与恢复。 - 恢复阶段扫描
rescue/*.dat(不含.lock),按时间顺序取最新一个文件回放,并在成功后删除该文件。
目录结构(关键项)
usecase/core/sink_recovery/conf/wparse.toml:工作目录、速率、日志、命令通道等基础配置(rescue_root = "./data/rescue")。usecase/core/sink_recovery/conf/wpsrc.toml:文件源(v2)读取./data/in_dat/gen.dat(默认)。usecase/core/sink_recovery/sink/infra.d/:基础组(default/miss/residue/intercept/error/monitor)。usecase/core/sink_recovery/sink/business.d/benchmark.toml:业务组benchmark,目标test_rescue,用于触发中断与救急文件。usecase/core/sink_recovery/case_interrupt.sh:中断阶段 e2e 脚本(生成数据 -> 启动解析 -> 观察 rescue)。usecase/core/sink_recovery/case_recovery.sh:恢复阶段 e2e 脚本(启动wprescue work-> 回放 rescue -> 校验)。
快速开始
- 中断阶段(生成救急文件)
- 进入用例目录并运行:
usecase/core/sink_recovery/case_interrupt.sh - 该脚本会:
- 预构建并初始化配置;
- 通过
wpgen sample生成 10000 行样本到./data/in_dat/gen.dat; - 启动
wparse daemon;benchmark组使用test_rescue后端,周期性中断触发救急写入; - 结束时打印
rescue/下的.dat文件及wproj stat file汇总。
- 期望:
rescue/目录出现至少一个benchmark_file_sink-*.dat文件。
- 恢复阶段(回放救急文件)
- 在同一目录运行:
usecase/core/sink_recovery/case_recovery.sh - 该脚本会:
- 启动
wprescue daemon --stat 100进入恢复模式; - 等待片刻并发送 USR1 信号优雅结束;
- 列出
rescue/、输出wproj stat file和一致性校验wproj validate sink-file -v。
- 启动
- 期望:
rescue/中的.dat文件被消费并删除;- sinks v2 下对应文件计数增加(例如
data/out_dat/benchmark.dat、data/out_dat/default.dat等)。
参考日志(logs/wprescue.log):
recover begin
recover file: ./data/rescue/benchmark_file_sink-2025-10-04_01:59:24.dat
recover begin! file : ./data/rescue/benchmark_file_sink-2025-10-04_01:59:24.dat
recover end! clean file : ./data/rescue/benchmark_file_sink-2025-10-04_01:59:24.dat
recover end
运行原理
-
中断写入与救急文件
- 业务 sink 后端为
test_rescue(见usecase/core/sink_recovery/sink/benchmark/sink.toml),通过代理定时切换健康状态; - 写入失败时,
SinkRuntime切换到备份写出(rescue),创建rescue/<sink>-YYYY-MM-DD_HH:MM:SS.dat.lock,释放句柄后重命名为.dat; - 相关实现:
- 备份切换:
src/sinks/runtime/manager.rs:120及use_back_sink/swap_back; - 文件锁/解锁:
src/sinks/backends/file.rs(.lock后缀在 Drop/stop 时去除)。
- 备份切换:
- 业务 sink 后端为
-
恢复回放
ActCovPicker周期扫描rescue/*.dat,按名称中的时间排序取最新文件;- 由文件名前缀解析 sink 名称(
get_sink_name),通过SinkRouteAgent.get_sink_agent找到对应 sink 通道; - 将每一行作为
Raw数据发送到该 sink;数据库类后端(Mysql/ClickHouse/Elasticsearch)会走to_tdc(当前为 TODO 示例); - 成功读取完文件后删除
.dat并更新检查点(断点记录rescue/recover.lock)。 - 相关实现:
src/services/collector/recovery/mod.rs。
排错建议
- 统计为 0 或无数据写入:
- 确认
rescue/存在.dat(非.lock)文件; - 确认
wprescue daemon的工作目录与用例一致(conf/wparse.toml的rescue_root为./data/rescue); - 确认业务 sink 名称与救急文件前缀一致(
benchmark_file_sink-*.dat对应[[sink_group.sinks]].name = "benchmark_file_sink"); - 如需查看恢复流程细节,查看
logs/wprescue.log中的recover关键字。
- 确认
可调参数
conf/wparse.toml:speed_limit控制恢复读取速率(每秒行数上限)。rescue_root控制救急目录。
- 脚本环境变量:
LINE_CNT、STAT_SEC可通过导出覆盖(详见脚本中默认值)。
相关文件与命令
- 运行脚本:
usecase/core/sink_recovery/case_interrupt.shusecase/core/sink_recovery/case_recovery.sh
- 核心日志:
usecase/core/sink_recovery/logs/wprescue.log - 校验工具:
wproj stat file统计 sinks 输出行数wproj validate sink-file -v校验期望配置/占比
测试完整性与健壮性建议
为保证恢复链路在不同环境、边界条件下稳定可用,建议补充如下用例与核验点:
-
场景覆盖
- 多救急文件顺序回放:在
rescue/下造多个<sink>-YYYY-MM-DD_HH:MM:SS.dat,确认按时间排序仅回放最新一个,且文件成功删除。 .lock与.dat共存:确认.lock被忽略,仅.dat参与恢复;强杀写入进程后残留.lock不影响恢复。- 空文件/空行:当前恢复读取逐行发送,建议保证救急文件无空行(与代码注释一致),并在工具侧对空行做显式跳过或报警。
- 名称不匹配:当文件前缀与 sink 名称不一致时(
get_sink_name解析),应记录错误日志并跳过;建议添加该负例用例。
- 多救急文件顺序回放:在
-
断点续传与幂等
- 中途中止
wprescue work(如kill -USR1或SIGINT),再次启动后应从rescue/recover.lock记录点续传,且已处理文件不重复回放。 - 连续执行
case_recovery.sh多次,目标 sink 的行数不应无限增长(不存在重复消费)。
- 中途中止
-
性能与压力
- 调整
conf/wparse.toml的speed_limit:分别测试低速(如 10)、高速(如 1e6)和默认值,观察吞吐、CPU、I/O。 - 大文件恢复:准备 10^5~10^6 行救急文件,验证内存占用、指标发送与最终文件删除的及时性。
- 调整
-
故障注入与恢复
test_rescue阶段错位:拉长或缩短切换周期,观察备份切换与ActMaintainer重连行为是否符合预期(warn_sink! reconnect日志)。- 目标 sink 短暂不可用:在恢复过程中手动切断写入(如文件权限只读/目录不可写),确认:失败记账、重试、最终回退策略符合鲁棒性策略(Throw/Tolerant/FixRetry 等)。
-
期望校验(expect)
-
在
sink/defaults.toml的[defaults.expect]设置min_samples/sum_tol/others_max等参数,wproj validate sink-file -v观察是否给出清晰证据(denom/ratio/lines)。- 在业务
sink.toml对单个 sink 配置[[sinks]].expect(如ratio/tol),校验实际占比是否在容差内。
- 在业务
-
观测与日志
- 将
log_conf.level临时提升至debug,grep 关键字recover begin|recover file|recover end|reconnect success,形成问题定位基线。 - 校验 monitor 指标是否随恢复进度变化(
SinkStat/pick_stat)。
- 将
-
兼容性与路径
- 确认
rescue_root、sink_root、out/等目录在不同平台(Linux/macOS)下权限与路径分隔符无差异问题。 - 业务 sink 名称与救急文件前缀严格一致(例如
benchmark_file_sink),避免路由失败。
- 确认
-
后续改进点(建议)
to_tdc(数据库类后端的 TDC 转换)当前为 TODO,补齐实现后应新增单元/集成测试验证 SQL/批量写入逻辑。- 将
test_rescue的阶段时长暴露为环境变量,便于在 CI 中构造确定性时序。 - 在 CI 中串行执行
case_interrupt.sh→case_recovery.sh,并收集wprescue.log、wproj validate结果作为工件。
TCP Roundtrip
目标:演示通用 TCP 输入/输出的端到端链路。
- wpgen:通过
connect = "tcp_sink"将样本数据推送到本机端口 - wparse:启用
tcp_src源监听同一端口,落地到文件 sink
步骤
- 启动解析器
wparse deamon --stat 5
- 生成数据(推送到 TCP)
wpgen sample -n 10000 --stat 5
- 停止解析器并校验
wproj stat sink-file
wproj validate sink-file -v --input-cnt 10000
关键文件
- conf/wparse.toml:主配置(sources/sinks/model 路径)
- models/sources/wpsrc.toml:source 列表(包含
tcp_src) - conf/wpgen.toml:生成器配置(输出
tcp_sink到本机端口)
wpl_missing
本用例演示“WPL 字段缺失容错“的场景:当输入数据中某些字段不存在或解析失败时,系统如何处理缺失字段并将数据路由到相应的基础组(miss)。适用于验证 WPL 规则的容错性与数据完整性校验。
目录结构
conf/:配置目录conf/wparse.toml:主配置
models/:规则与路由models/wpl/benchmark/:WPL 解析规则parse.wpl:解析规则gen_rule.wpl:生成规则(包含缺失字段的样本)
models/sinks/business.d/:业务路由models/sinks/infra.d/:基础组(含 miss 组)models/sources/wpsrc.toml:源配置
data/:运行数据目录
WPL 容错机制
可选字段语法
在 WPL 规则中,使用 \| 标记可选字段:
package /benchmark {
rule benchmark_1 {
(digit:id, digit:len, time, sn, chars:dev_name\|, ...)
}
}
缺失字段处理
- 必需字段缺失:整条记录路由到
miss基础组 - 可选字段缺失:记录继续解析,缺失字段为空值
- 解析失败:记录路由到
residue或error基础组
解析规则示例
parse.wpl
package /benchmark {
rule benchmark_1 {
(digit:id, digit:len, time, sn, chars:dev_name, time, kv, sn,
chars:dev_name, time, time, ip, kv, chars, kv, kv, chars, kv, kv,
chars, chars, ip, chars, http/request<[,]>, http/agent")\,
}
rule benchmark_2 {
(ip:src_ip, digit:port, chars:dev_name, ip:dst_ip, digit:port,
time", kv, kv, sn, kv, ip, kv, chars, kv, sn, kv, kv, time, chars,
time, sn, kv, chars, chars, ip, chars, http/request", http/agent")\,
}
}
快速使用
构建项目
cargo build --workspace --all-features
运行用例
cd core/wpl_missing
./run.sh
脚本执行流程:
- 初始化环境与配置
- 使用 wpgen 生成包含缺失字段的样本数据
- 运行 wparse 批处理解析
- 校验输出统计(验证 miss 组有数据)
手动执行
# 初始化配置
wproj check
wproj data clean
wpgen data clean
# 生成样本数据
wpgen sample -n 1000
# 运行批处理解析
wparse batch --stat 2 -p
# 校验输出
wproj data stat
wproj data validate
可调参数
LINE_CNT:生成行数(默认 1000)STAT_SEC:统计间隔秒数(默认 2)
基础组说明
| 组名 | 用途 | 预期行为 |
|---|---|---|
| default | 默认输出 | 未路由到业务组的数据 |
| miss | 缺失字段 | 必需字段缺失的数据 |
| residue | 残留数据 | 部分解析成功的数据 |
| error | 错误数据 | 处理出错的数据 |
| monitor | 监控指标 | 系统指标输出 |
期望配置
在 models/sinks/defaults.toml 中设置期望:
[defaults.expect]
basis = "total_input"
min_samples = 1
mode = "warn"
对于 miss 组,可以设置合理的上限:
# models/sinks/infra.d/miss.toml
[[sink_group]]
name = "/sink/infra/miss"
[sink_group.expect]
max = 0.1 # 缺失数据不超过 10%
常见问题
Q1: miss 组数据过多
- 检查 WPL 规则是否与输入数据格式匹配
- 确认必需字段在输入数据中存在
- 考虑将某些字段改为可选(添加
\|标记)
Q2: 如何区分 miss 和 residue
- miss:必需字段缺失导致规则无法匹配
- residue:规则部分匹配但有残留内容
Q3: 可选字段默认值
- 可选字段缺失时默认为空值
- 可在 OML 中使用
take(option:[field])处理
相关文档
wpl_pipe
本用例演示“WPL 管道预处理“的场景:在正式解析前,通过管道操作对输入数据进行预处理(如 Base64 解码、引号转义还原等),然后再进行 JSON 或其他格式的解析。适用于处理编码、转义等复杂格式的日志数据。
目录结构
conf/:配置目录conf/wparse.toml:主配置
models/:规则与路由models/wpl/pipe_demo/:管道处理规则parse.wpl:解析规则(含管道预处理)
models/sinks/business.d/:业务路由models/sinks/infra.d/:基础组models/sources/wpsrc.toml:源配置
data/:运行数据目录
WPL 管道语法
管道操作符
在规则开头使用 |操作| 定义预处理管道:
rule example {
|操作1|操作2|...|( 解析规则 )
}
常用管道操作
decode/base64:Base64 解码unquote/unescape:去除外层引号并还原转义字符trim:去除首尾空白
解析规则示例
parse.wpl
package /pipe_demo {
#[copy_raw(name : "_origin")]
rule fmt_from_quote {
// 输入: "{ \"a\": 1, \"b\": \"foo\" }"
// 1) 去除外层引号并还原内部转义引号
// 2) 解析根级 JSON 为字段
|unquote/unescape|(json(_@_origin))
}
#[copy_raw(name : "_origin")]
rule fmt_from_base64 {
// 输入: base64("{ \"a\": 2, \"b\": \"bar\" }")
// 1) Base64 解码
// 2) 去除外层引号并还原转义
// 3) 解析 JSON 为字段
|decode/base64|unquote/unescape|(json(_@_origin))
}
}
处理流程
- 输入:
"eyJhIjogMX0="(Base64 编码的{"a": 1}) - decode/base64:
{"a": 1} - unquote/unescape:
{"a": 1}(如有引号包裹则去除) - json解析:提取
a=1
快速使用
构建项目
cargo build --workspace --all-features
运行用例
cd core/wpl_pipe
./run.sh
脚本执行流程:
- 初始化环境与配置
- 生成 Base64/转义格式的样本数据
- 运行 wparse 批处理解析
- 校验输出统计
手动执行
# 初始化配置
wproj check
wproj data clean
wpgen data clean
# 生成样本数据(Base64+引号转义 JSON)
wpgen sample -n 1000 --stat 2
# 运行批处理解析
wparse batch --stat 2 -S 1 -p -n 1000
# 校验输出
wproj data stat
wproj data validate
可调参数
LINE_CNT:生成行数(默认 1000)STAT_SEC:统计间隔秒数(默认 2)
管道操作详解
decode/base64
将 Base64 编码的字符串解码为原始内容:
输入: eyJhIjogMX0=
输出: {"a": 1}
unquote/unescape
处理带引号和转义的字符串:
输入: "{ \"a\": 1, \"b\": \"hello\" }"
输出: { "a": 1, "b": "hello" }
转义字符处理:
\"→"\\→\\n→ 换行\t→ 制表符
组合使用
多个管道操作从左到右依次执行:
|decode/base64|unquote/unescape|(...)
注解说明
copy_raw
#[copy_raw(name : "_origin")] 注解用于保留原始输入:
- 将原始输入复制到
_origin字段 - 便于后续审计或调试
常见问题
Q1: Base64 解码失败
- 确认输入是有效的 Base64 编码
- 检查是否有 URL 安全 Base64(需要不同的解码器)
- 查看
data/logs/wparse.log中的错误信息
Q2: 转义还原不完整
- 确认转义格式与
unquote/unescape支持的格式一致 - 某些特殊转义可能需要自定义处理
Q3: 管道顺序错误
- 管道从左到右执行
- 先解码(decode)再去引号(unquote)
相关文档
wpl_success
本用例演示“WPL 成功解析全链路“的场景:验证 WPL 规则能够成功解析多种安全告警日志格式(webids_alert、webshell_alert、ips_alert、ioc_alert、system、audit 等),并正确路由到业务 sink。适用于验证解析规则的正确性与完整性。
目录结构
conf/:配置目录conf/wparse.toml:主配置
models/:规则与路由models/wpl/qty_alert/:安全告警解析规则parse.wpl:多种告警类型的解析规则
models/oml/:OML 转换模型models/sinks/business.d/:业务路由models/sinks/infra.d/:基础组models/sources/wpsrc.toml:源配置
data/:运行数据目录out/:输出目录
支持的告警类型
解析规则 (models/wpl/qty_alert/parse.wpl)
本用例支持以下安全告警类型:
| 告警类型 | data_type 标签 | 说明 |
|---|---|---|
| webids_alert | webids_alert | Web 入侵检测告警 |
| webshell_alert | webshell_alert | Webshell 检测告警 |
| ips_alert | ips_alert | 入侵防护系统告警 |
| ioc_alert | ioc_alert | 威胁情报告警 |
| system | system | 系统日志 |
| audit | audit | 审计日志 |
规则示例
package /qty {
#[tag(data_type: "webids_alert")]
rule webids_alert {
(symbol(webids_alert), chars:serialno, chars:rule_id, chars:rule_name,
time_timestamp:write_date, chars:vuln_type, ip:sip, digit:sport,
ip:dip, digit:dport, digit:severity, chars:host, chars:parameter,
chars:uri, chars:filename, chars:referer, chars:method, chars:vuln_desc,
time:public_date, chars:vuln_harm, chars:solution, chars:confidence,
chars:victim_type, chars:attack_flag, chars:attacker, chars:victim,
digit:attack_result, chars:kill_chain, chars:code_language,
time:loop_public_date, chars:rule_version, chars:xff, chars:vlan_id,
chars:vxlan_id)\|\!
}
#[tag(data_type: "audit")]
rule audit {
(kv(chars@username), kv(chars@serialno), kv(chars@submod),
kv(chars@detail), kv(time@updatetime), kv(ip@ip), kv(chars@sub2),
kv(chars@log_type), kv(chars@module), kv(digit@sub_type))\|\!
}
// ... 更多规则
}
规则注解
#[tag(data_type: "...")]:为解析结果添加数据类型标签,用于后续路由分发
快速使用
构建项目
cargo build --workspace --all-features
运行用例
cd core/wpl_success
./run.sh
脚本执行流程:
- 初始化环境与配置
- 使用 wpgen 生成多种告警类型的样本数据
- 验证输入文件存在
- 运行 wparse 批处理解析
- 校验输出统计与期望
手动执行
# 初始化配置
wproj check
wproj data clean
wpgen data clean
# 生成样本数据
wpgen sample -n 3000 --stat 3
# 验证输入文件
test -s "./data/in_dat/gen.dat" || echo "missing input file"
# 运行批处理解析
wparse batch --stat 3 -p -n 3000
# 校验输出
wproj data stat
wproj data validate
可调参数
LINE_CNT:生成行数(默认 3000)STAT_SEC:统计间隔秒数(默认 3)
期望配置
成功解析期望
本用例的目标是验证解析成功率,期望配置示例:
[defaults.expect]
basis = "total_input"
min_samples = 100
mode = "warn"
# 业务组期望高成功率
[sink_group.expect]
ratio = 0.95 # 期望 95% 的数据成功解析
tol = 0.05 # 容差 ±5%
基础组期望
# miss 组期望较低
[sink_group.expect]
max = 0.05 # 缺失数据不超过 5%
# error 组期望为 0
[sink_group.expect]
max = 0.01 # 错误数据不超过 1%
字段提取说明
必需字段(无 \| 标记)
缺失时整条记录进入 miss 组
可选字段(带 \|! 标记)
缺失时记录继续解析,字段为空
KV 格式解析
kv(chars@username) # 解析 key=value 格式,提取 username
kv(time@updatetime) # 解析 key=value 格式,提取时间类型的 updatetime
常见问题
Q1: 解析成功率低
- 检查样本数据格式是否与 WPL 规则匹配
- 确认字段分隔符与规则定义一致
- 查看
data/logs/wparse.log中的解析错误
Q2: 某种告警类型未匹配
- 确认告警类型前缀正确(如
symbol(webids_alert)) - 检查字段数量与顺序是否一致
Q3: 数据标签未生效
- 确认规则注解格式正确:
#[tag(data_type: "...")] - 确认 OML/Sink 路由配置使用了对应标签
相关文档
extension connector
doris 使用说明
本目录提供一套 File Source → Doris Stream Load 的端到端示例,用来验证 WarpParse 在离线文件解析后写入 Doris 的链路是否按预期工作。
- 采集端:
wpgen生成样例日志,落盘到data/in_dat/gen.dat - 引擎端:
wparse batch读取文件 Source,按照 WPL/OML 解析映射 - 写入端:
doris_sink通过 Stream Load 将结果写入 Doris,同时保留 prototext 文件用于校验
数据流图
flowchart LR
subgraph Storage
FILE["gen.dat<br/>(wpgen 生成文件)"]
end
subgraph Engine
WPARSE["wparse batch<br/>(File Source)"]
OML["OML 映射<br/>(models/oml)"]
SINKS{{"Sink Group<br/>(models/sink)"}}
end
subgraph Doris
DORIS[(wp_test.events_parsed)]
end
FILE -- consume --> WPARSE
WPARSE -- route --> OML --> SINKS
SINKS -- Stream Load --> DORIS
如渲染不支持 Mermaid,可参考 ASCII 版:
wpgen(sample) --> gen.dat --> wparse(batch+file_src) --> [OML/route] --> sinks{file_proto,doris_stream_load}
sinks --> Doris: wp_test.events_parsed
目录结构
conf/wpgen.toml:样例生成配置,可调数量/速率wparse.toml:引擎主配置(模型目录、拓扑、并发、日志等)
topology/sources/wpsrc.toml:File Source 监听./data/in_dat/gen.datsinks/business.d/example.toml:Sink 组,既输出 prototext,也写 Doris
models/:wpl解析规则与oml字段映射(models/oml/benchmark2/adm.oml等)data/:样例输入、输出、日志(run.sh会自动清理/复用)run.sh:一键脚本,负责生成数据、执行 wparse、统计校验与 Doris 查询
说明:Source/Sink 连接器均引用仓库根目录 connectors/ 中的定义:
connectors/source.d/10-file.toml(id=file_src,允许覆写base/file/encode)connectors/sink.d/50-doris.toml(id=doris_sink,允许覆写endpoint/database/table/mapping)
前置要求
- 已安装并配置
wproj、wpgen、wparseCLI - 可用的 Doris 集群,可通过
facilities/doris/start-doris.sh启动单机 FE/BE
快速开始
- 创建doris集群
sh ./facilities/doris/start-doris.sh
- 解析日志
cd extensions/doris
./run.sh # 默认 debug 模式
- 查看内容
- 进入:
http://localhost:8030/Playground/result/wp_test-events_parsed页面 - 执行查询语句:
select * from events_parsed
脚本步骤:
wproj check→wproj data clean→wpgen data clean,保证目录干净- 使用
wpgen rule生成LINE_CNT条样例文件(默认data/in_dat/gen.dat) - 执行
wparse batch --stat 2 -S 1 -p从 File Source 解析 wproj data stat&wproj data validate --input-cnt LINE_CNT校验输出
常用环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
LINE_CNT | 5000 | 每次生成/处理的样本数量 |
STAT_SEC | 3 | wpgen/wparse 统计间隔 |
DATA_FILE | ./data/in_dat/gen.dat | File Source 读取路径 |
DORIS_HOST / DORIS_PORT | 127.0.0.1 / 9030 | Doris MySQL 接入地址 |
DORIS_DB / DORIS_TABLE | wp_test / events_parsed | Doris 库表名 |
DORIS_USER / DORIS_PASSWORD | root / 空 | Doris 账号信息 |
示例:
LINE_CNT=20000 STAT_SEC=5 \
DORIS_DB=doris_demo DORIS_TABLE=log_events \
DORIS_HOST=docker.for.mac.localhost DORIS_PASSWORD=secret ./run.sh
配置说明
[[sink_group.sinks]]
name = "doris_stream_load"
connect = "doris_sink"
[sink_group.sinks.params]
endpoint = "mysql://localhost:9030?charset=utf8mb4&connect_timeout=10"
database = "wp_test"
table = "events_parsed"
user = "root"
password = ""
pool_size = 4
batch_size = 2048
# create_table = """..."""
关键字段说明:
endpoint:Stream Load 所使用的 Doris FE MySQL 访问地址(支持多参)database/table:目标库表,需与 Doris 实际对象一致user/password:Doris 登录信息,支持空密码pool_size:连接池大小(默认 4),可按写入并发调大batch_size:单批写入的事件数量,建议与 Doris 负载、超时时间匹配create_table:可选的建表 SQL,库中不存在时自动执行
常见问题
- Doris 连接失败:确认
endpoint地址可访问,用户/密码正确,FE 已开启 MySQL 接口 - 权限不足:需要为 Doris 账号授予
SELECT/INSERT,以及 Stream Load 所需的LOAD权限 - 字段不匹配:检查
models/oml和 Doris 表结构,必要时通过 oml 调整顺序/命名 - 文件找不到:确保
DATA_FILE路径与topology/sources/wpsrc.toml一致,或重新运行脚本生成样例
完成以上配置即可在本地快速验证 File→Doris Stream Load 的完整链路。欢迎按需扩展模型、字段或接入真实数据。
Kafka
本目录提供一套基于 Kafka 的端到端校验用例,验证统一 Kafka Source/Sink 连接器是否按预期工作。
- 发送端:
wpgen将样例数据写入 Kafka(输入 topic,默认wp.testcase.events.raw) - 引擎端:
wparse读取 Kafka 输入,解析并路由到多个 Sink(其中包含 Kafka 输出 topic,默认wp.testcase.events.parsed,以及一个文件型 Sink) - 可选校验:使用
wpkit kafka consume验证 Kafka 输出 topic 的消息
数据流图
下图展示 testcase 的数据流与关键环节(wp.testcase.events.raw/wp.testcase.events.parsed)。
flowchart LR
subgraph Producer
WPGEN[wpgen sample]\n(按 wpgen.toml 写 Kafka)
end
subgraph Kafka
KAFKA_IN[(KAFKA_INPUT_TOPIC)]
KAFKA_OUT[(KAFKA_OUTPUT_TOPIC)]
end
subgraph Engine
WPARSE[wparse batch\n(-n 限制条数自动退出)]
SINKS{{Sink Group\n(models/sink)}}
OML[OML 映射/脱敏]
end
subgraph Verifier
FILE[file sink: events.parsed.prototext]
CONSUME[wpkit kafka consume\n(可选验证)]
end
WPGEN -- produce --> KAFKA_IN
WPARSE -- consume --> KAFKA_IN
WPARSE -- route --> OML --> SINKS
SINKS -- write --> FILE
SINKS -- produce --> KAFKA_OUT
CONSUME -- verify --> KAFKA_OUT
如渲染不支持 Mermaid,可参考 ASCII 版:
wpgen(sample) --> Kafka(KAFKA_INPUT_TOPIC) --> wparse(batch) --> [OML/route] --> sinks{file,kafka}
sinks --> file: data/out_dat/events.parsed.prototext
sinks --> Kafka(KAFKA_OUTPUT_TOPIC) --> (optional) wpkit kafka consume 验证
目录结构
conf/wparse.toml:引擎主配置(目录/并发/日志等)wpgen.toml:数据生成器配置(已指向 Kafka sink,并覆写输入 topic)
topology/source/wpsrc.toml:Source 路由(包含两个[[sources]]:kafka_input订阅输入 topic;kafka_output_tap订阅输出 topic,用于自测/演示,可按需关闭)topology/sink/business.d/example.toml:业务 Sink 路由(包含一个文件型 sink 与一个 Kafka sink)models/oml/...:OML 模型(结果字段映射/脱敏)case_verify.sh:一键校验脚本(启动wparse→wpgen发送 → 校验)
说明:Source 与 Sink 连接器 id 引用仓库根目录 connectors/ 下的定义:
connectors/source.d/30-kafka.toml:id=kafka_src(允许覆写topic/group_id/config)connectors/sink.d/30-kafka.toml:id=kafka_sink(允许覆写topic/config/num_partitions/replication/brokers/fmt)
前置要求
- 本机已启动 Kafka,默认地址
localhost:9092(或通过环境变量覆盖,见下文)
快速开始
进入用例目录并运行脚本(默认 debug):
cd extensions/wp-connectors/testcase
./case_verify.sh # 或 ./case_verify.sh release
脚本主要步骤:
- 清理运行目录(保留
conf/模板)并构建二进制到target/<profile>,加入PATH wpkit conf check进行配置自检;清理数据目录- 后台启动
wparse(-n限制处理条数,完成后自动退出) - 执行
wpgen sample生成样例数据并写入 Kafka 输入 topic - 等待
wparse退出并进行文件型 sink 校验(可选)
运行参数
脚本支持以下可选环境变量:
PROFILE:构建与运行的 profile(debug|release),默认debugLINE_CNT:生成/处理的样例条数,默认3000STAT_SEC:统计打印间隔(秒),默认3KAFKA_BOOTSTRAP_SERVERS:Kafka 地址,默认localhost:9092KAFKA_INPUT_TOPIC:输入 topic(wpgen写入、wparse消费),默认wp.testcase.events.rawKAFKA_OUTPUT_TOPIC:输出 topic(wparse的 Kafka sink 写入),默认wp.testcase.events.parsed
示例:
KAFKA_BOOTSTRAP_SERVERS=127.0.0.1:9092 KAFKA_INPUT_TOPIC=my_in KAFKA_OUTPUT_TOPIC=my_out ./case_verify.sh
结果验证
- 文件型 Sink:脚本会执行
wpkit stat file与wpkit validate sink-file -v,在data/out_dat/下可见events.parsed.prototext(按models/sink/business.d/example.toml的文件型 sink 配置) - Kafka 输出:可选执行以下命令查看输出 topic(建议使用全新 group,以免被其他消费者读走)
wpkit kafka consume --brokers ${KAFKA_BOOTSTRAP_SERVERS:-localhost:9092} \
--group wpkit-consume-$$ \
--topic "${KAFKA_OUTPUT_TOPIC:-wp.testcase.events.parsed}"
Readme
示例介绍
本示例是一个基于实践场景下的用例。该场景包括了日志收集、解析、入多个库、监控,上面是该用例的示意图。

- wpgen定期向文件、fluent-bit TCP、Kafka发送数据,模拟日志来源。
- fluent-bit收集文件日志、监听5170端口,将日志转发到wparse做解析。
- wparse监听TCP和Kafka,将接收各类日志进行解析和分类,并根据日志类型(目前只有nginx)转发到不同的输出源,如kafka、文件、vlogs。
部署结构

可以使用vlogs进行查看:各类日志Vlog地址
查询kafka输入的日志
查询TCP输入的日志

监控
本例子使用Victoria-metrics对fluent-bit、kafka、以及wparse几个关键组件的监控。外部可以使用grafana进行监控:相关链接

wp-monitor监控
wp-monitor是我司自研的一款基于系统结构的指标展示组件,链接:http://106.55.164.250:25816/wp-monitor。

grafana监控
账号:
- grafana账号:admin
- grafana密码:admin
目前我们提供了kafka和wparse的仪表盘
项目使用
前置条件:可以拉取docker-copmose中的镜像,并且镜像的CPU架构一致
方式1 手工启动(MAC推荐)
-
进入工作目录:
cd wp-examples/extensions/practice -
将fluent-bit.yml中输出地址信息改为实际的wparse地址:

-
启动docker相关组件:
docker compose up -d -
进入wparse工作目录:
cd parse-work -
启动wparse:
wparse daemon --stat 10 -p> data/logs/wparse-info.log 2>&1 & -
启动发送相关工具:
wpgen sample -c wpgen-kafka.toml --stat 10 -p > data/logs/wpgen-kafka.log 2>&1 &wpgen sample -c wpgen-tcp.toml --stat 10 -p > data/logs/wpgen-tcp.log 2>&1 &wpgen sample -c wpgen-file.toml --stat 10 -p > data/logs/wpgen-file.log 2>&1 &
方式二 一键化启动脚本
脚本依赖于nohup,一般linux会带此工具
- 进入工作目录:
cd wp-examples/extensions/practice - 将fluent-bit.yml中输出地址信息改为实际的wparse地址:

- 启动docker相关组件:
docker compose up -d - 执行:
./run.sh - 停止:
./stop.sh
MySql
本目录提供一套基于 TCP 传输的端到端 MySQL 入库用例,验证统一 TCP Source 与 MySQL Sink 连接器是否按预期工作。
- 发送端:
wpgen将样例数据通过 TCP 协议发送到指定端口(默认 19001) - 引擎端:
wparse监听 TCP 端口接收数据,解析并路由到 MySQL Sink 完成入库 - 验证端:通过 MySQL 查询验证数据是否正确入库
数据流图
下图展示 tcp_mysql 的数据流与关键环节。
flowchart LR
subgraph Producer
WPGEN["wpgen sample<br/>(按 wpgen.toml 发送 TCP 数据)"]
end
subgraph TCP
TCP_PORT[(TCP 端口<br/>19001)]
end
subgraph Engine
WPARSE["wparse daemon<br/>(监听 TCP 端口)"]
SINKS{{"Sink Group<br/>(models/sink)"}}
OML[OML 映射/脱敏]
end
subgraph Database
MYSQL[(MySQL<br/>nginx_logs 表)]
end
WPGEN -- produce --> TCP_PORT
TCP_PORT -- consume --> WPARSE
WPARSE -- route --> OML --> SINKS
SINKS -- write --> MYSQL
如渲染不支持 Mermaid,可参考 ASCII 版:
wpgen(sample) --> TCP(TCP:19001) --> wparse(daemon) --> [OML/route] --> sinks{mysql}
sinks --> MySQL: nginx_logs 表
目录结构
conf/wparse.toml:引擎主配置(目录/并发/日志等)wpgen.toml:数据生成器配置(已指向 TCP sink,并配置端口)
topology/sources/wpsrc.toml:Source 路由(包含tcp_1监听 19001 端口)topology/sinks/business.d/all.toml:业务 Sink 路由(包含 MySQL sink,配置入库字段)models/oml/nginx.oml:OML 模型(结果字段映射/脱敏)models/wpl/nginx/:WPL 解析规则与样例数据preparatory_work.sql:MySQL 表结构定义run.sh:一键运行脚本
说明:Source 与 Sink 连接器 id 引用仓库根目录 connectors/ 下的定义:
connectors/source.d/20-tcp.toml:id=tcp_src(允许覆写port/prefer_newline)connectors/sink.d/20-mysql.toml:id=mysql_sink(允许覆写table/columns/dsn等)
前置要求
- 本机已启动 MySQL,默认地址
127.0.0.1:3306(或通过环境变量覆盖,见下文) - 确保目标数据库中已创建
nginx_logs表(执行create_table.sql) - 注意自定义数据库表需要其中必要的字段
wp_event_id作为主键且为BIGINT类型
快速开始
进入用例目录并运行脚本(默认 debug):
cd extensions/tcp_mysql
./run.sh # 或 ./run.sh release
脚本主要步骤:
wproj check进行配置自检,清理数据目录- 后台启动
wparse daemon(监听 TCP 19001 端口) - 执行
wpgen sample生成样例数据并通过 TCP 发送 - 等待数据入库,停止
wparse - 执行
wproj data stat与wproj data validate进行校验
运行参数
脚本支持以下可选环境变量:
LINE_CNT:生成/处理的样例条数,默认100SPEED_MAX:最大发送速率(条/秒),默认5000
示例:
LINE_CNT=1000 SPEED_MAX=10000 ./run.sh
配置说明
wpgen.toml(数据生成器配置)
[generator]
mode = "sample"
count = 1000 # 生成样例数量
speed = 0 # 发送速率限制,0 表示不限速
parallel = 4 # 并发数
[output]
name = "gen_out"
connect = "tcp_sink"
params = { port = 19001 }
wparse.toml(引擎配置)
[models]
wpl = "./models/wpl"
oml = "./models/oml"
[topology]
sources = "./topology/sources"
sinks = "./topology/sinks"
[performance]
parse_workers = 2 # 解析并发数
rate_limit_rps = 0 # 限速,0 表示不限速
topology/sinks/business.d/all.toml(MySQL Sink 配置)
[sink_group]
name = "all"
rule = ["/*"]
parallel = 8
[[sink_group.sinks]]
name = "main"
connect = "mysql_sink"
params = {
columns = ["sip", "timestamp", "http/request", "status", "size", "referer", "http/agent", "wp_event_id"]
}
数据库准备
执行以下 SQL 创建目标表:
mysql -h 127.0.0.1 -u root -p wparse < preparatory_work.sql
或直接复制 preparatory_work.sql 内容到 MySQL 客户端执行。
结果验证
- MySQL 入库验证:连接数据库查询
nginx_logs表,确认记录数与数据内容
mysql -h 127.0.0.1 -u root -p your_database -e "SELECT COUNT(*) FROM nginx_logs; SELECT * FROM nginx_logs LIMIT 100;"
- 数据统计:
wproj data stat会输出各阶段处理统计 - 数据校验:
wproj data validate会校验输入输出数据一致性
常见问题排查
- 连接失败:确认 MySQL 服务已启动,用户有目标数据库访问权限,表已创建
- 端口冲突:确保 19001 端口未被占用,或修改
topology/sources/wpsrc.toml中的端口配置 - 无数据入库:检查
data/logs/下的日志文件,确认 TCP 连接与解析是否正常 - 字段不匹配:确认
topology/sinks/business.d/all.toml中的columns与create_table.sql表结构一致
getting_started
本用例用于“快速初始化 + 基准验证”。包含最小的源文件、基础的 sinks 组(default/miss/residue/intercept/error/monitor)以及示例业务路由(如有)。
目录结构
core/getting_started/
├── README.md # 本说明文档
├── run.sh # 一键运行脚本
├── conf/ # 配置文件目录
│ ├── wparse.toml # WarpParse 主配置
│ └── wpgen.toml # 数据生成器配置
├── models/ # 模型定义目录
│ ├── wpl/ # WPL(WarpParse Language)模型定义
│ ├── oml/ # OML(Object Mapping Language)模型定义
│ │ └── benchmark.oml # 基准测试规则
│ ├── sources/ # 数据源配置
│ │ └── wpsrc.toml # 数据源定义(文件/系统日志)
│ └── sinks/ # 数据汇配置
│ ├── defaults.toml # 默认配置
│ ├── infra.d/ # 基础设施 sinks
│ │ ├── default.toml # 默认数据汇
│ │ ├── miss.toml # 缺失数据处理
│ │ ├── residue.toml # 残留数据处理
│ │ ├── error.toml # 错误数据处理
│ │ └── monitor.toml # 监控数据处理
│ └── business.d/ # 业务 sinks
│ ├── business.toml # 业务数据处理
│ └── example/ # 示例业务处理
│ └── simple.toml # 简单示例
├── data/ # 数据目录
│ ├── in_dat/ # 输入数据目录
│ │ └── gen.dat # 生成的测试数据
│ ├── out_dat/ # 输出数据目录
│ │ ├── default.dat # 默认输出
│ │ ├── miss.dat # 缺失数据输出
│ │ ├── residue.dat # 残留数据输出
│ │ ├── error.dat # 错误数据输出
│ │ ├── monitor.dat # 监控数据输出
│ │ └── business.dat # 业务数据输出
│ ├── logs/ # 日志文件目录
│ │ ├── wparse.log # WarpParse 运行日志
│ │ └── wpgen.log # 数据生成器日志
│ └── rescue/ # 救援数据目录
│ └── *.rescue # 救援数据文件
├── .run/ # 运行时数据目录
│ ├── authority.sqlite # 权限数据库
│ └── rule_mapping.dat # 规则映射数据
├── sink.d/ # sinks 目录符号链接
└── source.d/ # sources 目录符号链接
快速开始
运行环境要求
- WarpParse 引擎(需在系统 PATH 中)
- Bash shell 环境
- 基础系统工具(awk, grep, wc 等)
运行命令
# 进入用例目录
cd usecase/core/getting_started
# 运行完整流程(默认生成 3000 条测试数据)
./run.sh
# 或指定生成的数据条数
./run.sh 5000
运行选项
run.sh 脚本支持以下参数:
- 无参数:使用默认值(生成 3000 条数据)
- 数字参数:指定生成的数据条数(如
./run.sh 5000)
执行逻辑
流程概览
run.sh 脚本执行以下主要步骤:
-
环境初始化
- 保留必要的配置文件(wparse.toml, wpgen.toml)
- 清理历史运行数据
- 创建必要的目录结构
- 设置符号链接(sink.d, source.d)
-
WarpParse 服务初始化
- 使用
wparse init初始化服务 - 创建权限数据库和规则映射
- 使用
-
配置与数据清理
- 清空输入输出数据目录
- 重置日志文件
- 清理救援数据目录
-
生成测试数据
- 使用
wpgen根据配置生成测试数据 - 默认生成 3000 条基准测试日志
- 数据保存到
data/in_dat/gen.dat
- 使用
-
验证输入数据
- 检查生成的数据条数
- 确保数据格式正确
-
执行数据处理
- 启动 WarpParse 引擎
- 加载 WPL/OML 模型
- 处理输入数据并分发到各 sinks
-
验证输出结果
- 检查各个 sinks 的输出文件
- 验证数据处理的完整性
- 统计处理结果
数据流向
输入数据 (data/in_dat/gen.dat)
↓
WarpParse 引擎
↓
┌─────────────┬─────────────┬─────────────┐
│ default │ miss │ residue │
│ sink │ sink │ sink │
└─────────────┴─────────────┴─────────────┘
┌─────────────┬─────────────┬─────────────┐
│ error │ monitor │ business │
│ sink │ sink │ sink │
└─────────────┴─────────────┴─────────────┘
关键处理节点
-
数据源处理
- 文件数据源:读取
gen.dat中的日志数据 - 系统日志源:实时接收系统日志(本例中未启用)
- 文件数据源:读取
-
OML 规则匹配
/benchmark*规则匹配特定格式的日志- 自动提取并处理数据
-
Sinks 分发
- default:正常处理的数据
- miss:未被规则匹配的数据
- residue:处理后的剩余数据
- error:处理过程中产生的错误
- monitor:性能和状态监控数据
- business:业务相关的处理结果
配置说明
主配置文件 (conf/wparse.toml)
version = "1.0"
robust = "normal"
[models]
wpl = "./models/wpl" # WPL 模型目录
oml = "./models/oml" # OML 模型目录
sources = "./models/sources" # 数据源配置目录
sinks = "./models/sinks" # 数据汇配置目录
[performance]
rate_limit_rps = 10000 # 速率限制(请求/秒)
parse_workers = 2 # 解析工作线程数
[rescue]
path = "./data/rescue" # 救援数据存储路径
[log_conf]
level = "warn,ctrl=info"
output = "File" # 日志输出方式
[stat]
window_sec = 60 # 统计窗口时间(秒)
数据生成器配置 (conf/wpgen.toml)
[generator]
mode = "rule" # 生成模式:rule 或 random
count = 1000 # 生成数据条数
speed = 1000 # 生成速度(条/秒)
parallel = 1 # 并行数
[output]
connect = "file_raw_sink" # 输出连接器
[output.params]
base = "data/in_dat" # 输出基准路径
file = "gen.dat" # 输出文件名
OML 规则示例 (models/oml/benchmark.oml)
name : /oml/benchmark
rule : /benchmark*
---
* : auto = take() ;
该规则定义了:
- name:规则的唯一标识符
- rule:匹配以
/benchmark开头的日志 - 动作:
take()表示提取并处理匹配的数据
Sinks 配置结构
每个 sink 配置文件包含:
version = "2.0"
[sink]
name = "default" # sink 名称
type = "file_raw_sink" # sink 类型
connect = "default_sink" # 连接器名称
[sink.params]
base = "data/out_dat" # 输出基准路径
file = "default.dat" # 输出文件名
数据源配置 (models/sources/wpsrc.toml)
支持两种数据源:
-
文件数据源(默认启用)
- 读取本地文件中的日志数据
- 适合批量处理场景
-
系统日志源(默认禁用)
- 实时接收系统日志
- 适合实时流处理场景
验证与故障排除
运行成功验证
运行完成后,可以通过以下方式验证是否成功:
- 输出文件统计
wproj data stat
== Sources ==
| Key | Enabled | Lines | Path | Error |
|-----------|---------|-------|-----------------------|-------|
| demo_file | Y | 3000 | ./data/in_dat/gen.dat | - |
Total enabled lines: 3000
== Sinks ==
business | business/out_kv | ././data/out_dat/demo.kv | 2000
business | /example//proto | ././data/out_dat/simple.dat | 1000
business | /example//kv | ././data/out_dat/simple.kv | 1000
business | /example//json | ././data/out_dat/simple.json | 1000
infras | default/[0] | ././data/out_dat/default.dat | 0
infras | error/[0] | ././data/out_dat/error.dat | 0
infras | miss/[0] | ././data/out_dat/miss.dat | 0
infras | monitor/[0] | ././data/out_dat/monitor.dat | 0
infras | residue/[0] | ././data/out_dat/residue.dat | 0
-
查看运行日志
# WarpParse 运行日志 tail -f data/logs/wparse.log # 数据生成器日志 tail -f data/logs/wpgen.log -
验证数据完整性
wproj data validate
wproj data validate
validate: PASS
Total input: 3000 (source=override)
| Sink | Actual | Expected | Lines/Denom | Verdict |
|-----------------|--------|-----------|-------------|---------|
| /example//proto | 0.333 | 0.33±0.02 | 1000/3000 | OK |
| /example//kv | 0.333 | 0.33±0.02 | 1000/3000 | OK |
| /example//json | 0.333 | 0.33±0.02 | 1000/3000 | OK |
| default/[0] | 0 | 0±0.02 | 0/3000 | OK |
| error/[0] | 0 | 0.01±0.02 | 0/3000 | OK |
| miss/[0] | 0 | [0 ~ 0.1] | 0/3000 | OK |
| monitor/[0] | 0 | [0 ~ 1] | 0/3000 | OK |
常见问题与解决方案
1. WarpParse 命令未找到
错误信息:wparse: command not found
解决方案:
- 确保 WarpParse 已正确安装
- 将 WarpParse 添加到系统 PATH 中
- 或使用完整路径运行
2. 权限不足
错误信息:Permission denied
解决方案:
chmod +x run.sh
chmod -R 755 data/
3. 数据生成失败
可能原因:
- wpgen 配置错误
- 磁盘空间不足
- 并发数设置过高
解决方案:
- 检查
conf/wpgen.toml配置 - 清理磁盘空间
- 降低 parallel 参数值

