Repository navigation
feat(trace): add history filters and improve trace workspace - #10765
Draft
mantoujun12 wants to merge 2 commits into
Draft
mantoujun12 wants to merge 2 commits into
mantoujun12 wants to merge 2 commits into
Conversation
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Tip
本 PR 主要修改了“追踪”板块,改动较多,其中包括
DashboardCore等,如果不满意可关闭。Refs #10748
内容由 AI 生成
追踪页是 AstrBot 运维人员和插件开发者排查“消息从接收、插件处理、Agent 调用到响应发送”全链路的主要入口。随着系统长时间运行,追踪历史会迅速累积到数千甚至数万条,而当前过滤器只提供“有错误”“有模型调用”“有插件调用”三个复选框,其余只能依赖关键词搜索。实际排障时,用户通常先按平台、消息类型或具体会话缩小范围,再按运行状态和时间窗口定位某一次异常,例如“最近一小时内某个 QQ 群的失败请求”或“某个私聊会话中带指令调用的追踪”。旧界面无法表达这些条件,只能反复翻页并人工比对;由于筛选条件有限,分页总数也失去了参考价值,定位一条异常链路往往需要多次搜索和翻页。
在多机器人实例共用同一追踪数据库的场景下,平台维度尤其关键:旧过滤器无法区分不同机器人实例的消息,用户只能查看所有实例混在一起的记录。消息类型(群聊/私聊)和会话 UMO 同样是最常用的定位条件,前者用于快速排除无关场景,后者用于从具体会话直接钻取到对应追踪。缺少这些条件时,搜索只能依赖消息文本或插件名命中,遇到内容相似但来源不同的记录很容易误判。
运行状态与时间范围是另一类高频需求。追踪可能处于运行中、已完成或错误状态,排障时通常只关心失败链路;历史数据按保留天数累积后,用户又往往只关心最近一小时、一天或一周。把这些条件下推到服务端执行,才能保证分页总数与当前筛选一致,也避免把整库数据拉到浏览器后再过滤。同时,实时事件流必须遵守同一套条件,否则用户已经筛选了平台或状态,新的不匹配记录仍会插入列表,造成前后数据不一致。
在窄屏和移动端,目前的宽表格只能横向滚动,列多、字号小,触控操作困难;打开详情后列表被挤占,关闭按钮和键盘焦点也不够明确。此次改动希望让追踪页在手机上同样可用:用卡片列表替代横向滚动,把详情改为全屏抽屉,并补齐触控尺寸、安全区与焦点管理,让桌面端和移动端共享同一套数据与筛选逻辑。
稳定性方面,目前实时连接在重试耗尽后仍停留在“连接中”文案,用户无法判断是网络断开还是服务异常,也没有手动恢复入口。新实现把重试次数收敛到 3 次、退避上限降到 4 秒,失败后显示明确的断线提示与重试按钮,同时保留当前列表和筛选条件,避免实时连接不可用影响历史排障。
实现上遵循最小改动原则:不新增数据库表或字段,继续基于既有追踪摘要 JSON 与 UMO 属性做 SQL 过滤,旧数据仍可读取;所有新查询参数都是可选的,省略时行为与之前一致,因此不构成破坏性变更。过滤器采用“同一分组内为或、不同分组与执行条件之间为与”的语义,既符合常见筛选习惯,也允许用户同时按平台、消息类型、状态、会话和时间窗口组合定位。最终效果是:定位异常链路所需的翻页与猜测明显减少,筛选结果、分页总数与实时列表保持一致,移动端也能完成完整的查看与排障流程。
Modifications / 改动点
本次改动由两个提交组成:
feat: add trace history filters提供后端查询能力与 OpenAPI 定义,feat(dashboard): improve trace workspace and filters完成前端过滤器、响应式布局与断线恢复。后端与 API
astrbot/core/utils/trace_store.pylist_traces()新增commands、status、platforms、message_types、umo参数并拼入 SQL 条件;校验start_time <= end_time与状态枚举;commands读取摘要中的has_commands;平台和消息类型通过json_extract取出 UMO 后按段解析,列表去重且最多取 20 个;全部条件使用参数化查询。astrbot/dashboard/api/logs.pyGET /api/v1/trace/history新增同名查询参数:status限定running/completed/error,platforms、message_types接收逗号分隔列表并去除空白,umo去除首尾空格,start_time/end_time要求非负;时间范围倒置时返回 422,其余条件透传给LogService。openspec/openapi-v1.yamlstart_time为包含端点、end_time不得早于start_time。dashboard/src/api/generated/openapi-v1/types.gen.tsListTracesData,补齐新参数的类型定义。dashboard/src/api/v1.tstraceApi.history的入参改用生成的ListTracesData["query"],避免手写类型与 OpenAPI 再次漂移。新增查询参数
commandsfalsehas_commands=1的追踪,即包含指令处理器调用。statusrunning/completed/errorrunning匹配state='running';completed匹配非运行中且has_errors=0;error匹配has_errors=1。platformsmessage_typesumostart_time/end_timestart_time <= end_time前端
dashboard/src/components/shared/TraceDisplayer.vue:过滤器面板conversationApi.filterOptions()的机器人列表,显示平台图标)、群聊/私聊多选按钮、运行状态下拉、会话 UMO 选择器(复用现有UmoSelector)、执行条件(有错误/有模型调用/有插件调用/有指令调用)以及时间范围(全部/1 小时/24 小时/7 天/30 天)。过滤器按钮显示活动条件数量,重置一次清空全部分组,提示文案说明“组内为或、组间为与”。/trace/history;搜索或任意筛选变化后 250ms 防抖、回到第 1 页并重新请求。hasActiveServerFilters同时覆盖搜索与全部筛选,实时事件只在第一页且无活动筛选时插入新追踪;已有追踪的增量更新仍会合并,并统一经过客户端条件过滤,避免筛选后列表混入不匹配记录。env(safe-area-inset-bottom)。ResizeObserver监听工作区与列表宽度:详情在可用宽度不足 1340px 时改为浮层,过滤器在不足 900px 时改为浮层;浮层带遮罩、role="dialog"/aria-modal、Tab 焦点循环、Escape 关闭与关闭后的焦点恢复,宽屏桌面仍保持左右分栏。retryConnection()重置计数并重新连接,连接恢复后清除失败状态。历史请求失败的错误条新增“刷新”按钮并复用加载状态。dashboard/src/views/TracePage.vuemax(8px, env(safe-area-inset-bottom)),窄屏为max(6px, env(safe-area-inset-bottom)),适配带手势条的移动设备。dashboard/src/i18n/locales/{zh-CN,en-US,ja-JP,ru-RU}/features/trace.jsonfilters.commands/status/anyStatus/messageTypes/umo/execution/timeRange/anyTime/lastHour/lastDay/lastWeek/lastMonth/noPlatforms、history.connectionLost、controls.connectionLost,并更新filters.hint的组合规则说明;四种语言的 key 保持一致。过滤器组合语义
search LIKE匹配消息、会话、插件等信息测试与文档
tests/unit/test_trace_store.pyhandler_category与has_commands等字段,新增对commands、status、platforms、message_types、umo过滤结果的断言。tests/test_fastapi_v1_dashboard.py/api/v1/trace/history用例,同时传入全部新增参数并断言 200、total正确;新增start_time=2&end_time=1返回 422 的用例。docs/zh/use/webui.md、docs/en/use/webui.md兼容性说明
所有新增查询参数均为可选,未传入时查询行为与改动前一致,不构成破坏性变更。
未新增数据库表或字段,继续读取既有追踪摘要与 UMO 属性;旧追踪若摘要缺少
has_commands或astrbot.umo,按指令、平台或消息类型过滤时不会被命中,但列表展示与详情查看仍沿用既有逻辑,不受影响。新增前端文案已同步四种语言,未引入新的运行时或构建依赖。
This is NOT a breaking change. / 这不是一个破坏性变更。
Screenshots or Test Results / 运行截图或测试结果
运行截图
更改后的界面如下:
过滤器菜单:
选择会话来源(单选):
过滤展示结果:
详细信息:
移动端展示:
连接断开:
重新连接:
验证步骤
/api/v1/trace/history,并验证非法时间范围返回 422。ruff check。测试结果
本次以自动化测试日志与静态检查结果作为验证证据。
.venv/Scripts/python.exe -m pytest tests/unit/test_trace_store.py -q32 passed in 4.37s.venv/Scripts/python.exe -m pytest tests/test_fastapi_v1_dashboard.py -q -k trace5 passed, 171 deselected, 1 warning in 6.31scd dashboard && pnpm exec vue-tsc --noEmitcd dashboard && pnpm i18n:checkPASS;zh-CN、en-US、ru-RU、ja-JP 均为 4376 个 leaf key,key 集完全一致.venv/Scripts/ruff.exe check .All checks passed!单元测试新增断言覆盖:
commands=True仅命中带指令处理器的追踪,结果为 1 条。status=running/completed/error分别命中 1/2/1 条,覆盖运行中、已完成和无错误结束、错误结束三种状态。platforms=["qq"]命中 4 条,platforms=["telegram"]命中 0 条。message_types=["Group"]命中 4 条,message_types=["FriendMessage"]命中 0 条。umo="qq:Group:123"精确命中 4 条。API 测试同时传入
status=completed、platforms=qq,telegram、message_types=FriendMessage、umo=qq:FriendMessage:session:user、commands=true、start_time/end_time,返回 200 且total=1;新增的倒置时间范围请求返回 422。Checklist / 检查清单
😊 If there are new features added in the PR, I have discussed it with the authors through issues/emails, etc.
/ 如果 PR 中有新加入的功能,已经通过 Issue / 邮件等方式和作者讨论过。
👀 My changes have been well-tested, and "Verification Steps" and "Screenshots" have been provided above.
/ 我的更改经过了良好的测试,并已在上方提供了“验证步骤”和“运行截图”。
📚 I checked the affected WebUI instructions and screenshots in
docs/zhanddocs/enagainst the changed navigation, page structure, and labels, and updated them in this PR (or explained why no documentation update is needed). For renamed, moved, or merged entry points, I included an old entry → new entry mapping in the documentation and changelog./ 我已对照变化后的 WebUI 入口、页面结构和术语,核对并在本 PR 中更新
docs/zh和docs/en的相关操作说明与截图(或说明无需更新文档的原因)。入口改名、移动或合并时,已在文档和 changelog 中补充 旧入口 → 新入口 对照。🤓 I have ensured that no new dependencies are introduced, OR if new dependencies are introduced, they have been added to the appropriate locations in
requirements.txtandpyproject.toml./ 我确保没有引入新依赖库,或者引入了新依赖库的同时将其添加到
requirements.txt和pyproject.toml文件相应位置。😮 My changes do not introduce malicious code.
/ 我的更改没有引入恶意代码。
Summary by Sourcery
Improve trace history investigation with richer filtering, responsive workspace behavior, and reliable live-connection recovery.
New Features:
Bug Fixes:
Enhancements:
Tests: