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日

相关文章

  • js实现一个页面多个倒计时的3种方法

    JS实现一个页面多个倒计时的3种方法 在一个网站中,可能会涉及到多个倒计时的展示,比如商品秒杀、优惠活动等。这时候,就需要实现一个页面中多个倒计时的效果。下面我们来介绍三种方式来实现这个功能。 方法一:使用setInterval()方法 setInterval()方法可以在指定的时间间隔(repeatTime)内,反复执行某个函数(fn)。我们可以利用set…

    JavaScript 2023年6月11日
    00
  • JavaScript的Backbone.js框架入门学习指引

    JavaScript的Backbone.js框架入门学习指引 什么是Backbone.js框架? Backbone.js是轻量级的JavaScript框架,用于在Web应用中提供MVC(Model-View-Controller)的结构。它被广泛应用于构建单页面应用程序(SPA)。 开始学习Backbone.js框架 为了开始学习Backbone.js框架,…

    JavaScript 2023年6月11日
    00
  • javascript判断网页是关闭还是刷新

    要判断网页是被关闭还是被刷新,需要使用onbeforeunload事件和event.currentTarget.performance.navigation.type属性。 onbeforeunload事件会在页面关闭或者刷新时被触发,可以作为判断依据。而event.currentTarget.performance.navigation.type属性在页面…

    JavaScript 2023年6月11日
    00
  • Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端

    Dwr是一个轻量级的远程调用框架,它可以帮助开发者在前端页面中方便地调用后端Java方法。在Dwr 3.0版本中,提供了完全基于注解的纯Java代码配置方式,这种方式相对于传统的XML配置方式更加简单、易用。 配置DwrServlet 首先,我们需要在web.xml文件中配置DwrServlet: <servlet> <servlet-na…

    JavaScript 2023年5月28日
    00
  • 详解JavaScript函数对象

    详解JavaScript函数对象 JavaScript中的函数是一种强大的工具,不仅可以完成简单的操作,还可以封装复杂的逻辑和数据。定义一个函数的时候,实际上是定义了一个函数对象。本文将详细讲解JavaScript函数对象,包括属性、方法、调用方式等方面。 函数对象的属性 在JavaScript中,函数是一种特殊的对象。作为一个对象,函数有自己的属性和方法。…

    JavaScript 2023年5月27日
    00
  • 详解JavaScript中var和let的区别

    详解JavaScript中var和let的区别 1. var的作用域 在ES5及其之前的版本中,我们通常使用var声明变量。在使用var声明变量时,需要注意变量的作用域。 全局作用域 当在函数外使用var声明变量时,该变量为全局变量,即便在函数内部使用,它也可以被访问到。例如: var a = 1; function test() { console.log…

    JavaScript 2023年6月10日
    00
  • javascript如何创建表格(javascript绘制表格的二种方法)

    关于“javascript如何创建表格(javascript绘制表格的二种方法)”的完整攻略,我会给你细致的讲解。这里介绍两种方法。 方法一:使用HTML table元素 在HTML中,table元素可以用来创建和显示表格的基本结构。可以在table标签内使用tr元素定义表格的各行,并在每个tr元素中使用td或th元素定义单元格。 JavaScript代码可…

    JavaScript 2023年6月10日
    00
  • JS数组方法reduce的妙用分享

    下面是“JS数组方法reduce的妙用分享”的完整攻略。 简介 JavaScript中,reduce()是一个用于数组中元素运算的方法,它接收一个回调函数作为参数,返回一个计算结果。reduce()方法可以用于对数组中的元素进行求和、求积、寻找最大、最小值等操作。 用法 reduce()方法的使用方式如下: arr.reduce(callback, init…

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