Sentry的安装配置集成以及简单的使用

1.简介

Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题。它主要专注于持续集成、提高效率并且提升用户体验。Sentry 分为服务端和客户端 SDK,前者可以直接使用它家提供的在线服务,也可以本地自行搭建;后者提供了对多种主流语言和框架的支持,包括 React、Angular、Node、Django、RoR、PHP、Laravel、Android、.NET、JAVA 等。同时它可提供了和其他流行服务集成的方案,例如 GitHub、GitLab、bitbuck、heroku、slack、Trello 等。目前公司的项目也都在逐步应用上 Sentry 进行错误日志管理。

2.本地搭建sentry服务

Sentry 本身是基于 Django 开发的,而且也依赖到其他的如 Postgresql、 Redis 等组件,所以一般有两种途径进行安装:通过 Docker 或用 Python 搭建。官网下分别有以下的两个介绍:

因为在 Github 上有一个开源项目用于部署 Sentry ,所以我们这里以Docker安装为例。
要求:

  • 服务器的内存至少 3G,否则在执行 sentry upgrade 命令时会出现问题
  • Docker 19.03.6+
  • Compose 1.24.1+

我们可以直接使用该项目进行部署,首先是克隆该项目:

git clone https://github.com/getsentry/onpremise.git

会看到有一个 onpremise 文件夹。后续的操作都在这个文件夹里面,如果并没有特殊要求或者额外的组件配置的话(比如说使用已有的 Postgresql 和 redis),可以直接运行 ./install.sh 将 Sentry 及其依赖都通过 docker 安装。

cd onpremise

# 执行安装
./install.sh

后续一步一步安装下来

install.png

然后你会发现 Fetching and updating Docker images 等了几个世纪都没反应!实在是太慢了,所以我们要改成阿里云的镜像在执行 install 命令,到阿里云里面获取最新的镜像地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

image.png

根据图中的描述操作就可以替换成阿里云的镜像。然后重新跑命令./install.sh,几分钟后,我们就可以按照下图所示创建admin账户用来登陆本地sentry服务。

create.png

如果要自定义配置文件,推荐根据需求修改一下文件配置

  • config.yml
  • sentry.conf.py
  • .env w/ environment variables

以下是简单的邮件配置
Sentry 支持邮件发送的功能非常重要,当 Sentry 捕获事件之后,可以将此捕获的事件发送到你的个人邮箱(针对 Sentry 管理员账号)。要修改目前的邮件配置是不能在界面上操作的,需要进行以下步骤:
修改 sentry/config.yml文件配置

###############
# Mail Server #
###############

# mail.backend: 'smtp'  # Use dummy if you want to disable email entirely
mail.host: 'smtp'
mail.port: 25
mail.username: ''
mail.password: ''
mail.use-tls: false
The email address to send on behalf of
mail.from: 'root@localhost'

在docker-compose.yml 文件中加入以下配置

x-sentry-defaults: &sentry_defaults
  << : *restart_policy
  build:
    context: ./sentry
    args:
      - SENTRY_IMAGE
      - SENTRY_PYTHON3
  image: sentry-onpremise-local
  depends_on:
    - redis
    - postgres
    - memcached
    - smtp
    - snuba-api
    - snuba-consumer
    - snuba-outcomes-consumer
    - snuba-sessions-consumer
    - snuba-transactions-consumer
    - snuba-replacer
    - symbolicator
    - kafka
  environment:
    ...
   #这里开始
   SENTRY_EMAIL_HOST: #邮件host 例如smtp.qq.com
   SENTRY_EMAIL_USER: #邮件地址 例如testuser@qq.com
   SENTRY_EMAIL_PASSWORD: # 填写自己的密码
   SENTRY_SERVER_EMAIL: #邮件地址
   SENTRY_EMAIL_PORT: 587        # port
   SENTRY_EMAIL_USE_TLS: 'true'  

修改完以上配置后run ./install.sh
启动sentry
待./install.sh结束后,run docker-compose up -d 即可启动本地的sentry服务,你将看到以下登陆界面。

image.png

使用已经建立的admin user登陆即可,如果run ./install.sh 过程中我们没有创建用户,接下来我们可以run docker-compose run --rm web createuser 创建用户。
然后可以测试一下邮件发送。登陆超级用户下点击左上角头像选择 Admin 进入到管理员界面,选择 mail(邮箱)菜单,看到更新后的邮箱设置:

image.png

点击最下方的 发送测试邮件 到当前用户的邮箱上,即可测试邮件发送功能是否配置成功。

3.官方Sentry服务

如果要使用官方的Sentry服务,我们只需去它的官网注册就行,一般是配合企业用户使用的付费模式。

image.png

4.简单的使用

1. 创建project

  1. 登录Sentry组织
  2. 选择Projects从左侧导航菜单中显示的所有项目名单
  3. 点击+ Create Project按钮
image.png

根据您要监视的代码为您的项目选择语言或框架,在这种情况下为JavaScript。

  • 给项目一个Name。
  • 正在Set your default alert settings检查中i'll create my own alerts later
  • Assign a Team 到项目。
image.png

4.复制DSN key和方便使用,因为我们会将密钥复制到源代码中。

image.png

2.创建Alert

为每个项目创建各种警报规则,并在应用程序中发生错误时让Sentry通知何时,如何以及要通知谁。警报规则由“条件”和“操作”组成,它们在满足相关条件时执行。有关更多信息,请参阅警报。创建新项目时,可以选择使用警报规则创建该项目,该规则将在第一次出现新问题时(通过电子邮件)通知所有项目团队成员。这意味着下次发生类似错误时,由于错误不是“新的”,因此不会触发通知。

1.单击Alerts以打开“警报配置”页面
2.点击 New Alert Rule

image.png

3.在“新警报规则”表单中,选择一种Issue Alert类型并输入以下值

image.png

每当在“所有环境”中通过邮件看到事件时,新的警报规则就会通知选定的团队成员
4.点击Save Rule创建新规则

3.将Sentry SDK引入前端代码

  1. 在GitHub上打开frontend-monitoring示例代码存储库
  2. 单击Fork并选择您希望将此存储库分支到的目标GitHub帐户
  3. 派生完成后,单击Clone or download,然后复制存储库HTTPS URL
  4. 克隆项目到本地

git clone <repository HTTPS url>

5.安装SDK
Sentry通过在应用程序运行时中使用特定于平台的SDK捕获数据。要使用SDK,需要在源代码中导入并配置它。该演示项目使用React和Browser JS。最快的入门方法是使用CDN托管版本的JavaScript浏览器SDK,也可以NPM安装浏览器SDK

  • 打开index.html文件(位于./frontend-monitoring/public/下)
  • 在Sentry SDK配置中,输入DSN从上一节中创建的项目中复制的键值
Sentry.init({
  dsn: "<PASTE YOUR DSN KEY HERE>",
});
  • 启动应用
    1.打开一个shell终端,并将目录更改为frontend-monitoring项目文件夹
    2.使用该.nvmrc文件来设置与此项目兼容的Node版本。跑:
    > nvm use
    
    3.通过运行以下命令安装项目依赖项:
    > npm install
    
    4.通过运行以下命令在本地主机上构建,部署和运行项目
    > npm run deploy
    
image.png

部署成功完成后,您将在终端中看到确认信息。

5.React集成

因为Sentry使用的是一种Hook错误函数的技术,来达到捕获错误的目的,所以我们基本可以无损耗的接入到现有的项目中去。
下面是React与Sentry进行结合的核心代码

  • 自定义错误捕获的组件
#SentryBoundary.js
import { Component } from "react";
import Raven from "raven-js";

export default class SentryBoundary extends Component {
  constructor(props) {
    super(props);
    this.state = { error: null };
  }

  componentDidCatch(error, errorInfo) {
    this.setState({ error });
    // 发送错误信息
    Raven.captureException(error, { extra: errorInfo });
  }

  render() {
    if (this.state.error) {
      // 此处可以写成组件,当组件崩溃后,可以替换崩溃的组件
      console.log("React Error");
    }
    return this.props.children;
  }
}
   #index.js
Raven.config("DSN", {
  release: release,
}).install();

ReactDOM.render(
  <div>
    <SentryBoundary>
      <App />
    </SentryBoundary>
  </div>,
  document.getElementById("root")
);

Raven.js支持所有主要的浏览器。在较旧的浏览器中,Raven.js收集的错误报告的详细程度可能会降低–例如,缺少堆栈跟踪数据或缺少源代码列号。

image.png
  • 上传source-map
    如果上面的代码已经配置好后,那么现在的应用是可以捕获到错误的,但是存在了一个问题,我们目前的项目大多都使用webpack进行打包,而打包后的代码是混淆加密的代码,无法让我们准确的知道抛出错误的位置在哪里。所以我们需要上传source-map和混淆后的文件一起上传到Sentry服务器上。方便我们快速查找到问题所在的位置。
    这个上传的配置及命令是比较繁琐的。也是项目结合Sentry的一个难点。
    上传source-map目前有两种方式:
    1.使用Sentry提供的Webpack插件进行配置,但是其灵活性不高。
    Sentry提供了一个方便的Webpack插件,该插件可配置源地图并将其在构建过程中上载到Sentry。建议使用此过程将源上传到Sentry:
    npm install --save-dev @sentry/webpack-plugin
    
    初始化插件时仅绑定必需的参数:
    const SentryWebpackPlugin = require("@sentry/webpack-plugin");
    
    module.exports = {
    // other configuration
    configureWebpack: {
      plugins: [
        new SentryWebpackPlugin({
          // sentry-cli configuration
          authToken: process.env.SENTRY_AUTH_TOKEN,
          org: "exmaple-org",
          project: "example-project",
    
          // webpack specific configuration
          include: ".",
          ignore: ["node_modules", "webpack.config.js"],
        }),
      ],
     },
    };
    
    2.使用sentry-cli的,其灵活性比较高,可以针对不同项目进行单独的配置。
    其配置较为繁琐,具体的React与Sentry结合的例子。可见参见github上的项目: react-sentry-demo。对每个配置都有详细的说明。其中的上传source-map,实现了: 打包、环境检测、认证检测、上传source-map、删除本地source-map的操作,完成自动化,可以把脚本直接迁移到现有的项目中去,改动也不会太大。
    其核心上传命令如下:
    sentry-cli releases files <release_name> upload-sourcemaps /path/to/files
    

6.浅入原理

在JavaScript中是有window.onerror这个方法的,而Sentry在前端的核心捕获原理,就是通过重写此方法,来对所有的错误进行捕获。其实现的代码大致如下:

  let _winError = window.onerror;
  window.onerror = function (message, url, lineNo, colNo, errorObj) {
    console.log(`
    错误信息: ${message}
    错误文件地址: ${url}
    错误行号: ${lineNo}
    错误列号: ${colNo}
    错误的详细信息 ${errorObj}`);
  }

然后Sentry的工作就是获取非错误的数据,如: user-agent、浏览器信息、系统信息、自定义信息等信息,然后交给Sentry的生命周期函数,最后在把数据发送到Sentry服务端,进行错误信息展示。
从上面的浅入原理可以看到,其核心捕获是window.onerror。那么只要它可以捕获到的错误,都会发送到Sentry上。而window.onerror能捕获到的错误,除了Promise,基本上能在控制台出现的错误,都会捕获到。也就是运行时的错误,包括语法错误。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 上篇文章中,主要介绍了Odoo中加入Sentry来跟踪日志记录。由于国内的原因。使用Sentry官方提供的在线服务...
    F4A3阅读 12,561评论 1 4
  • 上一篇已经介绍了如何将sentry部署到本地docker, 接下来介绍如何创建项目,并在代码中如何使用,配置Sou...
    丹丹_ccd5阅读 1,845评论 0 0
  • 前言 最初的需求就是在k8s上安装sentry。之前通过自己梳理sentry工程各组件的关联关系做过一次部署。后面...
    do_young阅读 4,892评论 0 4
  • Sentry:is a realtime event logging and aggregation platfo...
    F4A3阅读 1,500评论 0 1
  • vue-cli 官网地址:https://cli.vuejs.org/zh/config/#publicpath[...
    潜渊_bc21阅读 427评论 0 0