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)
})
}