前端項目接入Sentry監(jiān)控系統(tǒng)
一、前言
場景:我們的項目在本地測試時沒有問題,but在線上運行就遇到各種奇奇怪怪的問題。相信不少小伙伴應(yīng)該都遇到過這樣的情況,為了減少對用戶的影響,引入一個線上監(jiān)控系統(tǒng)是必不可少的。
方案:對于一些大型的團隊,往往會自研一套監(jiān)控系統(tǒng)。如果團隊資源有限引入個第三方的異常監(jiān)控系統(tǒng)也是一個不錯的方案。
常用的有:博睿、神策、sentry
本文我們分享下sentry。
二、原題
本文基于:
https://github.com/getsentry/sentry
https://github.com/getsentry/sentry-javascript
https://docs.sentry.io/
效果預(yù)覽
文檔預(yù)覽
可以看出,sdk支持如下語言:
JavaScript
React-Native
Python
Ruby
PHP
Go
Rust
Java/Kotlin
Objective-C/Swift
C#/F#
C/C++
Dart
Perl
Clojure
Elixir
Unity
Laravel
Electron
what sentry
Sentry 是跨平臺的應(yīng)用程序監(jiān)控,專注于錯誤報告。
線上版本發(fā)生異常回立刻會把報錯的路由路徑、錯誤所在文件等詳細信息通知給相關(guān)人員,然后開發(fā)人員就可以利用錯誤信息的堆棧跟蹤快速定位到需要處理的問題。
環(huán)境搭建
方式一:
sentry是開源的,如果我們愿意付費的話,sentry給我們提供了方便。省去了自己搭建和維護 Python 服務(wù)的麻煩事。
方式二:
自己搭建的話,Sentry 后端服務(wù)是基于 Python 和 ClickHouse 創(chuàng)建的,需要自己使用物理機進行搭建。
具體步驟:
私有化部署官方推薦方式是通過Docker和Docker Compose部署。
為簡單起見,建議選擇使用 Docker 和 Docker Compose ,以及基于 bash 的安裝和升級腳本。
1、安裝Docker
下載Docker并進行安裝,安裝完成之后,系統(tǒng)會提示登錄輸入dockerid,可以去Docker官網(wǎng)申請一個賬號即可。安裝成功之后,可以正確的獲取版本信息。使用如下命令,即可查看對應(yīng)的版本:
docker --version
docker-compose --version
2、獲取sentry
將Sentry源碼克隆到本地,然后執(zhí)行如下命令:
git clone https://github.com/getsentry/onpremise.git
3、修改sentry配置
step1: 修改docker-compose.yml配置來適應(yīng)環(huán)境,創(chuàng)建一個名為volname的數(shù)據(jù)卷,通過-v參數(shù)可以進行創(chuàng)建,如下:
docker volume create --name=sentry-data && docker volume create --name=sentry-postgres
step2: 編譯和標記Docker服務(wù):
docker-compose build
step3: 生成密鑰,并將它添加到.env作為SENTRY_SECRET_KEY
docker-compose run --rm web config generate-secret-key
step4: 將生成的秘密串字符復(fù)制到docker-compose.yml文件對應(yīng)中并保存,然后再將生成的key復(fù)制到docker-compose.yml文件中。
environment:
SENTRY_MEMCACHED_HOST: memcached
SENTRY_REDIS_HOST: redis
SENTRY_POSTGRES_HOST: postgres
SENTRY_EMAIL_HOST: smtp
#添加如下內(nèi)容
SENTRY_SECRET_KEY : 'dvw9w+4^%+ypj1z^#e%nt#h8w1i)@it84j+&m1npujr'
step5: 執(zhí)行如下的命令更新配置
docker-compose run --rm web upgrade
4、啟動服務(wù)
使用下面的命令啟動所有的服務(wù):
docker-compose up -d
頁面效果:
use sentry
1、設(shè)置語言和時區(qū)
點擊頭像User settings - Account Details的相應(yīng)菜單設(shè)置,刷新后生效
2、建個demo
3、在項目中使用
本地起一個vue項目
# vue cli創(chuàng)建項目
$ vue create vue-sentry-test
# 選擇vue-router vue2.x
# 按照文檔安裝插件
$ yarn add @sentry/vue @sentry/tracing
配置sentry
// main.js 加入配置
import * as Sentry from '@sentry/vue'
import { BrowserTracing } from '@sentry/tracing'
Sentry.init({
Vue,
dsn: 'https://29312c0e8494419e8cdb1eee6e5212e4@sentry.hanyuan.vip/4',
integrations: [
new BrowserTracing({
routingInstrumentation: Sentry.vueRouterInstrumentation(router),
tracingOrigins: ['localhost', 'my-site-url.com', /^\//],
}),
],
tracesSampleRate: 1.0,
release: process.env.SENTRY_RELEASE,
})
# 新建env用于保存release版本號
$ touch .env
$ cat > .env
$ SENTRY_RELEASE="0.0.1"
然后就可以到后臺查看我們報錯的內(nèi)容了。
為了方便查看具體的報錯內(nèi)容,我們需要上傳sourceMap到sentry平臺。
一般有兩種方式 sentry-cli和 sentry-webpack-plugin方式,這里為了方便采用webpack方式。
# 如果要上傳源碼需安裝webpack插件
$ yarn add @sentry/webpack-plugin -D
$ touch .sentryclirc
# 寫入配置
$ cat > .sentryclirc
[auth]
token=XXX
[defaults]
url=https://sentry.hanyuan.vip/
org=sentry
project=vue-sentry-test
# webpack配置
$ touch vue.config.js
// vue.config.js
const SentryCliPlugin = require('@sentry/webpack-plugin')
module.exports = {
configureWebpack: {
plugins: [
new SentryCliPlugin({
include: './dist/js', // 只上傳js
ignore: ['node_modules'],
configFile: 'sentry.properties',
release: process.env.SENTRY_RELEASE, // 對應(yīng)main.js版本號
cleanArtifacts: true, // 先清理再上傳
}),
],
},
}
執(zhí)行 $ yarn build 上傳后并驗證
在react項目中使用也大同小異,我們按需修改即可。
Tips
如何上傳后刪除sourcemap, 三種方式:
1、命令刪除
"scripts": {
"build": "vue-cli-service build && rimraf ./dist/js/*.map"
}
2、單獨生成map
// vue.config.js
configureWebpack(config) {
config.output.sourceMapFilename('sourceMap/[name].[chunkhash].map.js')
config.plugin('sentry').use(SentryCliPlugin, [{
include: './dist/sourceMap', // 只上傳js
ignore: ['node_modules'],
configFile: 'sentry.properties',
release: process.env.SENTRY_RELEASE, // 對應(yīng)main.js版本號
cleanArtifacts: true, // 先清理再上傳
}])
}
3、webpack插件清理
$ yarn add webpack-delete-sourcemaps-plugin -D
// vue.config.js
const { DeleteSourceMapsPlugin } = require('webpack-delete-sourcemaps-plugin')
... // plugin
new DeleteSourceMapsPlugin(), // 清理sourcemap
...
三、最后
在我們做技術(shù)方案的時候,最好結(jié)合團隊的實際情況,然后做出取舍,選擇最符合實際的方案。
作者:廣東靚仔
歡迎關(guān)注:前端早茶