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

完整攻略如下:

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日

相关文章

  • Ext JS框架中日期函数的用法及日期选择控件的实现

    Ext JS框架中提供了丰富的日期函数和日期选择控件,可以用于方便地处理日期相关的逻辑和交互。下面将分别详细介绍它们的用法和实现方式。 日期函数的用法 获取当前日期和时间 获取当前日期和时间可以使用 Ext.Date.now() 函数。它返回当前的时间戳,即距离1970年1月1日0时0分0秒的毫秒数。如果要将当前时间以指定格式显示,可以使用 Ext.Date…

    JavaScript 2023年6月10日
    00
  • FileSystemObject 示例代码

    我将为您详细讲解“FileSystemObject 示例代码”的完整攻略。 标题 在阐述 FileSystemObject 示例代码的过程中,我们需要先介绍 FileSystemObject 对象,然后再给出一些示例代码。 FileSystemObject 对象 FileSystemObject 对象是 JavaScript 中的一个内置对象,用于访问文件系…

    JavaScript 2023年6月11日
    00
  • JavaScript中如何判断对象是否为空的方法

    JavaScript中判断对象是否为空可以通过以下方法: 使用Object.keys()方法判断对象是否为空 Object.keys()方法可以返回一个由指定对象的所有可枚举属性组成的数组,如果对象没有任何可枚举的属性,则返回空数组,因此可以通过判断Object.keys()方法返回的数组长度是否为0来判断对象是否为空。 示例代码: const emptyO…

    JavaScript 2023年6月10日
    00
  • countUp.js实现数字滚动效果

    下面我将详细讲解“countUp.js实现数字滚动效果”的完整攻略。 什么是countUp.js countUp.js是一个轻量级的JavaScript库,它可以帮助开发者实现数字滚动效果,使数字以动画的形式逐步增加到目标值。 应用场景 countUp.js常用于数字计数器、数据统计、商品价格展示等需要数字动态变化的场景。 使用方法 步骤一:引入countU…

    JavaScript 2023年6月11日
    00
  • jQuery实现批量判断表单中文本框非空的方法(2种方法)

    下面是详细的攻略: 一、背景说明 在Web开发中,经常需要对表单信息进行数据验证,比如判断某些必填项是否为空。本文将介绍两种使用jQuery实现批量判断表单中文本框非空的方法。 二、方法一 方法一利用each方法遍历表单中的文本框,然后判断每个文本框是否为空。示例代码如下: var flag = true; // 表单验证flag $(":text…

    JavaScript 2023年6月10日
    00
  • JS数组求和的常用方法总结【5种方法】

    下面是JS数组求和的常用方法总结【5种方法】的详细攻略: 1. 普通循环求和 利用循环遍历数组中的每一个元素,并累加求和。具体代码如下: function sum(arr) { let result = 0; for (let i = 0; i < arr.length; i++) { result += arr[i]; } return result…

    JavaScript 2023年5月27日
    00
  • 浅析javascript操作 cookie对象

    浅析javascript操作cookie对象 什么是cookie cookie是指存储在用户计算机上的小文件。当访问某个网站时,网站可能会在用户计算机上存储cookie。当用户再次访问该网站时,服务器读取该cookie,并可以根据cookie中的信息对用户进行跟踪、识别、验证等操作。 为什么要使用cookie cookie是记录用户在网站上的活动,保持用户状…

    JavaScript 2023年5月27日
    00
  • js中encode、decode的应用说明

    JS中encode、decode的应用说明 在实际开发中,我们经常会用到编码、解码这样的功能。比如将字符串进行URL编码,或者将JSON对象进行base64编码等等。在Javascript中,我们可以使用encodeURI、encodeURIComponent、decodeURI、decodeURIComponent等方法来进行编码解码的操作。 encode…

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