/** * `registerTrace` —— 每请求生成 / 续传 `trace_id` 贯穿入口→服务→DB,回带响应头。 * * 入站带 `x-trace-id` 则续传(跨服务同一 trace),否则新建。把 `ctx` 与绑定该 trace 的 * `log_` 挂到 `request` 供路由 / 服务取用;响应统一回带 `x-trace-id`。纯横切,无业务。 */ import { createRequestContext } from '@drama/observability' /** * @param {import('fastify').FastifyInstance} app * @param {{ logger: { child: Function } }} deps 根 logger(@drama/observability createLogger 产物) */ export function registerTrace(app, { logger }) { app.addHook('onRequest', async (request, reply) => { const inbound = request.headers['x-trace-id'] const ctx = createRequestContext({ ...(typeof inbound === 'string' && inbound ? { traceId: inbound } : {}), fields: { route: request.url, method: request.method }, }) request.ctx = ctx request.log_ = logger.child(ctx) reply.header('x-trace-id', ctx.traceId) }) }