Skip to content

finding(service-automation): plugin.ts 里还有三处外来 ${err.message} 插进日志 message —— 其中两条是耐久性诊断,正是最不该被切碎的记录 #5661

Description

@os-zhuang

#5636 时对 packages/services/service-automation/src/plugin.ts 全文扫同类形态的结果。
#5048 / PR #5572 修了 flow 绑定四+一处,#5575 / PR #5639 修了 fail() 两处,#5636 修了
degradeConnectorInstance 两处;下面三处三单都没覆盖,单开记录。

行号基于 origin/main 5b60b3669

三处

  1. plugin.ts:454 —— manifest 服务不可用(warn):

    ctx.logger.warn(
        `[Automation] manifest service unavailable; sys_automation_run not registered yet: ${(err as Error).message}`,
    );
  2. plugin.ts:592-594 —— 启动时读不到 sys_automation_run(error):

    ctx.logger.error(
        `[Automation] sys_automation_run could not be read at startup — if this persists, suspended runs will NOT ` +
        `survive a restart. Check that schema sync ran for this datasource: ${(err as Error).message}`,
    );

    err 来自 candidate.probe(),即数据源驱动抛出的错误。

  3. plugin.ts:931-936 —— 重启后 wait-timer 重新挂载失败(error):

    ctx.logger.error(
        `[Automation] suspended wait-timer re-arm FAILED after restart — … Cause: ${(err as Error).message}`,
    );

    err 来自 job 服务。

为什么第 2、3 条值得单独说

这两条的存在理由就是可读性:它们各自的代码注释写明了后果 ——「suspended runs will NOT
survive a restart」、「every wait/approval paused before this restart will hang indefinitely」
—— 并特意选在 error 而不是 warn(第 3 条的注释原文:「so it is reported at error, not
warn」)。一条被搅烂的耐久性告警,恰好是运维最需要能 grep 到、能按字段过滤的那一条。
这就是 #4632 的原则:被搅烂的诊断比没有诊断更贵。

机制与 #5048 / #5575 / #5636 完全相同:ObjectLogger 每次调用只写一条
<ts> <LEVEL> <msg> 记录,带换行的 message 溢出到不带等级头的物理行,文件 sink /
docker logs+journald 送采集 / grep ERROR 都把续行读成无法归属的碎片。第 1 条是 warn
→ stdout,冷启动时还会被 BootLogCapture 直接丢掉续行(#5636 实测:13 行进,保留 1 行,
丢 12 行)。

刻意不含在内的两处(说明理由,免得下一个人重复扫)

可达性(finding 而非 bug)

三处的 err 都来自我们不控制文本的地方(kernel service registry、datasource 驱动、
job 服务),但今天在库内的实现里这些 message 都是单行。第一个包装了多行 SDK 错误的驱动
或 job 服务实现会撞上;第 2 条尤其 —— 数据库驱动的多行错误在生态里很常见。

修法

与前三单同源、零新词汇:复用同包 thrown-cause-diagnostics.tsdescribeThrownForLog,
message 保持不含换行的自足句子,cause 走 meta。位置按 Logger 契约:warn(message, meta?)
用第二参,error(message, error?, meta?)第三参(第二参塞原始 error 会附带完整堆栈)。
新增字段名不得含 key/token/secret/password 子串(ObjectLogger.redactSensitive
子串匹配,见 #5573)。

第 2、3 条改完后建议顺手确认 pnpm check:durability-log-level 仍绿 —— 这两处正在它扫的
24 个耐久性 catch 接缝里。

关联

#5636#5575 / PR #5639#5048 / PR #5572#5573#4632#4420(耐久性丢失本身)、cloud#971。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions