Feat/AGC错误报告 #240
Reference in New Issue
Block a user
Delete Branch "feat/error-report"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
实现:
在rust内存里维护错误事件队列, webview调用tauri command传入, 后台任务agent工具等直接插入
把rust , webview console的日志统一写到AppData文件夹下的(滚动保存的)日志文件.
rust对传入的错误进行筛选,脱敏, 防抖,后通知前端提醒用户.
用户提醒是一个不阻塞的小UI, 展开后可以选择错误上报, 可以附加文字描述
上传时附带最近日志, 错误堆栈等信息
元数据存在数据库, 考虑到字符串信息很难查询, 所以在api server打包成zip存在OSS.
管理页面新增错误报告的查看页面
审查 head
7f0d4605eb9e92d01f05f0efb007d6380a5ca00b:存在一个明确的通知丢失问题。定时任务先将未通知事件标记为 notified=true,随后才通过一次性 error-report-updated 事件通知 WebView;若 WebView 尚未监听或重载错过事件,重新挂载时按 notified=false 过滤,事件将永久不再显示,用户无法上报。建议改为可重放通知或前端确认后再标记。先标记 notified 再 emit,错过事件会永久隐藏;应改为可重放或确认后标记。
Close #221
ErrorReportLogInput的导入顺序审查 head
24ab7732839aee4d3540e7ee0c039c62325a8554:本地 ack 失败会误报并导致错误报告重复提交;见 ErrorReportDialog.tsx:68。审查 head
24ab7732839aee4d3540e7ee0c039c62325a8554:提交成功后再调用markClientErrorEventsSubmitted,但 ack 失败也进入同一个 catch(ErrorReportDialog.tsx:68),界面显示“提交失败”,而服务端报告已经落库。用户再次点击提交会生成新的 submissionId,导致同一错误重复创建报告;原事件仍在本地队列。建议将服务端提交成功与本地 ack 解耦:提交成功后显示成功并关闭,ack 失败仅记录/重试;或复用稳定 submissionId。@@ -0,0 +65,4 @@logs: includeLogs ? logs : [],userDescription: description,});await markClientErrorEventsSubmitted(selectedEvents);审查 head
24ab7732839aee4d3540e7ee0c039c62325a8554:提交成功后再调用markClientErrorEventsSubmitted,但 ack 失败也进入同一个 catch(ErrorReportDialog.tsx:68),界面显示“提交失败”,而服务端报告已经落库。用户再次点击提交会生成新的 submissionId,导致同一错误重复创建报告;原事件仍在本地队列。建议将服务端提交成功与本地 ack 解耦:提交成功后显示成功并关闭,ack 失败仅记录/重试;或复用稳定 submissionId。当前 head 的行内阻塞意见(请按代码位置修复并补回归测试)。
@@ -0,0 +196,4 @@batch_id: record.batch_id,submission_id: record.submission_id,status: "ready".into(),accepted_event_ids: payload.events.into_iter().map(|e| e.event_id).collect(),[P2] 幂等命中旧记录时,响应仍使用本次请求的
payload.events生成accepted_event_ids,但持久化记录没有保存事件 ID 集或 payload 摘要。若相同 submissionId 被不同 payload 重放,客户端会 ack 未写入旧归档的事件,造成数据丢失/语义不一致。请保存并比较事件集合摘要,拒绝不一致重放,或返回原报告对应的 accepted IDs。@@ -0,0 +557,4 @@fn sanitize_report_text_with_limit(v: &str, max: usize) -> String {let l = v.to_ascii_lowercase();let normalized = l.chars()[P1] 凭据脱敏不能只依赖 ASCII 空白。这里用
is_ascii_whitespace()归一化后再查找 marker,token = secret或Authorization: Bearer secret会绕过检测,随后原文进入 ZIP/OSS。请按 Unicode whitespace/规范化处理后再匹配,并补回归测试覆盖 NBSP、EM SPACE 等输入。@@ -0,0 +137,4 @@}#[spacetimedb::procedure]pub fn create_error_report_and_return([P1] 这里把报告 user_id 写成
ctx.sender().to_hex(),但 api-server 使用的是进程级 SpacetimeClient 服务 token;Bearer JWT 中的真实用户 ID 只被拼进 idempotency_key,没有传入 procedure。因此所有用户可能共用同一个归属,且(user_id, submission_id)去重会跨用户命中并返回他人报告。请传入由认证层取得的真实用户 ID(不要信任请求体),或明确调整字段/契约以反映服务身份语义。