实时异常捕获-sentry的配置和使用(兼容windows)

1,038 阅读3分钟

详见本人博客->全文点击

私有部署

按照官方文档来就好了,注意 docker 的安装不要默认用yum,yum 中的版本太低了,在docker 官网下载最新版本之后安装,同理 docker-compose 也是。注意:部署的服务器 cpu 内核必须大于 2,RAM 大于 4000M 才能部署 sentry!!

因为硬件环境,本人私有化部署没有成功,所以直接跳到使用这步,这里依赖于 sentry 官方的服务器。sentry 支持 gatsby、angular、vue、electorn 等,以下的例子用 react 举例。

安装依赖

yarn add @sentry/react
yarn add @sentry/tracing

配置项说明

项目使用 umi3 搭建的,在入口文件中添加

// app.tsx
import * as Sentry from "@sentry/react";
import { sentryConfig } from "../configs";
// ...
Sentry.init(sentryConfig);

sentryConfig 配置文件如下,配置 dsn,在projects->选择项目->setting->client keyssettings->project->选择项目->client keys中找到 dsn。

配置好 dsn 就能捕获到错误了。以下为一些配置的说明来进行定制。

// configs/config.ts
import { Integrations } from "@sentry/tracing";

export default {
    dsn:
        "https://7ebabed9823a4bc6961b6d73127db533@o552469.ingest.sentry.io/5678335",
    integrations: [new Integrations.BrowserTracing()],
    // tracesSampleRate: 1.0,
    debug: false, // 开启会打印调试信息,默认关闭;生产环境下不推荐
    release: REACT_APP_RELEASE_VERSION, // 发布版本,默认情况为环境变量中的SENTRY_RELEASE值
    environment: "prod", //设置当前环境,默认为环境变量SENTRY_ENVIRONMENT
    sampleRate: 1, // 错误事件采集率,值范围0~1,默认为1,指百分百发送错误事件
    attachStacktrace: false, // 开启会自动输出所有stack trace信息,默认关闭
    denyUrls: [], // 字符串或正则表达式组成的数组,匹配到的路由将不会发送错误信息
    allowUrls: undefined, // 匹配到的路由上的错误会发送给sentry。默认发送全部
    tracesSampler: (samplingContext: object) => {
        /*  samplingContext:
    location: Location {ancestorOrigins: DOMStringList, href: "http://localhost:8000/tracker/Regist", origin: "http://localhost:8000", protocol: "http:", host: "localhost:8000", …}
    parentSampled: undefined
    transactionContext:
    name: "/tracker/Regist"
    op: "pageload"
    trimEnd: true
    */
        // 可以在这里过滤路由
        if (samplingContext.location?.pathname?.includes("/demo")) {
            return 0;
        } else {
            return 0.1;
        }
    },
    /*----------------钩子----------------------*/
    beforeSend(evt: object, hint: object) {
        if (evt.environment !== "prod") return null; // 发送事件到服务器之前调用,可以过滤一些信息,返回null则不会发送事件
        if (hint?.originalException === "xxxxx") {
            // 可以捕获原始报错信息,对其进行处理
            evt.fingerprint = ["database-unavailable"];
        }
        return evt;
    },
};

事件实体

breadcrumbs: (3) [{…}, {…}, {…}]
environment: "prod"
event_id: "2c0b69dd0715487f8c767dbda026d0a0"
exception: {values: Array(1)}
extra: {arguments: Array(1)}
level: "error"
platform: "javascript"
request: {url: "http://localhost:8000/tracker/Regist", headers: {…}}
sdk: {name: "sentry.javascript.react", version: "6.2.2", integrations: Array(0), packages: Array(1)}
timestamp: 1616124546.59

手动集成

集成起来就需要安装 sentry-cli 来定制化更多内容,以下两种方式都可以,一个手动一个自动,但必须安装sentry-cli,windows 安装sentry-cli踩了不少坑,具体见我的踩坑记录《解决 windows 安装 sentry-cli 失败的问题》

第一种:makefile

整个流程和下面配置的文件的变量参考sentry 官方最佳实践进行配置,这里也踩了一个文档的坑,makefile 文件的变量要 export 出去才有效!!具体 makefile 文件如下:

export SENTRY_AUTH_TOKEN=xxxxxxxxxxxxxx
SENTRY_ORG=mytaccn
SENTRY_PROJECT=mytaccn

REACT_APP_RELEASE_VERSION=$(shell sentry-cli releases propose-version)

setup_release: create_release upload_sourcemaps
create_release:
	sentry-cli releases -o $(SENTRY_ORG) new -p $(SENTRY_PROJECT) $(REACT_APP_RELEASE_VERSION)
upload_sourcemaps:
	sentry-cli releases -o $(SENTRY_ORG) -p $(SENTRY_PROJECT) files $(REACT_APP_RELEASE_VERSION) \
        upload-sourcemaps ./dist/umi.js.map

执行命令

make

就上传完成了!关于上传 source-map 的文档

一些配置

release 版本号需要写入到项目中,在 makefile 中添加新一行执行脚本设置环境变量

set_env:
	yarn cross-env REACT_APP_RELEASE_VERSION=$(REACT_APP_RELEASE_VERSION) && yarn start

在项目的入口配置文件中添加该环境变量,这里用 umi 举例

import { defineConfig } from "umi";

export default defineConfig({
    //...
    define: {
        REACT_APP_RELEASE_VERSION: process.env.REACT_APP_RELEASE_VERSION,
    },
});

在 sentry 的配置中直接引用该变量就 ok 啦!

import { Integrations } from "@sentry/tracing";

export default {
    // ....
    release: REACT_APP_RELEASE_VERSION, // 发布版本
};

第二种:webpack 插件

以 chrome-extension 项目举例,因为整个应用被 chrome 隔离为 background 和 inject 两层,所以 sentry 必须要在这两层分别配置。但与上面的配置方式大同小异,只不过用 webpack plugin 集成了。

首先还是安装依赖,在项目的入口文件进行配置,与上一种方法一样,不再赘述。主要区别在于 source-map 上传方式不一样。

// webpack.conf.js的plugins上加
new SentryCliPlugin({
            include: path.resolve(
                __dirname,
                "../build/js/app.bundle.js.map"
            ),
            release: `${process.env.npm_package_version}`,
            configFile: path.resolve(__dirname, "../.sentryclirc"),
            // enviroment: process.env.NODE_ENV,
            // autoSessionTracking: process.env.NODE_ENV === "production",
        }),

持续集成配置

因为我的仓库是 github,这里用 travis 举例:文档设定好环境变量,配置下.travis.yml

jobs:
    include:
        # ...
        - name: Create release and notify Sentry of deploy
          env: SENTRY_ORG=mytaccn SENTRY_PROJECT=mytaccn SENTRY_ENVIRONMENT=production
          script: |
              curl -sL https://sentry.io/get-cli/ | bash
              export SENTRY_RELEASE=$(sentry-cli releases propose-version)
              sentry-cli releases new -p $SENTRY_PROJECT $SENTRY_RELEASE
              sentry-cli releases set-commits $SENTRY_RELEASE --auto
              yarn build
              sentry-cli releases files $SENTRY_RELEASE upload-sourcemaps ./dist/umi.js.map
              sentry-cli releases finalize $SENTRY_RELEASE
              sentry-cli releases deploys $SENTRY_RELEASE new -e $SENTRY_ENVIRONMENT