CONVENTION.md
1.8 KB
@drama/observability · ctx 贯穿约定(权威原文)
本文件是「
RequestContext作为显式首参ctx贯穿所有服务签名」约定的单一事实来源。 下游所有 service / application-service / repo / 路由的签名设计都引用本文。任何对RequestContext形状、Logger形状或本约定的改动,必须先改本文件与任务文档 §3,再改代码,因为它影响全仓所有签名。
约定原文(硬性,被全仓引用)
一切跨进程边界进来的逻辑入口(HTTP 路由、定时任务、消息消费)在最外层创建或续传 RequestContext,
并把它作为显式首参 ctx 一路传递到 service、application-service、必要时到 repo。形如:
dramaService.buildBundle(ctx, dramaId)
全仓所有 service 方法的第一形参必须是 ctx: RequestContext。
红线
- 禁止用
AsyncLocalStorage等隐式穿透携带 ctx(架构基线点名旧参照版靠 ALS 隐式穿 billing 是反模式)。ctx必须显式、可见、可测。 - 禁止用全局可变单例「偷偷」携带 ctx。
- 包内不读
process.env、不建顶层连接、不在顶层装 OTel SDK;import本包无副作用。
为什么
如果一期不定 ctx 贯穿约定,二期接 OpenTelemetry 就要回头给每一个 service 函数加 trace 参数、
给每一处日志补 trace_id——改造面是全仓。一期花几行定下约定与日志工厂,把这个改造面压成接近零。
二期升级点(签名不变,调用方零改动)
createRequestContext升级为携带真实 OTel span context。createLogger接 OTel log bridge。RequestContext形态与child/ 工厂入口不变——这是「一期约定先行」的开闭兑现点。