Files
pj_supermarket_cloud/docs/payment-latency-diagnostics.md
T
2026-10-23 15:53:43 +08:00

3.7 KiB

消费机“支付中”耗时诊断

食堂购买页面从发起“支付中”到请求关闭遮罩,为每次付款保存一条 |支付耗时| warning 摘要,其中 event:summary 表示本次付款汇总。 无需开启全量 INFO 日志,也不需要网关访问日志。安装包含本次改动的版本后才会产生这些记录。

现场取日志

  1. 正常使用消费机;出现等待时记下大概时间。
  2. 在消费机设置中导出当天日志,保留完整的付款前后记录。
  3. 按 trace 聚合同一笔付款;摘要中出现 androidOrderCode 后,可用该号匹配 hard 模块订单 SQL。

诊断日志只增加关联编号、阶段、耗时、状态码和异常类型,不增加人员资料、令牌、付款码或图片内容。

付款阶段

字段 覆盖范围
discounts 付款时重算优惠,包括优惠 HTTP、本地读取及计算
local_order_update 本地订单、购物车更新
create_order 下单整体,包括下面的准备、请求和收尾阶段
order_prepare 本地配置、订单校验及读取
evidence_bind / evidence_version 本地人脸证据任务绑定和版本读取
order_http 下单 API 完整 Future 的等待
order_reconcile 请求异常后的只读订单对账
local_payment_commit 支付结果写回本地订单
evidence_ready / evidence_cancel 本地证据任务状态更新

stagesInclusiveMs 的单位是毫秒。父阶段包含子阶段,不能直接相加。 totalMs 从开始付款追踪到调用关闭遮罩并结束追踪,不包含遮罩动画和最终帧绘制完成时间。

阶段等待满 1 秒会输出一次 event:pending;慢阶段结束输出 event:stage。 每笔付款结束均输出一条摘要,异常只记录类型。

eventLoopLagMs 是付款期间每 250ms 定时器的最大超期调度时间。 它很大时说明 Dart 事件循环未及时获得调度,可能是同步计算或进程/设备调度停顿; 它很小时不能证明 Android 主线程、GPU 或所有原生插件都正常。

HTTP 阶段

用户查询、优惠查询、下单及对账接口超过 1 秒,或返回失败时,额外输出 |支付请求耗时| warning,使用同一 trace(付款范围外的用户查询显示 -)。

字段 含义
settingsMs 拦截器读取本地鉴权配置的耗时
prepareMs 拦截器开始至交给 HTTP 适配器前的耗时,包含 settingsMs
waitMs 发出请求后至响应/错误拦截器进入,包含连接、传输、网关、服务、解码及 Dart 调度
handlerMs 响应/错误拦截器内处理耗时,包括发生时的自动登录
totalMs 从请求拦截器开始到统一响应处理结束

HTTP 摘要只记录路径,不记录查询参数、请求体、响应正文、令牌或完整 URL。 waitMs 不能解释为纯后端耗时,也不能独立拆开网络和服务端。

根据下一次日志判断

  • 本地阶段数秒、HTTP 很快:优先排查本地数据库、证据任务及其排队。
  • HTTP 等待数秒、eventLoopLagMs 很小:重点对齐同一订单的服务器记录,排查完整远程请求链路。
  • settingsMs 或 prepareMs 数秒:检查消费机本地设置读取及发出前处理。
  • handlerMs 数秒:检查响应处理、登录恢复等收尾工作。
  • eventLoopLagMs 数秒:重点排查 Dart 同步阻塞和设备/进程调度,同时结合系统日志确认原因。

本次诊断不调整扣款、重试、超时、优惠计算或证据上传顺序。支付遮罩改为在 finally 中关闭,以覆盖优惠查询或本地准备步骤意外抛错的分支。