文档
开发指南应用监控

应用监控

🚀 Cheatsheet (快速执行)

目标: 10分钟内配置错误监控和性能追踪,第一时间发现线上问题

最快上手方式:

# 1. 注册 Sentry 账号并创建项目
# https://sentry.io/signup

# 2. 安装 Sentry SDK
bun add @sentry/nextjs

# 3. 配置环境变量
echo 'SENTRY_DSN=你的项目DSN' >> .env.local
echo 'SENTRY_AUTH_TOKEN=你的授权令牌' >> .env.local

# 4. 自动配置向导
npx @sentry/wizard nextjs

立即生效: 重启应用后,所有错误和性能数据自动上报到 Sentry 控制台

❓ 为什么要做应用监控

对 MVP 的关键价值:

  • 提前发现问题: 用户还没投诉,你就知道哪里出错了
  • 定位问题根因: 不用猜测,直接看到错误堆栈和用户操作路径
  • 性能优化: 发现慢查询、内存泄漏等性能瓶颈
  • 用户体验保障: 确保核心功能(注册、支付)稳定可用

真实场景举例: 你的支付接口突然报错 10 次,Sentry 立即通知你,并显示是 Stripe API 超时导致,你马上修复,避免了收入损失。

🤔 为什么选择 Sentry

我们的实战经验:

  • 错误追踪精准: 精确到代码行,包含完整上下文
  • 性能监控全面: API 响应时间、数据库查询、页面加载
  • 通知及时: 邮件、Slack、钉钉多渠道报警
  • 免费额度充足: 月度 5000 个错误事件,初期完全够用

对比其他方案:

# Sentry     - ⭐ 推荐,功能全面,Next.js 支持好
# LogRocket  - 用户会话录制,但价格贵
# Bugsnag    - 错误追踪专业,但生态不如 Sentry
# DataDog    - 企业级监控,但配置复杂且昂贵

🧠 简要原理 & 最简案例

监控系统架构: 应用错误/性能数据 → Sentry SDK → 自动上报 → Sentry 服务器 → 报警通知

核心监控内容:

// 1. 自动错误捕获(无需代码)
try {
  await fetchUserData()
} catch (error) {
  // Sentry 自动捕获并上报
}

// 2. 性能监控(自动启用)
// API 调用时间、数据库查询、页面加载速度

// 3. 自定义事件追踪
import * as Sentry from '@sentry/nextjs'

Sentry.captureMessage('用户完成支付', 'info')

🛠️ 实际操作步骤

1. 创建 Sentry 项目 (3分钟)

注册和项目设置:

  1. 访问 sentry.io 注册账号
  2. 创建组织(Organization)
  3. 选择 Next.js 作为平台
  4. 获取项目 DSN(数据源名称)

重要信息记录:

DSN: https://xxx@xxx.ingest.sentry.io/xxx
Project ID: 你的项目ID  
Auth Token: 稍后在设置中生成

2. 安装和配置 Sentry SDK (5分钟)

安装依赖:

bun add @sentry/nextjs

自动配置(推荐):

# 运行配置向导
npx @sentry/wizard nextjs

# 向导会自动:
# 1. 创建 sentry.client.config.ts
# 2. 创建 sentry.server.config.ts  
# 3. 创建 sentry.edge.config.ts
# 4. 修改 next.config.ts
# 5. 添加 instrumentation.ts

3. 环境变量配置 (2分钟)

# .env.local
SENTRY_DSN=https://你的dsn@sentry.io/项目id
SENTRY_AUTH_TOKEN=你的授权令牌  
SENTRY_SUPPRESS_TURBOPACK_WARNING=1

获取 Auth Token:

  1. Sentry 控制台 > Settings > Auth Tokens
  2. Create New Token > 选择 project:write 权限
  3. 复制 token 到环境变量

💡 关键文件配置

Next.js 配置集成

// next.config.ts
import { withSentryConfig } from '@sentry/nextjs'

const nextConfig = {
  // 你的 Next.js 配置
}

export default withSentryConfig(nextConfig, {
  org: "你的组织名",
  project: "你的项目名", 
  authToken: process.env.SENTRY_AUTH_TOKEN,
  
  // 使用隧道路由避免广告拦截
  tunnelRoute: "/monitoring-tunnel",
  
  // 上传源码映射(生产环境)
  uploadSourceMaps: process.env.NODE_ENV === 'production',
})

中间件配置

// middleware.ts
export const config = {
  matcher: [
    // 排除 Sentry 隧道路由
    "/((?!api|_next/static|_next/image|favicon.ico|monitoring-tunnel).*)",
  ],
}

全局错误处理

// app/global-error.tsx
'use client'
import * as Sentry from '@sentry/nextjs'
import NextError from 'next/error'
import { useEffect } from 'react'

export default function GlobalError({ error }: { error: Error }) {
  useEffect(() => {
    Sentry.captureException(error)
  }, [error])

  return (
    <html>
      <body>
        <h2>应用出现了错误</h2>
        <p>我们已收到错误报告,正在修复中</p>
      </body>
    </html>
  )
}

📊 监控配置详解

错误监控设置

// sentry.client.config.ts
import * as Sentry from '@sentry/nextjs'

Sentry.init({
  dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
  
  // 性能监控采样率
  tracesSampleRate: 1.0,
  
  // 会话重放(用户操作录制)
  replaysSessionSampleRate: 0.1,
  replaysOnErrorSampleRate: 1.0,
  
  // 开发环境调试
  debug: process.env.NODE_ENV === 'development',
  
  // 集成配置
  integrations: [
    Sentry.replayIntegration(),
  ],
})

服务端监控设置

// sentry.server.config.ts
import * as Sentry from '@sentry/nextjs'

Sentry.init({
  dsn: process.env.SENTRY_DSN,
  tracesSampleRate: 1.0,
  
  // 服务端特定配置
  environment: process.env.NODE_ENV,
  
  // 过滤敏感信息
  beforeSend(event) {
    // 移除敏感数据
    if (event.request?.headers) {
      delete event.request.headers.authorization
    }
    return event
  },
})

🎯 实用监控场景

场景1: API 错误监控

// app/api/users/route.ts
import * as Sentry from '@sentry/nextjs'

export async function GET() {
  try {
    const users = await db.user.findMany()
    return Response.json(users)
  } catch (error) {
    // 自动上报错误,包含请求上下文
    Sentry.captureException(error, {
      tags: { api: 'users' },
      extra: { timestamp: new Date().toISOString() }
    })
    
    return Response.json(
      { error: '获取用户列表失败' }, 
      { status: 500 }
    )
  }
}

场景2: 支付流程监控

// 支付处理监控
async function processPayment(paymentData) {
  const transaction = Sentry.startTransaction({
    name: 'payment_process',
    op: 'payment'
  })
  
  try {
    // 监控支付 API 调用
    const result = await stripe.paymentIntents.create(paymentData)
    
    Sentry.addBreadcrumb({
      message: '支付创建成功',
      data: { paymentId: result.id }
    })
    
    return result
  } catch (error) {
    // 支付错误立即报警
    Sentry.captureException(error, {
      tags: { 
        component: 'payment',
        severity: 'critical' 
      }
    })
    throw error
  } finally {
    transaction.finish()
  }
}

场景3: 用户行为监控

// 关键用户操作监控
function trackUserAction(action: string, details: any) {
  Sentry.addBreadcrumb({
    message: `用户操作: ${action}`,
    category: 'user',
    data: details,
    level: 'info'
  })
  
  // 对关键操作设置检查点
  if (['signup', 'payment', 'subscription'].includes(action)) {
    Sentry.setTag('critical_action', action)
  }
}

🔧 高级监控功能

性能监控

// 自定义性能追踪
const transaction = Sentry.startTransaction({
  name: 'database_query',
  op: 'db'
})

const span = transaction.startChild({
  op: 'db.query',
  description: 'SELECT * FROM users'
})

// 执行数据库查询
const users = await db.user.findMany()

span.finish()
transaction.finish()

用户上下文关联

// 登录用户信息关联
useEffect(() => {
  if (user) {
    Sentry.setUser({
      id: user.id,
      email: user.email,
      subscription: user.subscription?.plan
    })
    
    Sentry.setTag('user_type', user.subscription?.plan || 'free')
  }
}, [user])

自定义报警规则

// 基于业务逻辑的报警
if (errorRate > 0.05) { // 错误率超过 5%
  Sentry.captureMessage('错误率过高,需要关注', 'warning')
}

if (responseTime > 3000) { // 响应时间超过 3秒
  Sentry.captureMessage('API 响应过慢', 'warning')
}

🔔 报警通知配置

邮件和 Slack 通知

# Sentry 控制台配置
1. Project > Settings > Alerts
2. Create Alert Rule
3. 设置触发条件:
   - 新错误出现
   - 错误频率过高  
   - 性能下降
4. 配置通知渠道:
   - 邮件通知
   - Slack 频道
   - 钉钉群聊

智能通知规则

// 示例报警规则
{
  "conditions": [
    {
      "event.type": "error",
      "count": "> 10",  
      "time": "1 minute"
    }
  ],
  "actions": [
    {
      "type": "email",
      "targets": ["admin@example.com"]
    }
  ]
}

🆘 常见问题解决

问题1: 源码映射未生效

# 检查构建配置
echo $SENTRY_AUTH_TOKEN

# 确认上传设置
bun run build --verbose

# 手动上传源码映射
npx @sentry/cli releases files VERSION upload-sourcemaps ./build

问题2: 过多噪音报警

// 过滤不重要的错误
beforeSend(event) {
  // 忽略网络错误
  if (event.exception?.values?.[0]?.type === 'NetworkError') {
    return null
  }
  
  // 忽略开发环境错误
  if (process.env.NODE_ENV === 'development') {
    return null
  }
  
  return event
}

问题3: 性能影响

// 调整采样率
tracesSampleRate: process.env.NODE_ENV === 'production' ? 0.1 : 1.0,

// 异步上报
async: true,

// 批量上报
transport: Sentry.makeBrowserOfflineTransport(Sentry.makeFetchTransport)

📎 延伸阅读

官方文档:

最佳实践:

工具推荐:


下一步: 配置好监控后,查看 [测试指南]./testing) 了解如何编写自动化测试。