Sentry介绍与使用 - Issues模块

news2024/11/26 3:40:49

这篇文章是我在公司做 Sentry 相关分享的演讲稿。

大家好,现在由我来讲解 Sentry 的 Issues (问题)模块。我会分为三个部分来讲,首先我会介绍 Sentry 一些重要的概念,然后讲一下 Issues 的基本使用方式,最后是 Issues 的基本实践。

基本介绍

在开始讲解前,我们先来眼熟一下 Issues 模块的界面。

img_v3_025i_28b983c9-b909-4bec-8c09-44d88086195h.jpg

当我们在菜单上选中 Issues(问题) 以后,就可以看到 Issues 界面。整个界面可以分为三个部分,分别是:

  • 不同状态 Issues 的 Tab切换
  • 筛选栏,用来筛选 Issues
  • Issues 列表

Issue & Event

在 Sentry 的产品逻辑里,一条日志叫 Event,内容相似的 Event 会被聚合成一个 Issue ,也就是我们在界面上看到的Issues 列表。另外 Sentry 提出了“指纹”的概念,Sentry 会根据日志的堆栈信息、异常类型和日志信息等去计算两条日志是否拥有同样的指纹,拥有同样指纹的 Event 会被聚合成一个 Issue 。

如果你想自行对 Event 进行合并,那么可以尝试以下方法:

  • 在 Issues 界面对 Issue 进行手动合并

img_v3_025i_2a5a308a-b994-40dc-a348-d51f4aebcbch.jpg

  • 自定义指纹规则

[Project] > Settings > Issue Grouping > Fingerprint Rules

img_v3_025i_9dbcd88c-aa5d-4fdf-b808-f1d08126d6eh.jpg

例如截图所示,所有错误类型为 ConnectTimeout 的 Event 都会得到一个叫 connect-timeout-type 的指纹,并且这些 Event 会被聚合到一个 Issue 下。

  • 日志上报时给日志加指纹
Sentry.withScope(function (scope) {
    scope.setFingerprint(['aaatest'])
})
Sentry.init({
  // ...
  beforeSend(event, hint) {
    const error = hint.originalException;
    if (
      error &&
      error.message &&
      error.message.match(/database unavailable/i)
    ) {
      event.fingerprint = ["database-unavailable"];
    }
    return event;
  },
});

Sentry 对日志做 Issue 和 Event 维度的划分,我觉得好处在于:一般我们线上的 bug 会同时影响到很多用户,那么这些用户报上来日志量很大并且内容相似,Sentry 帮我们对相似日志做了一个聚合,这样我们能更快的筛选到我们想看的日志。

SDK的接入与使用

这里以 Web 端的 Vue 项目为例子,我们需要安装的依赖包有:

"dependencies": {
    "@sentry/integrations": "^7.47.0", // 一些集成功能
    "@sentry/vue": "^7.47.0", // 获取sentry实例
}

然后我们要在项目里定义一份 Sentry 的配置文件:

import Vue from 'vue'
import * as Sentry from '@sentry/vue'
import { Plugin } from '@nuxt/types'
import { HttpClient as HttpClientIntegration } from '@sentry/integrations'

const plugin: Plugin = (ctx) => {
  const { app, store } = ctx
  Sentry.init({
    // 项目设置里取
    dsn: '', // 如果传空或不传则不会上报任何 Sentry 错误
    Vue,
    environment: process.env.APP_ENV,
    // 上报日志前的钩子
    beforeSend(event: any) {
      return event
    },
    // 用户行为放入面包屑前的钩子
    beforeBreadcrumb(breadcrumb, hint) {
      return breadcrumb
    },
    integrations: [], // 一些集成功能
  })
}

export default plugin

问题分类

img_v3_025i_27cab527-cf01-4eec-82b0-53f9b891107h.jpg

  • 所有未解决的 ( is:unresolved):所有未解决的问题
    • 新的(is:new):7天之内被创建的问题
    • 进行中的(is:ongoing):7天之前被创建的问题或者手动标记为已经看过的的问题
  • 待审查 ( is:unresolved is:for_review):还没有查看过的问题,待审查问题是所有未解决问题的子集。
  • 回归 ( is:regressed):解决了再次出现的问题。
  • 不断升级 ( is:escalating):当事件数量明显高于前一周时,sentry将问题定义为不断升级。
  • 已存档 ( is:archived):所有已存档的问题。

问题筛选

Issues 查询有4个筛选项,分别是项目、环境、日期和自定义。自定义通过 key:value 的的形式进行搜索。支持的key有:

11111-0984240.jpeg

20231126-154028.jpeg

自定义搜索如果存在多对 key:value ,那么只有满足所有 key:value 条件的 Issue 会被搜索出来。

另外,自定义搜索不能使用 OR 或者 AND 语句,但是可以使用 ! 语句:

image-20231126155028485.png

除了上述的 key,Sentry 还内置了一些 tags 用来搜索:

image-20231126155112694.png

当然我们也可以自定义 tag ,然后用这些 tag 来搜索:

Sentry.init({
	beforeSend(event: any) {
		event.tags = {
  		...event.tags,
    	language: 'en-US'
  	}
  	return event
	}
})

image-20231126160032252.png

SDK 在上报日志前会暴露一个叫 beforeSend 的钩子,我们可以在这个钩子里添加自定义的 tag 。

问题详情

我们在 Issues 界面点开一条 Issue 就可以看到当前 Issue 最新上报的那条日志。

纵观整个 Issue 详情页,可以分为以下几个部分:

  • 日志摘要
  • 代码报错堆栈
  • 面包屑
  • 回放(Replays)

面包屑

启用面包屑的方式:

Sentry.init({
	integrations: [
      // 启用面包屑
      new Sentry.Integrations.Breadcrumbs({
        console: true
      })
  ],
})

面包屑会自动记录的行为有:

  • console
  • dom 操作(比如点击元素)

image-20231126161755934.png

  • Fetch 请求

image-20231126161953565.png

  • 浏览器路由跳转

img_v3_025i_77435bc0-0e7e-4882-8aa6-2a75f864132h.jpg

  • Sentry 自身的行为(比如上报日志)
  • XHR 请求

img_v3_025i_18ed5a0d-4d97-4483-a360-2842db30fech.jpg

可以看到,网络请求相关的用户行为,Sentry 只会主动记录 request_body_sizeresponse_body_size 两个字段。但是一般我们更希望可以看到请求的响应头和响应体,那么这时候我们可以自行修改面包屑记录的数据:

Sentry.init({
  // ...
  beforeBreadcrumb(breadcrumb, hint) {
   if (breadcrumb.category === 'xhr' && breadcrumb.data) {
      breadcrumb.data.response = hint?.xhr.response
     	breadcrumb.data.responseHeaders = hint?.xhr.getAllResponseHeaders()
    }
    return breadcrumb;
  },
})

Sentry SDK会暴露一个叫 beforeBreadcrumb 的钩子,我们可以在这个钩子里对 Sentry 即将记录的用户行为做一些更改。beforeBreadcrumb 包含两个参数,第一个参数 breadcrumb 是 Sentry 已经整理好的一条面包屑数据,第二个参数 hint 则是 Sentry 额外采集到的一些数据。比如对于 XHR 请求,我们可以在 hint 参数里拿到 xhr 对象,这样我们就可以获取到请求的响应头和响应体。

回放(Replays)

回放是 Web 端独有的功能。回放并不是视频录制,而是把面包屑里的用户行为串起来,是对用户行为类似于视频的再现。

回放界面如下图所示,整个界面左半部分为回放,右半部分为用户行为列表:

image-20231126164346287.png

可以看到 Sentry 自动对回放内容做了敏感信息处理,我们并不能通过回放看到用户在页面上填写的内容。

回放开始录制的方式:

// 第一种:在配置文件设置采样比例,Sentry 自动录制
Sentry.init({
		integrations: [
    	new Sentry.Replay()
    ],
    // This sets the sample rate to be 10%. You may want this to be 100% while
    // in development and sample at a lower rate in production
    // 采样率
    replaysSessionSampleRate: 0.1,
    // If the entire session is not sampled, use the below sample rate to sample
    // sessions when an error occurs.
    // 错误采样率
    replaysOnErrorSampleRate: 1.0,
})

// 第二种:手动开始录制
replay.stary()

回放结束录制的方式:

  • 用户超过15分钟在页面上没有操作,则自动结束录制。
  • 录制时间超过60分钟,则自动结束录制。
  • 手动调用 replay.stop()

最佳实践

前面我们已经介绍了 Issues 模块的基本概念和使用方式,现在我们来看看在实际开发中,我们如何通过 Issues 模块去定位问题和解决问题。

不管是使用哪个监控系统,我们对项目异常的处理流程都是:找到异常对应的日志 --> 根据日志定位问题 --> 分配问题修复人 --> 解决问题。

比如现在我们有一个bug,在首页点击搜索的时候没有跳转到搜索结果页,那么我们需要用 Sentry 做以下事情:

  1. 根据问题发生的大概时间、报错信息以及自定义 tag 等筛选出对应的 Issue:

img_v3_025i_a1be3002-7c77-42fb-a5b0-60ee66ea4ddh.jpg

  1. 根据代码报错堆栈定位报错的代码文件

img_v3_025i_da440a76-43a6-4842-b196-8c570eab8d0h.jpg

根据报错堆栈我们可以知道是 jrpass-search.vue 文件的 search 方法出现了错误。

  1. 根据面包屑找到出错数据的获取源头

  2. 指派修复人

image-20231126170610879.png

  1. 修复完成后扭转问题状态

img_v3_025i_18ae942e-a9da-4c5d-a454-77d91e6bb04h.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1255252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】线程池的简单实用

1、什么是线程池 Java当中,为了规避频繁创建调度进程的开销,我们引入了线程。但是如果进一步提高创建销毁频率,线程的开销也不容忽视。 对此我们有两个解决方案 协程(轻量级线程):相比线程,把…

Cache学习(4):Cache分配策略Cache更新策略Cache逐出策略

Cache的数据流 常用名词 Allocation 分配Eviction 驱逐分配策略和更新策略分别为当产生Cache miss和Cache hit的时候数据流的具体行为 1 Cache分配策略(Cache Allocation Policy) Cache的分配策略是指不同情况下为数据分配Cache Line的不同行为。Cac…

2018年8月28日 Go生态洞察:Go 2草案设计初探

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

基于springboot+mysql实现的小区物业管理系统

基于springbootmysql实现的小区物业管理系统,演示地址:登录 演示账号:用户名:744621980qq.com 密码:123456,主要包含房屋管理(楼栋管理,单元管理,房屋管理),车位管理,缴费管理,社区服务( 公告管理&#xf…

2023年程序设计迎新赛(第二届个人程序设计大赛)

7-1 找规律 请从所给的四个选项中&#xff0c;选择最合适的一个填入问号处&#xff0c;使之呈现一定的规律性。 输入格式: 无 输出格式: 大写字母 输入样例: 输出样例: #include<stdio.h> int main(){printf("D");return 0; }7-2 蜡烛燃烧时间 有粗细不同…

使用HTML+CSS+JS网页设计与制作,酷炫动效科技农业网页

使用HTMLCSSJS网页设计与制作&#xff0c;酷炫动效科技农业网页。 可以用于家乡介绍、科技农业、图片画廊展示等个人网站的设计与制作。农业网站、家乡网站、农产品网站、旅游网站。 网站亮点 1、视觉设计&#xff1a;排版布局极简设计&#xff0c;优质的视觉体验等。 2、动…

java小游戏之【王者荣耀】

首先创建一个新的Java项目命名为“王者荣耀”&#xff0c;并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。 代码 package com.sxt;import javax.swing.*; import java.awt.*;public class Background extends GameObject {p…

以非常规思维去做一个嵌入式音视频开发项目!

前言&#xff1a; 大家好&#xff0c;在上周的文章里面&#xff0c;给大家介绍了一个音视频项目&#xff0c;本周继续来分享音视频项目&#xff0c;之前说过&#xff0c;如果你不知道做什么功能开发嘛&#xff0c;因为接触的少&#xff1b;我突然想到&#xff0c;可以去参考市面…

win10下载Remix IDE桌面版以及空白页面的解决

文章目录 Remix IDE 的下载Remix IDE 空白页面的解决 Remix IDE 的下载 到 github 地址 https://github.com/ethereum/remix-desktop/releases 选择exe文件或根据自己电脑版本选择对应的zip文件进行下载&#xff0c;然后正常安装即可。 Remix IDE 空白页面的解决 有时打开Remix…

容器技术——Cgroup

目录 容器技术容器技术概述要区分好共享与隔离的概念容器技术的三大核心容器对比虚拟机 namespaceUnionFs容器操作系统的来源操作系统的来源完整操作系统的镜像docker image是什么&#xff1f;如何构成的 如何为容器安装操作系统UnionFS&#xff08;联合文件系统&#xff09;的…

Echart力引导依赖关系布局图

Echarts ECharts&#xff08;Enterprise Charts&#xff09;Apache ECharts是百度开发的一款开源的 JavaScript 数据可视化库。它提供了丰富的图表和图形&#xff0c;适用于在 Web 应用程序中创建各种交互式和动态的数据可视化图表。ECharts支持各种图表类型&#xff0c;包括折…

【LeetCode】挑战100天 Day17(热题+面试经典150题)

【LeetCode】挑战100天 Day17&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-192.1 题目2.2 题解 三、面试经典 150 题-193.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

Hugging Face宣布最受欢迎的AI机构,开源模型ChatGLM-6B广受认可

近日&#xff0c;Hugging Face作为开源AI社区的代表&#xff0c;总结了社区最欢迎的前15个公司和机构&#xff0c;几乎囊括了全部国内外风头正盛的AI科技机构&#xff0c;Stability AI、Meta AI、Runway占据排名前三&#xff0c;大众熟知的OpenAI、谷歌、微软也榜上有名。 其中…

算法通关村-----字符串冲刺题

最长公共前缀 问题描述 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 “”。详见leetcode14 问题分析 直观上来看&#xff0c;有竖直和水平两种方式&#xff0c;竖直方式是指我们依次比较所有字符串的第一个字符&#xff0c;…

数据库基础教程之序列自增设置(三)

点击public来选择一个模式。 选择其他-》序列。 选择新建序列。 设置序列参数&#xff08;最大值不超过2的63次方-1&#xff09;。 点击保存。 刷新序列列表&#xff0c;可以看见新建序列。 设置主键自增 打开设计表-》选中字段-》默认值设置为&#xff1a;nextval(‘log_text’…

2024年最新最全的Jmeter接口测试必会知识点:jmeter连接数据库

jmeter连接mysql数据库 大致步骤如下&#xff1a; 1、下载mysql的jar包放入到jmeter的lib下&#xff0c;然后重启jmeter 2、配置JDBC Connection Configuration 3、配置JDBC Request 4、在请求中引用查询到的结果变量&#xff0c;可以结合计数器取每一个结果值&#xff1a…

【代码随想录刷题】Day18 二叉树05

文章目录 1.【513】找树左下角的值1.1题目描述1.2 解题思路1.2.1 迭代法思路1.2.2 递归法思路 1.3 java代码实现1.3.1 迭代法java代码实现1.3.2 递归法java代码实现 2. 【112】路径总和2.1题目描述2.2 解题思路2.3 java代码实现 3.【106】从中序与后序遍历序列构造二叉树3.1题目…

04:2440---内存控制器

目录 一:介绍 1:引入 2:概念 3:通信 A:片选信号 B:片选信号的地址空间范围 ​​​​ 4:地址线 A:不同位数的接法 B:访问原理 C:访问地址 5:时序 1:NOR FLASH A:2440NOR FLASH时序 B:原理/时序图 C:寄存器 6:SDARM A:访问方式 B:原理图 C:BWSCON D:BANKCON…

DDD落地:从阿里单据系统,看DDD在大厂如何落地?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

Android系统新特性——功耗的改进

移动设备的续航时间无疑是所有用户都非常在意的。我们都希望自己的手机一次充电可以使用更长的时间。但遗憾的是&#xff0c;近几年移动设备的电池元件一直没有重大的技术突破。并且&#xff0c;随着硬件性能的提升却带来了更多的电量消耗。 如果对比近几年的Android和ios手机&…