首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >CodeBuddy 赋能智慧航道:Vue3 项目集成 Sentry 实现全链路错误监控

CodeBuddy 赋能智慧航道:Vue3 项目集成 Sentry 实现全链路错误监控

原创
作者头像
china马斯克
修改2025-09-26 16:42:37
修改2025-09-26 16:42:37
2930
举报

友友们,早上好啊。今天继续AI工具实战系列。我将分享最近几个月使用ai工具用于工作的那些事。既是一次知识的分享,又是一次自我的一次总结,也希望自己的一些使用经验可以帮助到大家。下面正文开始

本期我主要想分享如何实现项目中的错误监控。

一、智慧航道监控需求背景

在长江智慧航道数字化管理平台(Vue3 + Vite架构)开发中,按照领导要求需要增加错误监控集成,满足以下核心需求:

  1. 全类型错误捕获:涵盖航道传感器数据解析的JS运行时错误、水文API请求错误、电子航道图组件渲染错误。
  2. 上下文信息增强:上报的数据需包含船舶MMSI码(用户标识)、航道区段ID、设备类型等业务上下文。
  3. 安全合规要求:敏感信息(如Sentry DSN)必须通过环境变量管理,支持开发/测试/生产三环境隔离。

二、技术选型与工具

和前面一样,简单介绍一下工具和技术栈

  • 前端框架:Vue3 Composition API + Pinia状态管理
  • 监控体系:Sentry SDK 7.0(@sentry/vue + @sentry/tracing)
  • AI协作工具:CodeBuddy
  • 特色场景:电子航道图(Mapbox GL集成)、船舶AIS数据实时解析

三、实现步骤

步骤 1:安装 Sentry 依赖

向 CodeBuddy 输入需求:

“为 Vue3 项目安装 Sentry SDK,需支持错误追踪和性能监控。”

提出问题
提出问题

AI 生成命令

代码语言:txt
复制
npm install @sentry/vue @sentry/tracing

步骤 2:初始化 Sentry(含环境变量配置)

需求输入

“在 main.js 中初始化 Sentry,DSN 从环境变量VITE_SENTRY_DSN读取,环境标识为import.meta.env.MODE。”

AI 生成代码

代码语言:txt
复制
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import * as Sentry from '@sentry/vue';
import { Integrations } from '@sentry/tracing';

const app = createApp(App);

Sentry.init({
  app,
  dsn: import.meta.env.VITE_SENTRY_DSN,  // 从环境变量读取
  environment: import.meta.env.MODE,      // 开发/生产环境标识
  integrations: [
    new Integrations.BrowserTracing(),     // 性能监控(可选)
  ],
});

app.mount('#app');

关键点

  • 使用 import.meta.env 避免 DSN 硬编码,符合安全最佳实践。
  • environment 字段帮助在 Sentry 后台区分环境。

步骤 3:配置 Axios 拦截器捕获请求错误

测试问题

“Axios 请求 404 错误未上报到 Sentry。”

修改问题
修改问题

AI 诊断与修复

  • 问题原因:默认仅捕获网络错误(如断网),需在响应拦截器中主动上报 HTTP 错误。
  • 修正代码
代码语言:txt
复制
// src/utils/axios.js
import axios from 'axios';
import * as Sentry from '@sentry/vue';

const api = axios.create();

// 响应拦截器
api.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response && error.response.status >= 400) {
      Sentry.captureException(error, {
        tags: { type: 'axios' },
        extra: { url: error.config.url, status: error.response.status },
      });
    }
    return Promise.reject(error);
  }
);

export default api;

效果

  • 所有 4xx/5xx 错误均会触发 Sentry 上报,并附加请求 URL 和状态码。

步骤 4:配置 Vue 错误处理器

需求输入

“捕获 Vue 组件渲染错误(如v-if条件错误)并上报。”

AI 生成代码

代码语言:txt
复制
// main.js(在 Sentry.init 后添加)
app.config.errorHandler = (err, vm, info) => {
  Sentry.captureException(err, {
    tags: { type: 'vue' },
    extra: { component: vm?.$.type?.name, info }, // 上报组件名和错误位置
  });
};

步骤 5:动态添加用户信息

需求补充

“用户登录后,将用户 ID 和用户名添加到 Sentry 上下文。”

继续提问
继续提问

AI 方案

代码语言:txt
复制
// 登录成功后调用
function onLoginSuccess(userId, username) {
  Sentry.setUser({ id: userId, username });
}

// 登出时清除
function onLogout() {
  Sentry.setUser(null);
}

原理

  • Sentry.setUser 会将用户信息附加到后续所有错误事件中。

下面我们来看关键代码

1. 环境变量配置

在项目根目录创建三环境配置文件:

代码语言:txt
复制
# .env.development
VITE_SENTRY_DSN=https://xxxx@o123456.ingest.sentry.io/1234567
VITE_SENTRY_ENV=development
VITE_MAP_REGION=dev-yangtze

# .env.production
VITE_SENTRY_DSN=https://xxxx@o123456.ingest.sentry.io/7654321
VITE_SENTRY_ENV=production
VITE_MAP_REGION=prod-yangtze

2. Sentry初始化

代码语言:txt
复制
import { createApp } from 'vue'
import * as Sentry from '@sentry/vue'
import { BrowserTracing } from '@sentry/tracing'
import App from './App.vue'
import router from './router'

const app = createApp(App)

Sentry.init({
  app,
  dsn: import.meta.env.VITE_SENTRY_DSN,
  environment: import.meta.env.VITE_SENTRY_ENV,
  integrations: [
    new BrowserTracing({
      routingInstrumentation: Sentry.vueRouterInstrumentation(router),
      // 自定义航道业务追踪
      tracePropagationTargets: [
        '/api/hydrology/*',
        '/api/ais-data/*',
        '/map-tiles/*'
      ]
    })
  ],
  // 自定义错误分组关键字段
  fingerprint: ['{{ default }}', '{{ url }}', '{{ user.id }}'],
  // 初始上下文(航道区段)
  beforeSend(event) {
    event.tags = {
      ...event.tags,
      mapRegion: import.meta.env.VITE_MAP_REGION
    }
    return event
  }
})

3. Axios拦截器增强(

创建src/utils/sentryAxios.js:

代码语言:txt
复制
import axios from 'axios'
import * as Sentry from '@sentry/vue'

const api = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL
})

// 请求拦截器:添加航道业务标识
api.interceptors.request.use(config => {
  const vesselId = localStorage.getItem('currentVesselId')
  if (vesselId) {
    config.headers['X-Vessel-Id'] = vesselId
  }
  return config
})

// 响应拦截器:错误上报增强
api.interceptors.response.use(
  response => response,
  error => {
    if (error.response) {
      const { status, data } = error.response
      // 自定义航道业务错误码处理
      if (status >= 400) {
        Sentry.captureException(error, {
          tags: {
            apiEndpoint: error.config.url?.split('?')[0],
            errorCode: data?.code || status
          },
          extra: {
            requestParams: error.config.params,
            responseData: data
          }
        })
      }
    }
    return Promise.reject(error)
  }
)

export default api

4. Vue错误处理器

在main.js中添加全局错误处理:

代码语言:txt
复制
// 捕获未处理的组件错误
app.config.errorHandler = (err, instance, info) => {
  Sentry.captureException(err, {
    tags: {
      component: instance?.__name || 'AnonymousComponent',
      errorType: info,
      // 标记是否为电子航道图组件
      isMapComponent: instance?.$options?.name?.includes('Map')
    },
    contexts: {
      // 添加航道业务上下文
      vessel: {
        id: localStorage.getItem('currentVesselId'),
        name: localStorage.getItem('currentVesselName')
      },
      channelSection: localStorage.getItem('currentSectionId')
    }
  })
}

// 捕获未处理的Promise错误
window.addEventListener('unhandledrejection', event => {
  Sentry.captureException(event.reason, {
    tags: {
      errorType: 'unhandledRejection'
    }
  })
})

5. 用户上下文管理(船舶AIS数据关联)

创建src/utils/sentryUser.js:

代码语言:txt
复制
import * as Sentry from '@sentry/vue'

export function setVesselContext(vesselId, vesselName) {
  Sentry.setUser({
    id: vesselId,
    username: vesselName,
    // 扩展航道业务字段
    vesselType: localStorage.getItem('vesselType'),
    mmsi: vesselId // 船舶MMSI码作为唯一标识
  })
  
  // 添加航道区段标签
  Sentry.setTag('channelSection', localStorage.getItem('currentSectionId') || 'unknown')
}

// 在船舶登录成功后调用
export function initVesselSession() {
  const vesselId = localStorage.getItem('currentVesselId')
  if (vesselId) {
    setVesselContext(vesselId, localStorage.getItem('currentVesselName'))
  }
}

四、测试验证方案

测试用例设计

测试设计
测试设计

结果

五、经验总结

最后简单总结一下经验,总的来说,我们在生成代码时,想让生成的代码更合用,首先得把需求说清楚,尤其要带上业务相关的词,比如 “电子航道图组件”,就像说 “给 Vue3 的航道项目装 Sentry,得能抓到 Mapbox GL 组件的错误”,这样出来的代码才更符合。还有安全方面要注意,要是写代码时把 DSN 直接硬敲进去,CodeBuddy 会自动提醒你改成用环境变量;像船舶位置这种敏感数据,上报之前也得先处理下,把隐私信息遮掉。

另外,想让错误追踪更贴合航道业务,还能这么做:用 beforeSend 和 tags 给错误加个 “航道专属标识”,再用 fingerprint 自己定个错误分组规则,别让差不多的错误散得到处都是。最后说性能监控,还能再扩展下 —— 集成 Sentry Performance,看看航道数据加载要花多久;像解析 AIS 数据这种关键步骤,也可以自己加个事务追踪,盯着它的运行情况。通过 CodeBuddy 的辅助,我们高效完成了 Vue3 项目与 Sentry 的深度集成。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、智慧航道监控需求背景
  • 二、技术选型与工具
  • 三、实现步骤
    • 步骤 1:安装 Sentry 依赖
    • 步骤 2:初始化 Sentry(含环境变量配置)
    • 步骤 3:配置 Axios 拦截器捕获请求错误
    • 步骤 4:配置 Vue 错误处理器
    • 步骤 5:动态添加用户信息
    • 1. 环境变量配置
    • 2. Sentry初始化
    • 3. Axios拦截器增强(
    • 4. Vue错误处理器
    • 5. 用户上下文管理(船舶AIS数据关联)
  • 四、测试验证方案
    • 测试用例设计
    • 结果
  • 五、经验总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档