Sentry 集成
Integrate Sentry to monitor errors from a Supabase client
你可以使用 Sentry 来监控从 Supabase JavaScript 客户端抛出的错误。Sentry JavaScript SDK 已经直接内置了对 Supabase 的支持。
🌐 You can use Sentry to monitor errors thrown from a Supabase JavaScript client. Support for Supabase is built directly into the Sentry JavaScript SDK.
该集成工具会对通过 supabase-js 发出的数据库查询和身份验证调用进行处理,创建用于性能监控的跨度并捕捉错误。它支持浏览器、Node 和边缘环境。
🌐 The integration instruments database queries and authentication calls made through supabase-js, creating spans for performance monitoring and capturing errors. It supports browser, Node, and edge environments.
内置集成需要 Sentry JavaScript SDK v9.14.0 或更高版本。如果你使用的是旧版本 SDK(包括 v7),请改用社区版 @supabase/sentry-js-integration 包,内置集成就是基于它的。
🌐 The built-in integration requires Sentry JavaScript SDK v9.14.0 or later. If you're on an older SDK (including v7), use the community @supabase/sentry-js-integration package instead, which the built-in integration is based on.
使用 #
🌐 Use
有两种方法可以启用集成。两种方法都需要一个已初始化的 Supabase 客户端实例。
🌐 There are two ways to enable the integration. Both take an initialized Supabase client instance.
在初始化 Sentry 时将 supabaseIntegration 添加到 integrations 列表中。当你的 Sentry.init 调用和 Supabase 客户端在同一个地方时使用这个。
🌐 Add supabaseIntegration to the integrations list when you initialize Sentry. Use this when your Sentry.init call and your Supabase client live in the same place.
1import * as Sentry from '@sentry/browser'2import { createClient } from '@supabase/supabase-js'34const supabaseClient = createClient(SUPABASE_URL, SUPABASE_KEY)56Sentry.init({7 dsn: SENTRY_DSN,8 tracesSampleRate: 1.0,9 integrations: [10 Sentry.browserTracingIntegration(),11 Sentry.supabaseIntegration({ supabaseClient }),12 ],13})默认情况下,查询过滤器和变更体会从跨度和面包屑中被屏蔽。要捕获它们,可以在设置监测时传入 sendOperationData: true(在 Sentry.supabaseIntegration({ supabaseClient, sendOperationData: true }) 或 Sentry.instrumentSupabaseClient(client, { sendOperationData: true })),或者在你的 Sentry.init 选项中启用 dataCollection: { userInfo: true },这会作用于该运行时中的每个客户端。
🌐 By default, query filters and mutation bodies are redacted from spans and breadcrumbs. To capture them, pass sendOperationData: true where you set up instrumentation (Sentry.supabaseIntegration({ supabaseClient, sendOperationData: true }) or Sentry.instrumentSupabaseClient(client, { sendOperationData: true })), or enable dataCollection: { userInfo: true } in your Sentry.init options, which applies to every client in that runtime.
去重跨度 #
🌐 Deduplicating spans
Sentry 的 HTTP 和 Fetch 跟踪集成在 Node 和 Next.js SDK 中默认启用,因此底层的 Supabase REST 调用除了 Supabase 集成产生的 db spans 外,还会被追踪为 http.client spans。这个清理是可选的:如果你不想同时看到两者,可以在其他集成中跳过 Supabase REST 请求。
🌐 Sentry's HTTP and Fetch tracing integrations are enabled by default in the Node and Next.js SDKs, so the underlying Supabase REST calls are traced as http.client spans in addition to the db spans from the Supabase integration. This is optional cleanup: if you'd rather not see both, skip the Supabase REST requests in your other integration.
1import * as Sentry from '@sentry/browser'2import { createClient } from '@supabase/supabase-js'34const supabaseClient = createClient(SUPABASE_URL, SUPABASE_KEY)56Sentry.init({7 dsn: SENTRY_DSN,8 tracesSampleRate: 1.0,9 integrations: [10 Sentry.supabaseIntegration({ supabaseClient }),1112 // @sentry/browser13 Sentry.browserTracingIntegration({14 shouldCreateSpanForRequest: (url) => {15 return !url.startsWith(`${SUPABASE_URL}/rest`)16 },17 }),1819 // or @sentry/node (supabase-js uses fetch, so filter the Fetch integration)20 Sentry.nativeNodeFetchIntegration({21 ignoreOutgoingRequests: (url) => {22 return url.startsWith(`${SUPABASE_URL}/rest`)23 },24 }),2526 // or @sentry/nextjs for Proxy & Edge Functions27 Sentry.winterCGFetchIntegration({28 breadcrumbs: true,29 shouldCreateSpanForRequest: (url) => {30 return !url.startsWith(`${SUPABASE_URL}/rest`)31 },32 }),33 ],34})Next.js 的配置 #
🌐 Configuration for Next.js
Next.js 在浏览器、服务器和边缘运行时都会运行 Sentry,并且像 @supabase/ssr 这样的鉴权感知设置会为每个请求创建一个 Supabase 客户端。由于 instrumentSupabaseClient 会对每个运行时的数据库调用和每个客户端实例的鉴权调用进行修补,所以应该在你每个客户端工厂里调用它,而不是只在一个共享实例上调用。
🌐 Next.js runs Sentry across browser, server, and edge runtimes, and auth-aware setups (like @supabase/ssr) create a Supabase client per request. Since instrumentSupabaseClient patches database calls per runtime and auth calls per client instance, call it inside each of your client factories rather than on a single shared instance.
- 通过 Sentry Next.js 向导 来设置基础的 Sentry 配置。
- 在每个工厂中添加
Sentry.instrumentSupabaseClient。例如,带有@supabase/ssr的服务器客户端:
1import * as Sentry from '@sentry/nextjs'2import { createServerClient } from '@supabase/ssr'34export async function createClient() {5 const client = createServerClient(/* your usual URL, key, and cookie config */)67 Sentry.instrumentSupabaseClient(client)8 return client9}- 在你的浏览器客户端使用 (
createBrowserClient) 和中间件客户端应用同样的方法,这样每个运行时都会被覆盖。 - 要包括查询过滤器和变更体,请在每个运行时的 Sentry 配置中启用
dataCollection: { userInfo: true },或者在调用位置传入Sentry.instrumentSupabaseClient(client, { sendOperationData: true })。 - 构建并运行你的应用(
npm run build && npm run start)。现在,Supabase 查询会以db跨度的形式出现在你的 Sentry 跟踪中。