Sentry介绍与使用 - Issues模块

这篇文章是我在公司做 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 } = ctxSentry.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.responsebreadcrumb.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.mzph.cn/news/171936.shtml

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

相关文章

steam/csgo搬砖项目真能月入过万吗?到底真的假的

steam/csgo搬砖第三课之如何出售 steam搬砖核心原理是什么?为什么会有差价产生?buff不是更低价吗?很多小白会有这些疑问! steam搬砖指的是通过买卖csgo游戏装备赚钱的。 玩过游戏的应该就很清楚,像绝地求生&#xff…

2023年第六届传智杯程序设计挑战赛(个人赛)B组 赛后复盘

传智杯赛后复盘 大家好 我是寸铁👊 2023年第六届传智杯程序设计挑战赛(个人赛)B组 赛后复盘 喜欢的小伙伴可以点点关注 💝 1. 字符串拼接 细节:一定要清楚nextLine()和next()的区别 nextLine()是遇到回车会停下来 nex…

Linux安装jdk8【十分丝滑】

1.上传安装包到Linux💕💕💕 2.使用命令解压缩💕💕💕 tar -zxvf 压缩文件名 3.重命名💕💕💕 mv 原文件名 新的文件名 4.配置环境变量🤩🤩&…

Linux中vi常用命令-批量替换

在日常服务器日志查看中常用到的命令有grep、tail等,有时想查看详细日志,用到vi命令,记录下来,方便查看。 操作文件:test.properites 一、查看与编辑 查看命令:vi 文件名 编辑命令:按键 i&…

CountDownLatch实战应用——批量数据多线程协调异步处理(主线程执行事务回滚)

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: CountDownLatch实战应用——批量数据多线程协调异步处理(主线程执行事务…

图像分割模型及架构选型介绍(MMSegmentation|sssegmentation等)

参考: https://zhuanlan.zhihu.com/p/618226513 0. 图像分割概述 图像分割通过给出图像中每个像素点的标签,将图像分割成若干带类别标签的区块,可以看作对每个像素进行分类。图像分割是图像处理的重要组成部分,也是难点之一。随…

C++如何实现自定义的struct作为unordered_set、unordered_map的key?

有两种方法&#xff1a; 1、自定义新struct的hash函数&#xff0c;和操作符&#xff0c;使用的时候需要指定unordered_set的第三个模板参数&#xff1a; #include <iostream> #include <unordered_map>struct MyStruct {std::string name;int id;// 自定义哈希函数…

OpenGL 自学总结

前言&#xff1a; 本人是工作后才接触到的OpenGL&#xff0c;大学找工作的时候其实比较着急&#xff0c;就想着尽快有个着落。工作后才发现自己的兴趣点。同时也能感觉到自己当前的工作有一点温水煮青蛙的意思&#xff0c;很担心自己往后能力跟不上年龄的增长。因此想在工作之余…

3DCAT为华东师大设计学院打造元宇宙数字虚拟学院

6月11日&#xff0c;华东师范大学设计学院在chi K11美术馆举办了一场别开生面的 2023 年本科毕业设计暨项目实践教学现场演示展。其中&#xff0c;元宇宙数字虚拟学院&#xff08;一期&#xff09;的现场发布会引起了现场震撼&#xff0c;吸引了众多观众的目光和参与。 该元宇宙…

MYSQL 连接的使用

文章目录 前言连接介绍在命令提示符中使用 INNER JOINMySQL LEFT JOINMySQL RIGHT JOIN在PHP脚本中使用JOIN后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握…

【Windows】执行tasklist/taskkill提示“错误:找不到”或者“ERROR: not found”的解决方案

原因 由于WinMgmt异常导致起不来&#xff0c;而WinMgmt是SVCHOST进程中的WMI服务&#xff0c;解决这个问题需要停止之后再重新启动。 WinMgmt是Windows 2000客户端管理的核心组件&#xff0c;当客户端应用程序连接或当管理程序需要它本身的服务时&#xff0c;这个进程就会初始…

【挑战业余一周拿证】二、在云中计算 - 第 1 节 - 模块2 简介

第 1 节 - 模块2 简介 无论你的企业是属于像医疗、保健、制造、保险等等行业 , 再或者 , 您的服务是向全世界的数百万用户提供视频、、图片或者文字服务,你也需要服务器来为您的业务和应用程序提供支持,服务器的作用是帮助您托管应用程序并提供满足您业务需求的计算能力. 当你使…

XML Schema 的extension 元素

XML Schema 的extension 元素对complexContent、simpleContent元素进行扩展。 例如&#xff0c;下面通过增加了两个属性&#xff0c;对simpleContent进行了扩展&#xff1a; <xs:element name"condition" maxOccurs"unbounded" minOccurs"0"…

Vue框架学习笔记——计算属性

文章目录 前文提要代码需求描述插值语法实现methods实现 计算属性getter执行时间&#xff1a;setter 计算属性简写形式&#xff08;只读不改&#xff0c;才能如此简写&#xff09;slice截取元素&#xff0c;限制输入字符数量 前文提要 本人仅做个人学习记录&#xff0c;如有错…

Leetcode 2939. Maximum Xor Product

Leetcode 2939. Maximum Xor Product 1. 解题思路2. 代码实现3. 代码优化&#xff1a; 题目链接&#xff1a;2939. Maximum Xor Product 1. 解题思路 这一题思路上来说我们就是逐位进行考虑。 对于xor操作&#xff0c;显然我们只有以下两种情况&#xff1a; 00或者11&…

【brpc学习实践九】mbvar及bvar可观测

概念、学习地址 mbvar中有两个类&#xff0c;分别是MVariable和MultiDimension&#xff0c;MVariable是多维度统计的基类&#xff0c;MultiDimension是派生模板类。也是主要用来多多线程计数用的。这里用到再详细去了解即可 https://github.com/luozesong/brpc/blob/master/do…

知识的分层:know-what/how/why

知识&#xff08;knowledge&#xff09;表示知道某些信息。通常而言&#xff0c;知识是正确的&#xff0c;但不一定是完备的。知识本身有自己的适用范围&#xff0c;特别是工程技术类问题。 根据知识的类型&#xff0c;可分为三类&#xff1a; know-whatknow-howknow-why kno…

Java多线程二-线程安全

1、线程安全问题 多个线程&#xff0c;同时操作同一个共享资源的时候&#xff0c;可能会出现业务安全问题。 2、实例&#xff1a;取钱的线程安全问题 2.1、场景 小明和小红是夫妻&#xff0c;他们有个共同账户&#xff0c;余额是十万元&#xff0c;如果两人同时取钱并且各自取…

vue3-10

动态路由与菜单 路由文件 a6router.ts import { createRouter, createWebHashHistory } from "vue-router"; import { useStorage } from "vueuse/core"; import { Route, Menu } from "../model/Model8080"; const clientRoutes [{path: &q…

nginx的一些命令

linux start nginx 开启 /usr/sbin/nginx&#xff08;直接启动&#xff09; nginx -s stop 停止 /usr/local/nginx/sbin/nginx -s stop nginx -s quit 安全停止&#xff0c;保存信息 nginx -s reload 当配置信息修改&#xff0c;需要重新载入这些配置时使用此命令 nginx -s re…