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日

相关文章

  • PHP图片验证码制作实现分享(全)

    关于“PHP图片验证码制作实现分享(全)”的完整攻略,具体分为以下几部分: 1. 概述 首先介绍验证码的作用:验证用户输入信息的真实性,防止恶意注册和登录等安全问题。随后简单介绍实现验证码的方式和常用语言。 2. 实现思路 为了实现图形验证码,需要在PHP中进行处理。图形验证码的实现会用到php的image、mt_rand()以及session等核心库函数和…

    JavaScript 2023年6月10日
    00
  • SSM框架整合JSP中集成easyui前端ui项目开发示例详解

    我将详细讲解“SSM框架整合JSP中集成easyui前端ui项目开发示例详解”的完整攻略。 SSM框架整合JSP中集成easyui前端ui项目开发示例详解 简介 本文将介绍如何在使用SSM框架的JSP项目中集成easyui前端UI,从而开发出更为美观的前端页面。 准备工作 在开始前,需要确保已经完成以下准备工作: 了解SSM框架的基本概念和配置方法。 了解e…

    JavaScript 2023年6月11日
    00
  • jQuery表单验证插件formValidator(改进版)

    jQuery表单验证插件formValidator(改进版)攻略 一、简介 jQuery表单验证插件formValidator是一款实用的前端验证插件,可以方便地验证表单输入是否符合指定的规则,从而提高用户输入数据的准确度,避免非法数据被提交。经过改进的formValidator拓展了原版的功能,增加了新的验证规则,如密码强度验证、手机号码验证等,同时去除了…

    JavaScript 2023年6月10日
    00
  • js针对图片加载失败的处理方法分析

    “js针对图片加载失败的处理方法分析”是前端开发中常见的问题之一。下面我会为大家详细讲解一下如何处理图片加载失败的情况。具体攻略分为以下几步: 1. 在HTML中添加图像元素 我们可以在HTML中通过添加<img>元素来加载图片,通常的写法为: <img src="图片地址" alt="图片描述"&g…

    JavaScript 2023年5月28日
    00
  • 微信小程序保持session会话的方法

    下面我将为你详细介绍微信小程序保持 session 会话的方法。 什么是 session session 是指客户端和服务器之间的交互状态,可以理解为身份验证或登录状态的一种维持方式。常见的维持 session 的方法有 cookie 和 token。 微信小程序 session 微信小程序中,可以通过 wx.request 方法向服务器发送请求并维持 se…

    JavaScript 2023年6月11日
    00
  • JavaScript 原型继承

    JavaScript 原型继承 JavaScript 原型继承是一种非常重要的概念,相较于传统的面向对象语言中的继承,JavaScript 通过原型继承来实现对象之间的属性和方法的共享,它是 JavaScript 中最为灵活的一种继承方式。 定义 JavaScript 中的每个对象(除了 null)都有一个原型对象,原型对象可以通过 Object.getPr…

    JavaScript 2023年6月10日
    00
  • 突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习

    突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习 介绍 本篇文章主要介绍HTML5中地理信息服务及地理位置API的使用,其中包括了以下内容:1. 地理信息服务的概述2. 地理位置API的基本知识和使用方法3. 常用的地理位置API实例 地理信息服务概述 地理信息服务是指向用户提供有关地理位置信息及相关服务的技术和应用。在H…

    JavaScript 2023年6月11日
    00
  • 常用的Javascript设计模式小结

    下面是针对“常用的Javascript设计模式小结”的完整攻略: 常用的Javascript设计模式小结 什么是设计模式? 设计模式是解决一类问题的经验总结和传递,它不是具体的代码实现,而是解决问题的一种思想方式。在开发中,我们可以借助设计模式来提高代码可读性、可维护性和可扩展性。 Javascript中常用的设计模式 在Javascript中,常用的设计模…

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