docs: record Logrus debug fixed-host deployment evidence

This commit is contained in:
2026-10-09 23:19:01 +08:00
parent 669f3a5868
commit 79806faaa8
2 changed files with 60 additions and 0 deletions
@@ -0,0 +1,58 @@
# Dispatcher / Agent Logrus Debug 实现与固定环境部署
## 结论与来源
- 源码 `669f3a5868a08e96029f6e76f08f7330c25f5159` 已合入并推送 `main`,远端提交号核对一致;制品来自该干净固定提交。
- 已部署登记主机 `server.sip` 的固定 `nonprod-real` 服务,两角色均启用 `--debug`,不启用 `--capture`。
- 2026-10-09 23:14–23:16 CST 现场核验,两业务服务均 `enabled+active/running`,PID 稳定、零重启,实际进程与服务命令均含 `--debug`、不含 `--capture`。
- 两个实际运行进程制品 SHA-256 相同:`c2bf4c50f19fed2842307356514da1e10cb51b8a2c2c053c1d846d12a6a33919`;部署入口校验 `artifact_hashes_match=true`。
| 服务 | PID | NRestarts | Debug | Capture |
| --- | --- | --- | --- | --- |
| Agent | 2900602 | 0 | true | false |
| Dispatcher | 2900614 | 0 | true | false |
| Asterisk | 777461 | 0 | false | false |
Asterisk PID 与部署前相同,未重启。现场 ARI 活动通道数为 0,tcpdump 进程数为 0。
## 实现与参数
- Logrus 是唯一日志输出,已有 slog/标准 log 通过同一输出记录,不建立第二套日志配置。
- 两角色 `--debug/-D` 只开启详细日志;Agent 原 Debug 抓包语义移除,外部逐通抓包凭证检查改为独立 `--capture`。独立 `sip-call` 参数未改变,仅同步其说明中对业务 Agent 的示例。
- 普通模式记录启动、收发方向、节点、身份、处理结果、耗时和失败原因;Debug 追加实际 HTTP/MQ/Unary RPC 边界的安全正文。
- HTTP/MQ 保留安全 JSON 的原始空白、重复键和数字写法;RPC 明确标注 protobuf 的 JSON 投影,并展开 `*_json` 字段,不冒充原始 protobuf 线格式。
- 敏感字段、提示词、完整对话、音频和原始 SIP 不输出;非法或无法安全展开的内容输出诊断,不退回打印原文。日志不改业务字节、返回错误、确认或重试规则。
- HTTP 101 保留 WebSocket 的原始读写流;SDK native ARI 无 HTTPClient 注入入口,服务启动时观察默认 HTTP transport;可注入的客户端避免重复观察,保留原 TLS/超时/重定向设置。
使用说明:[日志与抓包](../logging.md)。
## 本地验证
在独立工作区、当前共享合同 `ff74afe396eb811745a20cd88d167585d6593132` 上完成:
- TDD:Debug/普通模式、两个角色的参数、抓包分离、正文不截断、不改变消息、重复敏感键、嵌套 JSON、非法正文、HTTP 读取失败、升级流、RPC/MQ 失败及确认含义。
- 最终 `make check` 成功:格式、共享合同/Proto、`go vet ./...`、全包 `go test -race ./...`、构建、实际运行的隔离 RabbitMQ/HTTPS/mTLS 检查。
- `make release-check-local` 成功,发布包仍明确 `production_approval=false`。
- 项目既定口径的业务覆盖率 **71.4%**,高于 65%;生产部署 Python 测试 **21 项通过**。
- A01–A12/K01–K16 沿用并核对既有单节点验收边界及相关测试,未改策略/契约/拓扑、不扩展真实或生产签收:[P08 本地验收](saas-dispatcher-p08-acceptance.md)。
## 现场真实日志核验
摘要取自部署后 systemd journal,在受限进程中解析原日志;只保留计数、状态、阶段、方法和哈希,不提交正文。
- Dispatcher 实际完成 **14 次 HTTP 请求和 14 次 HTTP 响应**,正文读取和 Debug 日志均存在;响应均为 HTTP 200。
- 两端实际 Unary RPC 覆盖 `GetAgentStatus`、`ActivateAgent`、`ApplySIP`、`GetLoadedSIP`。Agent 和 Dispatcher 各有 **8 条 Debug RPC 正文**,请求/响应方向与阶段分别可见。
- Agent 可见结果恢复完成、录音恢复扫描开始/完成等普通流程日志。两个业务进程的日志均为 Logrus JSON,无非 JSON 进程日志、无 error 记录、无 redaction_error。
- 已观测正文中敏感字段及 URL 检查:**0 个敏感字段值泄露,0 个带查询的完整 URL,13 处隐藏标记**。这是对本次实际发生内容的核验,不宣称已覆盖供应商所有返回形式。
- **现场未发生 MQ 业务收发**,因此现场 MQ 正文、ACK/confirm 的真实数据仍未验证;隔离 RabbitMQ 与单元测试通过不能冒充这项现场事实。
- **现场没有呼叫执行日志**;不借本次日志部署声称真实通话、ASR/LLM/TTS、录音或 OSS 全链路通过。
部署工具仍显示 `dependency_state=saas_pending/business_ready=false`,未将该标签伪改为成功。实际两服务正常运行并有上述 HTTP/RPC 交互;本次不将旧独立探测标签或这些启动事实当作完整业务/生产验收。
## 数据与权限边界
- 使用原配置、业务数据和发布固定目录;未 reset、未迁移数据库、未修改线路地址/主叫/鉴权/AI 参数或 MQ 拓扑。
- 部署前先核对零活动通话,停止 Dispatcher 关闭新准入,再复核零通道及零未确认执行;Dispatcher inbox 无占用,Agent 恢复文件为 0,才允许安装重启业务服务。
- 未重启 Asterisk、开启抓包、调用独立 sip-call、生成外呼消息或额外调用真实 AI/OSS。
- 根工作区的并行合同/拒绝数据改动未覆盖、回退、暂存或纳入本次提交。契约更新在该工作区遇到 dirty 后停止;按使用者允许继续的答复,另建隔离工作区同步最新共享 main,仅验证和提交本轮文件。
- 私密原始工具输出保留在本机 `.local/logging-deployment/`,摘要文件 `0600`、目录 `0700`,不提交配置、原始正文或凭据。