syzkaller Aflow 数据抽取工具:从 syzbot Dashboard 导出 Agentic Workflow 运行数据

📅 发布时间:2026/10/10 13:44:08
syzkaller Aflow 数据抽取工具:从 syzbot Dashboard 导出 Agentic Workflow 运行数据
网络安全开发工具质量保障【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/sy/syzkaller点击查看免费下载导读本文讲解 syzkaller 仓库中专门用于导出 AI/Agentic 工作流workflow运行数据的工具Aflow Data Extraction Tool。该工具从 syzbot 仪表盘Dashboard暴露的 JSON API 拉取 AI 任务列表与完整执行轨迹trajectory并将结果以结构化目录形式落盘供离线分析与优化使用。读完本文你将掌握Dashboard 侧json1接口的设计与实现位置、tools/extract_workflows.sh脚本的完整参数与执行流程、输出目录结构以及如何基于源码证据扩展这套抽取能力。背景为什么要抽取 Workflow 数据syzkaller 在 pkg/aflow 中实现了一套 Agentic 工作流执行引擎支持流程flow、动作action、Agent、工具tool等多层执行语义并依赖 LLM 完成诸如崩溃复现repro、代码审查等任务。这些工作流运行在 syzbot 云端仪表盘上每次运行都会产生一条完整的执行轨迹调用了哪些工具、各阶段输入输出、耗时与错误信息等。这些数据对离线分析和优化极具价值可以统计各工作流的成功率、定位 LLM 调用失败环节、对比不同代码版本commit下工作流行为的变化。而 Aflow Data Extraction Tool 正是为此设计——它不依赖数据库直连而是通过 Dashboard 对外暴露的 JSON 接口获取数据天然与仪表盘页面上看到的内容保持一致。Dashboard 集成json1查询参数要支持数据抽取syzbot 仪表盘在 AI 任务相关页面上增加了json1查询参数支持共两个端点AI 任务列表/{ns}/ai?json1返回该命名空间namespace下所有 AI 任务的 JSON 列表包含工作流类型、状态、代码修订版本code revision等元数据AI 任务详情/ai_job?ididjson1返回指定任务的详细信息包括完整执行轨迹由 flow、action、agent、tool 执行的 span 组成。这两个端点复用现有的writeJSONVersionOf辅助函数把内部页面数据结构直接序列化为 JSON。源码实现位置从源码看这两处实现位于 dashboard/app/ai.go任务列表页处理函数handleAIJobsPage在r.FormValue(json) 1时将组装好的uiAIJobsPage页面结构通过writeJSONVersionOf(w, page)以 JSON 形式写出ai.go#L406-L409任务详情页则通过handleAIJobPageJSON处理json1与export1两个参数json1时返回uiAIJobDetails{Job, Trajectory, Args}结构ai.go#L838-L861。writeJSONVersionOf定义在 dashboard/app/main.go#L1689-L1696func writeJSONVersionOf(writer http.ResponseWriter, page any) error { data, err : GetJSONDescrFor(page) if err ! nil { return err } _, err writer.Write(data) return err }它调用GetJSONDescrFor将任意页面结构转换为 JSON 描述再写入响应。列表页返回的核心结构uiAIJobsPage定义于 dashboard/app/ai.go#L37-L51包含Jobs任务切片、Workflows可用工作流名称、Managers可用 manager 列表以及分页游标字段任务详情结构uiAIJobDetails则定义于 ai.go#L223-L227包含任务本体、轨迹 span 列表与参数列表。任务 JSON 字段说明uiAIJob结构dashboard/app/ai.go#L255-L275定义了单个任务序列化后的字段抽取脚本直接依赖其中几个JSON 字段类型含义IDstring任务唯一 ID也是详情接口的入参Workflowstring工作流类型名称如repro、repro-cCreatedtime任务创建时间RFC3339 字符串Finishedtime任务完成时间零值0001-01-01T00:00:00Z表示尚未结束CodeRevisionstring任务运行的 syzkaller 代码修订commitAgentNamestring执行的 Agent 名称Error/ErrorSummarystring任务错误信息与摘要Correctstring正确性标记用于 review 流程Results[]*uiAIResult结构化执行结果详情接口返回的Trajectory是[]*aflowhtml.UIAITrajectorySpan切片其中的每个 span 对应一次 flow/action/agent/tool 执行记录是离线分析的核心数据。抽取脚本tools/extract_workflows.sh抽取过程由 bash 脚本自动化完成脚本位于 tools/extract_workflows.sh。脚本使用set -e任何一步失败都会立即退出便于在 CI 或批处理任务中安全使用。用法./tools/extract_workflows.sh dashboard_url commit [output_dir]参数说明dashboard_urlAI 任务列表页 URL例如http://localhost:8080/linux/aicommit一个 syzkaller commit 哈希。脚本只抽取在该 commit当天或之后按日期比较运行的工作流除非任务的CodeRevision与该 commit 完全一致这种情况即使更早也会被纳入output_dir可选抽取数据的存储目录默认extracted_workflows。脚本对参数的校验逻辑extract_workflows.sh#L11-L18URL与COMMIT缺失时打印用法并exit 1OUTPUT_DIR为空时回退为extracted_workflows。认证支持脚本支持通过环境变量ACCESS_TOKEN携带 Bearer TokenCURL_OPTS(-s -A ) if [ -n $ACCESS_TOKEN ]; then CURL_OPTS(-H Authorization: Bearer $ACCESS_TOKEN) fi也就是说curl统一使用静默模式-s并携带空 User-Agent-A 当访问需要登录的仪表盘时先导出ACCESS_TOKEN环境变量脚本会自动附加Authorization: Bearer $ACCESS_TOKEN请求头。执行流程脚本共分五步获取 commit 日期通过git log -1 --format%ct $COMMIT取得指定 commit 的时间戳Unix 秒拉取任务列表调用列表端点并附加json1。脚本会智能处理 URL 是否已含查询参数——已含?时追加json1否则追加?json1extract_workflows.sh#L28-L35过滤用jq将列表解析为 TSVID、Workflow、Created、CodeRevision 四列先剔除Finished为零值即未完成任务的行再逐行判断任务创建时间早于 commit 时间且CodeRevision与目标 commit 不一致的任务被跳过拉取详情从原始 URL 中提取协议与主机grep -oE ^https?://[^/]得到BASE_URL对每个命中任务调用/ai_job?id${ID}json1获取完整轨迹存储按工作流类型创建子目录将详情 JSON 保存为job_id.json。过滤与下载的核心循环extract_workflows.sh#L43-L66如下printf %s\n $DATA | jq -r .Jobs[] | select(.Finished ! 0001-01-01T00:00:00Z) | \(.ID)\t\(.Workflow)\t\(.Created)\t\(.CodeRevision) | while IFS$\t read -r ID WORKFLOW CREATED REVISION; do if [ -z $ID ] || [ $ID null ]; then continue fi # Convert created time to timestamp JOB_DATE$(date -d $CREATED %s) # Filter by date or exact commit match if [ $JOB_DATE -lt $COMMIT_DATE ] [ $REVISION ! $COMMIT ]; then continue fi echo Fetching details for job $ID... DETAIL_URL${BASE_URL}/ai_job?id${ID}json1 TARGET_DIR${OUTPUT_DIR}/${WORKFLOW} mkdir -p $TARGET_DIR FILE_PATH${TARGET_DIR}/${ID}.json curl ${CURL_OPTS[]} $DETAIL_URL $FILE_PATH done几点实现细节值得注意Finished零值判断0001-01-01T00:00:00Z与 Go 中time.Time的零值序列化格式一致——未完成任务在 JSON 中就是该字符串这保证了脚本只抽取已结束的工作流日期比较使用date -d $CREATED %s要求运行环境支持 GNU date 语义任务 ID 为空或为字面量null时跳过防御异常数据每个命中任务独立请求详情接口天然支持断点式增量抽取已下载的任务可通过目录内文件判断跳过。输出结构抽取结果按工作流类型分目录组织output_dir/ ├── repro/ │ ├── 12345678-1234-5678-1234-567812345678.json │ └── ... ├── repro-c/ │ ├── ... └── ...每个 JSON 文件是一次工作流运行的完整快照包含任务元数据Job、完整执行轨迹Trajectory与任务参数Args可供其他分析工具直接消费。数据的可消费性与轨迹渲染层的对应抽取出的Trajectory与仪表盘详情页实际渲染的轨迹是同一份数据。Dashboard 使用 pkg/aflow/trajectory 下的aflowhtml.RenderTrajectory将 span 渲染为 HTMLdashboard/app/ai.go#L810而 JSON 模式输出的uiAIJobDetails.Trajectory字段同样是[]*aflowhtml.UIAITrajectorySpan。这意味着离线 JSON 与线上页面看到的信息完全一致分析脚本可以直接解析 JSON 而不需要 HTML 解析。测试验证接口行为已被用例锁定Dashboard 对这两个 JSON 端点有完整的端到端测试覆盖见 dashboard/app/ai_test.go创建任务后通过c.GET(fmt.Sprintf(/ai_job?id%vjson1, resp.ID))验证响应包含Trajectory字段ai_test.go#L443-L445同时验证export1端点返回dashapi.AIJobPollResp结构ai_test.go#L448-L453在管理员与普通用户两种权限下均验证了/ai_job?id...json1的可用性ai_test.go#L1543-L1548任务列表页的?json1输出也在测试中被调用验证ai_test.go#L539。这些用例保证了 JSON 接口的字段结构稳定抽取脚本所依赖的.Jobs[]、.Finished、.Created、.CodeRevision等字段不会在 Dashboard 演进中无声变化。实操指南完整跑通一次抽取假设你有一个本地运行的 syzbot Dashboard或线上实例并按以下步骤操作确认端点可用先用浏览器或 curl 验证http://localhost:8080/linux/ai?json1返回 JSON 数组再挑一个任务 ID 验证http://localhost:8080/ai_job?ididjson1确定基线 commit进入仓库执行git log选定一个你关心的 commit 哈希作为抽取基线可选配置认证若 Dashboard 需要登录先export ACCESS_TOKENyour-token运行脚本./tools/extract_workflows.sh http://localhost:8080/linux/ai commit_hash ./wf_data脚本运行过程中会打印Fetching job list from $URL...、Processing jobs...、Fetching details for job ID...与最终的Extraction complete.提示检查结果wf_data/下应出现按工作流类型命名的子目录每个子目录内是job_id.json文件。进阶用法按工作流类型定向抽取Dashboard 列表页支持workflow查询参数对应handleAIJobsPage中的r.FormValue(workflow)见 dashboard/app/ai.go#L295可在dashboard_url后追加workflowrepro只拉取某类工作流减少数据量增量更新重复运行脚本并指定同一output_dir已存在的 JSON 文件会被覆盖更新可配合更严格的日期过滤实现增量同步离线分析对每个 JSON 文件中的Trajectoryspan 做统计如按 span 类型、时长、错误率聚合或结合Args字段还原任务的输入参数。局限与注意事项脚本依赖jq、curl、GNUdate运行环境需预装这些工具日期过滤是创建时间 commit 时间 或 CodeRevision 完全匹配并非精确的提交祖先关系判断若任务代码版本恰好早于基线但已包含目标改动可能会被过滤掉需要自行权衡抽取的是 Dashboard 页面视图的数据快照不包含数据库中的全部原始字段如内部评论、补丁版本历史等CodeRevision匹配是精确字符串比较commit 缩写形式不会命中建议使用完整 40 位哈希。总结Aflow Data Extraction Tool 通过仪表盘的json1接口与 tools/extract_workflows.sh 脚本为 syzkaller 的 Agentic 工作流提供了轻量、可脚本化的离线数据管道。它复用了页面渲染同源的数据结构uiAIJobsPage/uiAIJobDetails由writeJSONVersionOf统一序列化配合 dashboard/app/ai_test.go 的端到端测试保证接口稳定。对于想要分析工作流成功率、定位 LLM 调用失败、对比不同代码版本行为差异的开发者来说这是一条开箱即用的数据通道。赞分享网络安全开发工具质量保障【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/sy/syzkaller点击查看免费下载相关推荐syzkaller Dashboard 部署指南基于 App Engine 的 syzbot 前端syzkaller Dashboard 部署指南基于 App Engine 的 syzbot 前端 dashboard 是 syzkaller 项目中支撑 s网络安全开发工具质量保障NeoForge模组兼容性指南解决90%的常见冲突问题NeoForge模组兼容性指南解决90%的常见冲突问题 NeoForge作为基于Forge的Minecraft模组开发API为玩家提供了丰富的模组扩展功能。granite-timeseries-patchtst高级教程如何基于预训练模型微调自定义时间序列数据granite timeseries patchtst高级教程如何基于预训练模型微调自定义时间序列数据 granite timeseries patchtst上一篇2024最新版libcuckoo入门教程从安装到实战的完整指南下一篇探索 BSPWM Themes打造个性化的桌面环境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考