trace.js 1 KB
/**
 * `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)
  })
}