Nextjs + Trpc + Sentry实现接口监控

2025年11月22日
0 views
3 min read

如何实现(一个基本流程)

下面是一个在 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 功能。