Qiankun Sentry 监控异常上报无法自动区分项目解决

yizhihongxing

完整攻略如下:

Qiankun Sentry 监控异常上报无法自动区分项目解决

问题描述

在使用 Qiankun 进行微前端架构开发时,可能会出现 Sentry 监控异常上报无法自动区分项目的问题。具体表现为:在一个微应用抛出异常,异常信息被上报到了主应用的 Sentry 中,而无法定位到哪个微应用抛出了异常。

原因分析

这个问题的根本原因是 Sentry 是一个全局的异常监控系统,而 Qiankun 是一个微前端架构,各个微应用通过装载到主应用中实现合作。由于 Sentry 是全局的,因此所有微应用的异常都会被上报到同一个 Sentry 项目中,无法区分。

解决方案

为了解决这个问题,我们需要实现 Sentry 异常上报自动区分微应用法。具体解决方案如下:

  1. 在每个微应用中通过配置初始化自己独立的 Sentry 实例。
import * as Sentry from '@sentry/browser'

Sentry.init({
  dsn: 'YOUR_DSN',
  release: 'YOUR_RELEASE',
  environment: 'YOUR_ENVIRONMENT',
})
  1. 修改微应用默认的异常处理函数,以实现将异常信息上报到自己的 Sentry 项目中。
// 重写 Qiankun 默认的子应用异常处理函数
const originRender = render
render = props => {
  const { container, ...rest } = props
  // 微应用初始化时即注册全局异常处理函数
  addGlobalUncaughtErrorHandler(error => {
    Sentry.captureException(error)
  })
  return originRender({ container, ...rest })
}

示例说明

示例1

假设我们有两个微应用:微应用 A 和微应用 B。它们的域名分别为:http://localhost:8001http://localhost:8002。我们已经在 Sentry 项目中分别创建了两个对应的项目:A-ProjectB-Project。现在我们需要实现异常上报自动区分。

在微应用 A 中加入配置文件:

import * as Sentry from '@sentry/browser'

Sentry.init({
  dsn: 'YOUR_DSN_FOR_APP_A',
  release: 'YOUR_RELEASE_FOR_APP_A',
  environment: 'YOUR_ENVIRONMENT_FOR_APP_A',
})

在微应用 B 中加入配置文件:

import * as Sentry from '@sentry/browser'

Sentry.init({
  dsn: 'YOUR_DSN_FOR_APP_B',
  release: 'YOUR_RELEASE_FOR_APP_B',
  environment: 'YOUR_ENVIRONMENT_FOR_APP_B',
})

然后在主应用中加入修改的异常处理函数:

const originRender = render
render = props => {
  const { container, ...rest } = props
  addGlobalUncaughtErrorHandler(error => {
    const currentApp = qiankunUtil.getActiveMicroAppName()
    switch (currentApp) {
      case 'appA':
        Sentry.withScope(scope => {
          scope.setFingerprint(['appA', error.message])
          Sentry.captureException(error)
        })
        break
      case 'appB':
        Sentry.withScope(scope => {
          scope.setFingerprint(['appB', error.message])
          Sentry.captureException(error)
        })
        break
      default:
        Sentry.captureException(error)
        break
    }
  })
  return originRender({ container, ...rest })
}

这样,当微应用 A 抛出异常时,异常信息会被 Sentry 上报到 A-Project;当微应用 B 抛出异常时,异常信息会被 Sentry 上报到 B-Project。

示例2

我们也可以通过设置自定义标签实现监控数据的多维度分析,在这里给出一个基于自定义标签的实现方案:

  1. 在每个微应用初始化时,设置自定义标签appId为当前应用的name
import * as Sentry from '@sentry/browser'

Sentry.init({
  dsn: 'YOUR_DSN',
  release: 'YOUR_RELEASE',
  environment: 'YOUR_ENVIRONMENT',
  integrations: [
    new Sentry.Integrations.FunctionToString(),
    new Sentry.Integrations.LinkedErrors({
      key: 'reduxAction',
    }),
  ],
})

const currentMicroAppName = runtime.getName()
Sentry.configureScope(scope => {
  scope.setTag('appId', currentMicroAppName as string)
})
  1. 在主应用中的异常处理函数中加入 appId 标签。
addGlobalUncaughtErrorHandler(error => {
  Sentry.withScope(scope => {
    const currentAppId =
      qiankunUtil.getActiveMicroAppName() || (window as any).__CURRENT_MICRO_APP_NAME__ // 从 global 取
    scope.setTag('appId', currentAppId)
    Sentry.captureException(error)
  })
})

这样,我们就可以通过设置 appId 标签实现在 Sentry 后台对监控数据的多维度分析了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Qiankun Sentry 监控异常上报无法自动区分项目解决 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • JavaScript实现返回顶部按钮案例

    下面详细讲解一下“JavaScript实现返回顶部按钮案例”的完整攻略。 1. 添加HTML代码和CSS样式 首先在HTML文件中添加返回顶部按钮的HTML代码,例如: <a href="#" id="back-to-top" title="返回顶部"> <i class=&quo…

    JavaScript 2023年6月11日
    00
  • javascript 数字格式化输出的实现代码

    接下来我将详细讲解JavaScript数字格式化输出的实现代码。 什么是数字格式化输出? 数字格式化输出是指将数字按照一定规则进行格式化输出,例如:将数字按照千位分隔符输出、将小数保留指定位数输出、将数字转换为货币格式输出等。 实现方法 JavaScript提供了内置的方法来对数字进行格式化输出,即Number.prototype.toFixed()、Int…

    JavaScript 2023年5月28日
    00
  • 5天学会asp

    5天学会ASP完整攻略 ASP是一种基于服务器端脚本语言的Web开发技术,使用ASP可以轻松构建动态网站和Web应用程序。如果你想在5天时间内掌握ASP技术,下面是具体的学习攻略: Day 1:入门 先了解ASP的基础知识,可以查看一些相关的文章或者教程,例如MDN web文档等 安装IIS(Internet Information Services)Web…

    JavaScript 2023年6月10日
    00
  • JavaScript生成二维码图片小结

    使用JavaScript生成二维码图片可以方便地分享一些跨平台内容,比如网址、联系方式、文本等等。下面是一个详细的攻略: 安装qrcode库 在使用JavaScript生成二维码图片之前,我们需要先安装相应的库。这里我们使用qrcode库,它可以非常方便地生成二维码图片。在命令行中输入以下命令进行安装: npm install qrcode –save 导…

    JavaScript 2023年6月10日
    00
  • vue element动态渲染、移除表单并添加验证的实现

    下面我会详细讲解“vue element动态渲染、移除表单并添加验证的实现”的完整攻略。 在vue element中实现动态渲染、移除表单并添加验证的步骤如下: 第一步:引入element-ui组件库和相关模块 在vue项目中,我们首先需要引入element-ui组件库和相关模块以使用其中的表单组件和表单验证功能。 <template> <…

    JavaScript 2023年6月10日
    00
  • 如何通过JS实现日历简单算法

    下面我将详细讲解如何通过JS实现日历简单算法的完整攻略。 实现思路 通过JS实现日历算法的基础思路是计算出每个月份的天数,以及每个月份的第一天是星期几,然后将这些信息展示到日历中。 代码实现 以下是通过JS实现日历算法的完整代码示例: function getDaysInMonth(year, month) { return new Date(year, m…

    JavaScript 2023年5月27日
    00
  • javascript asp教程第十一课–Application 对象

    JavaScript ASP 教程第十一课 — Application 对象 什么是 Application 对象 ASP 的 Application 对象是服务器端的全局对象,用于存储应用程序全局数据并使多个用户共享这些数据。Application 可以在 ASP 应用程序的任何页面中访问,因此非常有用。 如何使用 Application 对象 设置 A…

    JavaScript 2023年5月27日
    00
  • PHP rawurlencode与urlencode函数的深入分析

    PHP rawurlencode与urlencode函数的深入分析 概述 在网络传输过程中,由于URL不能包含特殊字符,因此需要将URL中的特殊字符进行编码转义。PHP提供了两个函数用于URL编码转义:urlencode()和rawurlencode()。本文将深入分析这两个函数的运行机制及不同之处,以及在什么情况下使用它们。 urlencode() url…

    JavaScript 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部