私有部署
按照官方文档来就好了,注意 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 keys
或settings->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