已开启
[Feature]: 增加框架连接与运行时诊断日志 #74
yuheng_wang创建于 29 天前
29 天前 添加了label:feature
openJiuwen-bot
29 天前 评论:
29 天前 评论:
欢迎来到 openJiuwen 社区
Hey @yuheng_wang , 感谢你对社区的贡献.
机器人使用手册
有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。


29 天前 修改了issue 的描述
29 天前 关联了pull request:feat(api): 增加框架连接与运行时诊断日志
29 天前 修改了issue 的描述
29 天前 修改了issue 的描述
29 天前 修改了issue 的描述
yuheng_wang
29 天前 评论:
29 天前 评论:
设计补充:SIGTERM 关停时,HTTP Server 先停止接收新连接,并给普通在途请求 1 秒 drain 窗口;若仍存在 SSE、未完成请求或其他长连接,则记录 http_connection_drain_timed_out 并调用 closeAllConnections()。HTTP close 完成后再等待 MCP transport shutdown,从而保证长连接不会阻塞 mcp_connection_closed(reason=shutdown) 和后续 service_shutdown_completed。整体关停仍受 15 秒超时兜底约束。对应测试使用未完成的 HTTP 请求保持连接,断言 closeAllConnections() 被调用、MCP 异步关闭完成且重复关闭幂等。


28 天前 修改了issue 的描述
28 天前 修改了issue 的描述
28 天前 修改了issue 的描述
28 天前 修改了issue 的描述
28 天前 修改了issue 的描述
28 天前 修改了issue 的描述
28 天前 修改了issue 的描述
28 天前 修改了issue 的描述
🚀 背景描述
ScienceDiscovery 已通过 operational logger 将服务日志写入数据目录下的
logs/,默认位置为.sciencediscovery-data/logs/。其中api.log已包含 API 启动、部分组件状态与未分类异常,runner.log记录 Runner 请求和沙箱执行,run.log记录 Agent Run 生命周期。当前缺口集中在 Agent/LLM 看不到的框架内部链路:
SIGTERM关闭 API 时,HTTP Server 与 MCP transport 的异步关闭没有统一编排,MCP 关闭事件可能来不及落盘。本功能的目标是复用现有滚动日志,为这些框架链路补齐结构化、可关联、经过脱敏且有体积上限的诊断事件,让开发人员在 MCP、代理、远端 Runner、启动组件或进程关停发生故障时,能够仅通过日志定位失败阶段、目标、错误类别、耗时和重试情况。
本方案不是 Agent 操作审计能力,不要求 Agent 或 LLM 感知这些日志。
设计思路
1. 存储与日志形式
<dataDir>/logs/api.log,默认即.sciencediscovery-data/logs/api.log;SCIENCE_AGENT_LOG_LEVEL、SCIENCE_AGENT_LOG_DIR、SCIENCE_AGENT_LOG_MAX_BYTES、SCIENCE_AGENT_LOG_MAX_BACKUPS配置;2. 覆盖范围
component、durationMs、errorCode、errorsignal、timeoutMs、errorserverId、transport、endpointProtocol、endpointHost、durationMsserverId、toolCount、errorCode、errorproxyMode、proxyApplied、代理协议与主机serverId、toolName、requestId、attempt、delayMs、errorCodehostId、host、port、durationMs、errorCoderunnerId、connectionMode、endpointHost、durationMshostId、runnerId、errorCode、error启动组件首批覆盖 Skill Catalog、自定义 MCP Server、Session Store、Artifact 恢复和 Run 恢复。已有 Runner、Memory Graph 等模块的日志继续使用原通道,本功能不重复记录其业务载荷。
API 进程收到
SIGTERM后先停止 HTTP Server,再等待 MCP transport 的 shutdown hook 完成。关闭流程幂等,重复调用复用同一个 Promise;MCP 关闭完成后才记录service_shutdown_completed,确保已连接 session 的mcp_connection_closed(reason=shutdown)已写入。关停超过 15 秒则记录超时并失败退出。关停同时释放 MCP/Web cache 的 SQLite 句柄。连接后若
listTools失败,mcp_catalog_server_failed附带受限、脱敏的 stdio stderrTail。3. MCP stdio stderr
MCP stdio 子进程的 stderr 从忽略改为受控采集:
4. 代理语义
日志必须区分:
proxyMode:当前解析到的代理配置模式;proxyApplied:当前 MCP transport 是否实际应用了该代理。stdio transport 不经过 HTTP 代理;HTTP/SSE transport 若底层实现尚未接入代理,也不能仅因存在代理配置就记录为已应用。日志只记录代理协议和主机,不记录完整 URL、用户名、密码或敏感查询参数。
5. 脱敏、体积与可靠性边界
redactLogValue处理日志字段;shortErrorMessage,不维护第二套脱敏规则;args、body、content、input、messages、output、prompt、request、response、完整 stdout/stderr 等大载荷;6. 代码落点
services/api/src/bootstrap/platform.ts:框架组件初始化,以及 MCP/远端计算 logger 注入;services/api/src/mcp/node-client.ts:MCP 连接、目录、代理、调用重试与受控 stderr;services/api/src/http/index.ts:幂等、可等待的 API/MCP 资源关闭;services/api/src/server.ts:SIGTERM关停入口、完成/失败/超时日志;packages/executor/src/remote-compute.ts:主机探测、远端 Runner 与 SSH 隧道生命周期;packages/operational-logging/src/index.ts:统一错误缩短及 URL 凭据、敏感查询参数脱敏。7. 明确不在本功能范围内
SIGTERM,不改变其他进程信号的既有语义;涉及到的对外API
无对外 API、SSE schema 或 UI 变更。运维侧继续使用现有日志环境变量,不增加新的必填配置。
内部接口变更:
close();closeApiServer();与其他模块的相关性描述
services/api:作为 composition root 注入已有 operational logger,并编排启动、关停和基础设施 adapter 生命周期;packages/executor:记录 Remote Compute 生命周期,不反向依赖 API service;packages/operational-logging:负责文件写入、级别过滤、轮转、集中脱敏和有界错误文本;api.log。测试设计与测试计划
功能测试
安全与可靠性测试
工程验证