如何实现(一个基本流程)
下面是一个在 Next.js + tRPC 中使用 Sentry 来监控接口耗时 +错误的示例流程:
1. 安装 Sentry SDK
比如在 Node 端(你的 Next.js API 路由/服务器端)安装:
npm install @sentry/node @sentry/tracing
2. 初始化 Sentry
在你的服务器入口文件(或 Next.js 的 API 路由初始化处):
import * as Sentry from '@sentry/node';
import { Integrations } from '@sentry/tracing';
Sentry.init({
dsn: process.env.SENTRY_DSN,
tracesSampleRate: 1.0, // 根据需求配置采样率
integrations: [
new Integrations.Http({ tracing: true }),
// 若还使用其他库可加更多 integrations
],
});
3. 在 tRPC 中加入 middleware 来测耗时 + 报监控
在你定义 tRPC router 的地方:
import { initTRPC } from '@trpc/server';
import * as Sentry from '@sentry/node';
const t = initTRPC.context<YourContext>().create();
const sentryAndTimingMiddleware = t.middleware(async ({ next, path, type, ctx, input }) => {
const span = Sentry.getCurrentHub().getScope()?.getSpan();
// 可选:如果没有 span,则可 start one manually
const start = Date.now();
try {
const result = await next();
const durationMs = Date.now() - start;
// 上报一个 Sentry span 或者记录一个 breadcrumb
span?.child({
op: 'rpc.procedure',
description: `${type} ${path}`,
data: {
path,
type,
input,
durationMs,
},
})?.finish();
// 或者使用 Sentry.captureMessage 或自定义事件
// Sentry.captureMessage(`tRPC ${path} took ${durationMs}ms`);
return result;
} catch (error) {
// 报错也发送 Sentry
Sentry.captureException(error, {
extra: { path, type, input },
});
throw error;
}
});
// 然后在定义 procedure 时使用该 middleware
const publicProcedure = t.procedure.use(sentryAndTimingMiddleware);
export const appRouter = t.router({
foo: publicProcedure.query(({ input }) => { /* ... */ }),
// 更多 procedures
});
4. 在 Next.js API 路由与 tRPC 处理器中确保 onError 捕捉
如果你使用 createNextApiHandler 或类似适配器:
import { createNextApiHandler } from '@trpc/server/adapters/next';
export default createNextApiHandler({
router: appRouter,
createContext: yourCreateContext,
onError({ error, path, input, ctx, type }) {
Sentry.captureException(error, {
extra: { path, input, type },
});
},
});
5. 在 Sentry 控制台查看性能与错误
- 在 Sentry 的 Performance 模块中,你可以看到 “transaction” 与 “span” 的耗时数据。
- 在 Issues/Errors 模块中,你可以看到接口中抛出的异常、堆栈、附加的 metadata (比如 procedure 名称、input 等)。
⚠️ 注意事项 &建议
- 耗时监控 vs 错误监控:错误监控比较直接,而要精确监控每个 procedure 的耗时,你可能还需要明确把每次 invocation 作为一个 span/transaction。Sentry 默认可能以 HTTP 请求为一级 transaction。
- 成本与采样率:如果你的接口调用很频繁,不建议将 tracesSampleRate 设置为 1.0(100%)生产环境可能成本高。可以先设低采样率。
- 隐私/安全考虑:如果你在 Sentry 上附加了用户输入 input,注意脱敏敏感信息。
- 与 tRPC 的 context & input 结合:你可以在 middleware 里拿到 input、ctx.user 等信息,给 Sentry 附加优质 context。
- 如果使用 Edge / Serverless(如 Vercel Edge),确认 Sentry SDK 支持环境或你是否需要额外配置。
- 性能粒度:如果只做“接口耗时”监控,可以先用简单的 Date.now() 计算、然后发送自定义事件至 Sentry(或其他监控系统)。如果追踪链路、跨服务,则建议使用 Sentry 的 tracing + span 功能。