Loading...
Loading...
Compare original and translation side by side
@sentry/svelte@sentry/sveltekitNote: SDK versions and APIs below reflect current Sentry docs at time of writing (≥10.8.0, SvelteKit ≥2.31.0). Always verify against docs.sentry.io/platforms/javascript/guides/sveltekit/ before implementing.@sentry/sveltekit
@sentry/svelte@sentry/sveltekit注意: 以下SDK版本和API基于编写时的最新Sentry文档(≥10.8.0,SvelteKit ≥2.31.0)。 实施前请务必对照Sentry官方文档进行验证。@sentry/sveltekit
undefinedundefined
**What to determine:**
| Question | Impact |
|----------|--------|
| `@sveltejs/kit` in `package.json`? | SvelteKit path vs. plain Svelte path |
| SvelteKit ≥2.31.0? | Modern (`instrumentation.server.ts`) vs. legacy setup |
| `@sentry/sveltekit` already present? | Skip install, go straight to feature config |
| `vite.config.ts` present? | Source map upload via Vite plugin available |
| Backend directory found? | Trigger Phase 4 cross-link suggestion |
---
**需要确定的信息:**
| 问题 | 影响 |
|----------|--------|
| `package.json`中是否包含`@sveltejs/kit`? | 决定使用SvelteKit设置路径还是纯Svelte设置路径 |
| SvelteKit版本是否≥2.31.0? | 决定使用现代设置(`instrumentation.server.ts`)还是旧版设置 |
| 是否已安装`@sentry/sveltekit`? | 跳过安装步骤,直接进入功能配置 |
| 是否存在`vite.config.ts`? | 可通过Vite插件上传源码映射 |
| 是否找到后端目录? | 触发阶段4的跨服务关联建议 |
---Sentry.logger.*| Feature | Recommend when... |
|---|---|
| Error Monitoring | Always — non-negotiable baseline |
| Tracing | Always for SvelteKit (client + server); for plain Svelte when calling APIs |
| Session Replay | User-facing app, login flows, or checkout pages present |
| Logging | App already uses server-side logging, or structured log search is needed |
Sentry.logger.*| 功能 | 推荐场景 |
|---|---|
| 错误监控 | 始终推荐 — 不可缺少的基础功能 |
| 链路追踪 | SvelteKit应用始终推荐(客户端+服务端);纯Svelte应用在调用API时推荐 |
| 会话重放 | 面向用户的应用、登录流程或结账页面存在时推荐 |
| 日志功能 | 应用已使用服务端日志,或需要结构化日志搜索时推荐 |
| Your project | Package | Setup complexity |
|---|---|---|
| SvelteKit (≥2.31.0) | | 5 files to create/modify |
| SvelteKit (<2.31.0) | | 3 files (init in hooks.server.ts) |
Plain Svelte (no | | Single entry point |
| 项目类型 | 使用包 | 设置复杂度 |
|---|---|---|
| SvelteKit(≥2.31.0) | | 需要创建/修改5个文件 |
| SvelteKit(<2.31.0) | | 需要修改3个文件(在hooks.server.ts中初始化) |
纯Svelte(无 | | 仅需配置单个入口文件 |
npx @sentry/wizard@latest -i sveltekit/sentry-example-pagenpx @sentry/wizard@latest -i sveltekit/sentry-example-pagenpm install @sentry/sveltekit --savesvelte.config.jsimport adapter from "@sveltejs/adapter-auto";
const config = {
kit: {
adapter: adapter(),
experimental: {
instrumentation: { server: true },
tracing: { server: true },
},
},
};
export default config;src/instrumentation.server.tsimport * as Sentry from "@sentry/sveltekit";
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.SENTRY_ENVIRONMENT,
release: process.env.SENTRY_RELEASE,
sendDefaultPii: true,
tracesSampleRate: 1.0, // lower to 0.1–0.2 in production
enableLogs: true,
});src/hooks.client.tsimport * as Sentry from "@sentry/sveltekit";
Sentry.init({
dsn: import.meta.env.PUBLIC_SENTRY_DSN ?? import.meta.env.VITE_SENTRY_DSN,
environment: import.meta.env.MODE,
sendDefaultPii: true,
tracesSampleRate: 1.0,
integrations: [
Sentry.replayIntegration({
maskAllText: true,
blockAllMedia: true,
}),
],
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
enableLogs: true,
});
export const handleError = Sentry.handleErrorWithSentry();src/hooks.server.tsimport * as Sentry from "@sentry/sveltekit";
import { sequence } from "@sveltejs/kit/hooks";
export const handleError = Sentry.handleErrorWithSentry();
// sentryHandle() instruments incoming requests and creates root spans
export const handle = Sentry.sentryHandle();
// If you have other handle functions, compose with sequence():
// export const handle = sequence(Sentry.sentryHandle(), myAuthHandle);vite.config.tsSENTRY_AUTH_TOKENimport { sveltekit } from "@sveltejs/kit/vite";
import { sentrySvelteKit } from "@sentry/sveltekit";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [
// sentrySvelteKit MUST come before sveltekit()
sentrySvelteKit({
org: process.env.SENTRY_ORG,
project: process.env.SENTRY_PROJECT,
authToken: process.env.SENTRY_AUTH_TOKEN,
}),
sveltekit(),
],
});.envSENTRY_AUTH_TOKEN=sntrys_...
SENTRY_ORG=my-org-slug
SENTRY_PROJECT=my-project-slugnpm install @sentry/sveltekit --savesvelte.config.jsimport adapter from "@sveltejs/adapter-auto";
const config = {
kit: {
adapter: adapter(),
experimental: {
instrumentation: { server: true },
tracing: { server: true },
},
},
};
export default config;src/instrumentation.server.tsimport * as Sentry from "@sentry/sveltekit";
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.SENTRY_ENVIRONMENT,
release: process.env.SENTRY_RELEASE,
sendDefaultPii: true,
tracesSampleRate: 1.0, // 生产环境建议降低至0.1–0.2
enableLogs: true,
});src/hooks.client.tsimport * as Sentry from "@sentry/sveltekit";
Sentry.init({
dsn: import.meta.env.PUBLIC_SENTRY_DSN ?? import.meta.env.VITE_SENTRY_DSN,
environment: import.meta.env.MODE,
sendDefaultPii: true,
tracesSampleRate: 1.0,
integrations: [
Sentry.replayIntegration({
maskAllText: true,
blockAllMedia: true,
}),
],
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
enableLogs: true,
});
export const handleError = Sentry.handleErrorWithSentry();src/hooks.server.tsimport * as Sentry from "@sentry/sveltekit";
import { sequence } from "@sveltejs/kit/hooks";
export const handleError = Sentry.handleErrorWithSentry();
// sentryHandle() 会监控 incoming 请求并创建根链路
export const handle = Sentry.sentryHandle();
// 如果有其他handle函数,使用sequence()组合:
// export const handle = sequence(Sentry.sentryHandle(), myAuthHandle);vite.config.tsSENTRY_AUTH_TOKENimport { sveltekit } from "@sveltejs/kit/vite";
import { sentrySvelteKit } from "@sentry/sveltekit";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [
// sentrySvelteKit 必须在 sveltekit() 之前
sentrySvelteKit({
org: process.env.SENTRY_ORG,
project: process.env.SENTRY_PROJECT,
authToken: process.env.SENTRY_AUTH_TOKEN,
}),
sveltekit(),
],
});.envSENTRY_AUTH_TOKEN=sntrys_...
SENTRY_ORG=my-org-slug
SENTRY_PROJECT=my-project-slug@sentry/sveltekit@sentry/sveltekitinstrumentation.server.tssvelte.config.jsSentry.init()hooks.server.ts// src/hooks.server.ts (legacy — init goes here)
import * as Sentry from "@sentry/sveltekit";
Sentry.init({
dsn: process.env.SENTRY_DSN,
tracesSampleRate: 1.0,
enableLogs: true,
});
export const handleError = Sentry.handleErrorWithSentry();
export const handle = Sentry.sentryHandle();hooks.client.tsvite.config.tsinstrumentation.server.tssvelte.config.jshooks.server.tsSentry.init()// src/hooks.server.ts(旧版——初始化代码在此)
import * as Sentry from "@sentry/sveltekit";
Sentry.init({
dsn: process.env.SENTRY_DSN,
tracesSampleRate: 1.0,
enableLogs: true,
});
export const handleError = Sentry.handleErrorWithSentry();
export const handle = Sentry.sentryHandle();hooks.client.tsvite.config.tsnpm install @sentry/svelte --savesrc/main.tssrc/main.jsimport * as Sentry from "@sentry/svelte";
import App from "./App.svelte";
Sentry.init({
dsn: import.meta.env.VITE_SENTRY_DSN,
environment: import.meta.env.MODE,
sendDefaultPii: true,
integrations: [
Sentry.browserTracingIntegration(),
Sentry.replayIntegration({
maskAllText: true,
blockAllMedia: true,
}),
],
tracesSampleRate: 1.0,
tracePropagationTargets: ["localhost", /^https:\/\/yourapi\.io/],
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
enableLogs: true,
});
const app = new App({ target: document.getElementById("app")! });
export default app;// svelte.config.js
import { withSentryConfig } from "@sentry/svelte";
export default withSentryConfig(
{ compilerOptions: {} },
{ componentTracking: { trackComponents: true } }
);npm install @sentry/svelte --savesrc/main.tssrc/main.jsimport * as Sentry from "@sentry/svelte";
import App from "./App.svelte";
Sentry.init({
dsn: import.meta.env.VITE_SENTRY_DSN,
environment: import.meta.env.MODE,
sendDefaultPii: true,
integrations: [
Sentry.browserTracingIntegration(),
Sentry.replayIntegration({
maskAllText: true,
blockAllMedia: true,
}),
],
tracesSampleRate: 1.0,
tracePropagationTargets: ["localhost", /^https:\/\/yourapi\.io/],
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1.0,
enableLogs: true,
});
const app = new App({ target: document.getElementById("app")! });
export default app;// svelte.config.js
import { withSentryConfig } from "@sentry/svelte";
export default withSentryConfig(
{ compilerOptions: {} },
{ componentTracking: { trackComponents: true } }
);| Feature | Reference | Load when... |
|---|---|---|
| Error Monitoring | | Always (baseline) |
| Tracing | | API calls / distributed tracing needed |
| Session Replay | | User-facing app |
| Logging | | Structured logs / log-to-trace correlation |
Read ${SKILL_ROOT}/references/<feature>.md| 功能 | 参考文件 | 加载场景 |
|---|---|---|
| 错误监控 | | 始终加载(基础功能) |
| 链路追踪 | | 需要API调用/分布式追踪时 |
| 会话重放 | | 面向用户的应用 |
| 日志功能 | | 需要结构化日志/日志与链路关联时 |
${SKILL_ROOT}/references/<feature>.md| File | Purpose | Modern | Legacy |
|---|---|---|---|
| Server | ✅ Required | ❌ |
| Client | ✅ Required | ✅ Required |
| | ✅ Required | ✅ Init goes here |
| Enable | ✅ Required | ❌ |
| | ✅ Recommended | ✅ Recommended |
| | ✅ For source maps | ✅ For source maps |
| 文件 | 用途 | 现代设置 | 旧版设置 |
|---|---|---|---|
| 服务端 | ✅ 必填 | ❌ 无需 |
| 客户端 | ✅ 必填 | ✅ 必填 |
| | ✅ 必填 | ✅ 初始化代码在此 |
| 启用 | ✅ 必填 | ❌ 无需 |
| | ✅ 推荐 | ✅ 推荐 |
| | ✅ 用于源码映射 | ✅ 用于源码映射 |
Sentry.init()Sentry.init()| Option | Type | Default | Notes |
|---|---|---|---|
| | — | Required. Use env var; SDK is disabled when empty |
| | | e.g., |
| | — | e.g., |
| | | Includes IP addresses and request headers |
| | — | 0–1; use |
| | — | Per-transaction sampling; overrides |
| | — | URLs that receive distributed tracing headers |
| | — | Fraction of all sessions recorded (client only) |
| | — | Fraction of error sessions recorded (client only) |
| | | Enable |
| | — | Filter/modify logs before send |
| | | Verbose SDK output to console |
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| | — | 必填。使用环境变量;为空时SDK会禁用 |
| | | 例如: |
| | — | 例如: |
| | | 包含IP地址和请求头信息 |
| | — | 0–1;开发环境用 |
| | — | 按事务采样;优先级高于 |
| | — | 接收分布式追踪头的URL列表 |
| | — | 录制的会话比例(仅客户端) |
| | — | 录制错误会话的比例(仅客户端) |
| | | 启用 |
| | — | 发送前过滤/修改日志 |
| | | 在控制台输出详细SDK日志 |
instrumentation.server.tshooks.server.tsinstrumentation.server.tshooks.server.ts| Option | Type | Notes |
|---|---|---|
| | Hostname tag on server events |
| | Attach local vars to stack frames |
| | ms to flush events before process exit (default: 2000) |
| 选项 | 类型 | 说明 |
|---|---|---|
| | 服务端事件的主机名标签 |
| | 将局部变量附加到堆栈帧 |
| | 进程退出前刷新事件的毫秒数(默认:2000) |
| Adapter | Support |
|---|---|
| ✅ Full |
| ✅ Full |
| ⚠️ Partial — requires extra setup |
| Vercel Edge Runtime | ❌ Not supported |
| 适配器 | 支持情况 |
|---|---|
| ✅ 完全支持 |
| ✅ 完全支持 |
| ⚠️ 部分支持——需要额外配置 |
| Vercel Edge Runtime | ❌ 不支持 |
<!-- src/routes/sentry-test/+page.svelte -->
<script>
import * as Sentry from "@sentry/sveltekit";
</script>
<button onclick={() => { throw new Error("Sentry client test"); }}>
Test Client Error
</button>
<button onclick={() => Sentry.captureMessage("Sentry test message", "info")}>
Test Message
</button>// src/routes/sentry-test/+server.ts
export const GET = () => {
throw new Error("Sentry server test");
};debug: trueSentry.init()<!-- src/routes/sentry-test/+page.svelte -->
<script>
import * as Sentry from "@sentry/sveltekit";
</script>
<button onclick={() => { throw new Error("Sentry client test"); }}>
测试客户端错误
</button>
<button onclick={() => Sentry.captureMessage("Sentry test message", "info")}>
测试消息上报
</button>// src/routes/sentry-test/+server.ts
export const GET = () => {
throw new Error("Sentry server test");
};Sentry.init()debug: trueundefinedundefined
If a backend exists without Sentry configured, suggest the matching skill:
| Backend detected | Suggest skill |
|-----------------|--------------|
| Go (`go.mod`) | `sentry-go-sdk` |
| Python (`requirements.txt`, `pyproject.toml`) | `sentry-python-sdk` |
| Ruby (`Gemfile`) | `sentry-ruby-sdk` |
| Node.js (Express, Fastify, etc.) | Use `@sentry/node` — see [docs.sentry.io/platforms/javascript/guides/express/](https://docs.sentry.io/platforms/javascript/guides/express/) |
---
如果存在未配置Sentry的后端服务,建议使用对应的技能:
| 检测到的后端 | 推荐技能 |
|-----------------|--------------|
| Go(`go.mod`) | `sentry-go-sdk` |
| Python(`requirements.txt`、`pyproject.toml`) | `sentry-python-sdk` |
| Ruby(`Gemfile`) | `sentry-ruby-sdk` |
| Node.js(Express、Fastify等) | 使用`@sentry/node`——参考[Sentry官方文档](https://docs.sentry.io/platforms/javascript/guides/express/) |
---| Issue | Solution |
|---|---|
| Events not appearing | Set |
| Source maps not working | Run |
| Server errors not captured | Ensure |
| Client errors not captured | Ensure |
| Session replay not recording | Confirm |
| Wrap with |
| Ad-blocker blocking events | Set |
| SvelteKit instrumentation not activating | Confirm |
| Cloudflare adapter issues | Consult docs.sentry.io/platforms/javascript/guides/sveltekit/ for adapter-specific notes |
| These are legacy wrappers — remove them; |
| 问题 | 解决方案 |
|---|---|
| 事件未上报 | 设置 |
| 源码映射不生效 | 运行 |
| 服务端错误未捕获 | 确保 |
| 客户端错误未捕获 | 确保 |
| 会话重放未录制 | 确认 |
| 使用 |
| 广告拦截器阻止事件上报 | 设置 |
| SvelteKit工具集成未激活 | 确认 |
| Cloudflare适配器问题 | 参考Sentry官方文档中的适配器专属说明 |
| 这些是旧版包装函数——请移除;≥10.8.0版本中 |