基於sentry的前端錯誤監控日志系統(部署sentry服務器/前端項目部署)-讓前端最快的定位到生產問題


背景

 

  在這越來越發達的網絡時代,web應用也是越來越復雜,尤其是前端的開發,也是越來越受重視。

  所以在我們前端開發完成后,會有一些列的web應用的上線驗證,如自測、QA測試、code review 等,以確保

應用能在生產上沒有事故。

  但是事以願違,很多時候我們都會接受的客戶的一些線上問題,這些問題有時候可能你是自己開發的原因本身存

在的問題,這樣的問題一般能夠在測試環境重現,我們很快的能定位到問題關鍵位置。但是,很多時候有一些問題,

我們在測試中並未發現,可是在線上卻有部分人出現了,問題確確實實存在的,這個時候我們測試環境又不能重現,

還有一些偶現的生產的偶現問題,這些都是難以定位到問題的原因,讓我們前端工程師頭疼不已。

  這時候,我們不得不借助一些功能來解決這一些列的頭疼問題。

 

  前端錯誤監控日志系統  

  當前端代碼在生產運行中出現錯誤的時候,第一時間傳遞給監控系統,從而第一時間定位並且解決問題。

  保證前端代碼的穩定和安全,是項目可以健康的運行。

 

監控系統搭建方案

 

  1、自行可以規划定義一套完善的監控系統。需要人力重新開發

  2、借助第三方插件( 阿里ARMS、fundebug、BadJS,sentry 等 )

  阿里ARMS :是阿里的一個前端數據監控的服務,似乎是收費的

  fundebug :挺完善的前端錯誤日志服務,也是收費的

  BadJS :騰訊團隊的一個開源項目,沒看過,應該很不錯的

  sentry :github 上面的一個開源項目,支持各端的錯誤監控 ( 本文就是基於 sentry 搭建的錯誤監控系統 )

 

系統的搭建與使用

 

  sentry 簡介

  sentry 是一個開源的實時錯誤監控的項目,它支持很多端的配置,包括 web 前端、服務器端、移動端及其游戲端。

支持各種語言,例如 python、oc、java、node、javascript 等。也可以應用到各種不同的框架上面,如前端框架中的

vue 、angular 、react 等最流行的前端框架。

  提供了github、slack、trello 的常見的開發工具的集成。可以自己安裝並且搭建 sentry 應用。

 

支持的語言:

 

 

  sentry 的部署

  官網提供了兩種部署方案:

  docker

  python

  docker 是我第一次使用,看了下文檔,感覺挺容易明白。

  在這里為了操作方便考慮,我們選擇使用docker來部署搭建 sentry。

  這種方法的話需要安裝 docker 和 docker - compose 。

 

1、docker 的部署 (mac版)

  安裝的話,可以直接去看看 docker 安裝文檔

  docker 安裝

  mac 版的安裝,docker-compose 已經一起安裝好了。

 

2、部署 sentry

  獲取 sentry 代碼

  從 github 上面可以獲取到最新的 sentry 代碼

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

  獲取到本地之后,進入項目的目錄。

  按照項目的 readme.md 開始依照步驟搭建。

  

1
docker-compose run --rm web config generate-secret-key

  這里是生產密鑰,SENTRY_SECRET_KEY 這個需要添加到 docker-compose.yml 中。

  

  最后一步:

1
docker-compose up -d

  

  至此,我們監控系統的后端服務器已經跑起來了,訪問本地的9000端口。

  使用中途創建的 郵箱和密碼登陸 我們的服務后端。

 

 

3、創建項目

  登陸后我們會進入我們的監控項目的界面,如:

  

 

  點擊右上角的  add new project ,我們可以創建一個新的項目

  

  這里可以選擇項目的配置,語言以及框架,選擇自己的項目類型

  輸入項目名稱,點擊 create project 。確定創建新項目。

 

  

 

   點擊紅框框的,創建一個簡單的日志。

  

 

   錯誤信息頁面,可以自行到官網上面去了解更多信息。

 

 

4、前端部署,注入監控代碼 

  

  獲取項目的鏈接:

  

  在項目的首頁點擊 install 會進入當前圖示頁面

  我們復制 sentry DSN 到我們前端配置中

 

  引用 sentry ,注入配置到我們的應用中:

   

 

   這里是以 react 為例,我們在 react 的根組建的 componentDidCatch 上面捕獲錯誤,並且上傳到我們監控系統中。

  這里的我們用 sentry DSN 配置我們的 sentry 並且初始化 sentry 項目。

 

  到這里我們基本,已經完成了我們的前端錯誤監控日志系統了。

 

 

sentry 操作界面介紹

 

  項目操作頁面:

 

  1、項目的查看選項

  Issue : 問題列表

  overview : 概況縱覽

  userfeedback : 用戶反饋

  Resleases : 版本列表信息

  setting : 項目設置

 

  2、問題篩選

  包括 : 指派自己的 、 標記列表 、需要分類的 、 今天的 、 未處理的

 

  

 

   設置為 解決 、 忽略 、 合並 、標記 、實時監控

 

  

 

 

 

 

 

sentry 的api介紹和使用

  

  1、javascript SDK 引用與配置

 

  現在有兩種方法引用 sentry SDK :

 

  直接引用:

  最快的方法就是通過 script 標簽引用我們的 sdk 

1
<script src= "https://browser.sentry-cdn.com/4.4.1/bundle.min.js"  crossorigin= "anonymous" ></script>

 然后就是配置了。

1
Sentry.init({ dsn:  'https://<key>@sentry.io/<project>'  });

  

  npm 包引用:

  首先是用添加包 @sentry/browser@4.4.1

1
yarn add @sentry/browser@4.4.1

  引用到項目中,並且配置

1
2
3
import  * as Sentry from  '@sentry/browser' ;
 
Sentry.init({ dsn:  'https://<key>@sentry.io/<project>'  });

  

 

  2、捕獲事件

 

  主動捕獲錯誤或者異常

  sentry 常見的是錯誤捕獲,可以根據平台的不同來捕獲錯誤,並且可以傳遞不同的錯誤信息。

1
2
3
4
5
try  {
     aFunctionThatMightFail();
catch  (err) {
     Sentry.captureException(err);
}<br data-filtered= "filtered" >Sentry.captureException( new  Error( 'test' ))

  

 

  捕獲消息

  另一種常見操作是捕獲裸信息。消息只是應該發送給Sentry的一些文本信息。    

1
Sentry.captureMessage( 'Something went wrong' );

  

 

  3、初始化配置

  

  sentry SDK 可以通過很多方式進行配置。

  主要配置初始化配置的函數為 init() 方法,通過向 init() 方法傳遞參數對象;

  

1
2
3
4
5
Sentry.init({
   dsn:  'https://<key>@sentry.io/<project>' ,
   maxBreadcrumbs: 50,
   debug:  true ,
})

  

  常用參數:

  DSN :項目的地址,用於收集錯誤信息的 sentry 分配的地址

  debug :是否開啟 debug 模式,開啟debug,就會把信息打印到控制台上面

  release : 代碼的版本號

    release 版本號,可以確定當前的錯誤/異常屬於哪一個發布的版本

    可以應用到  sourcemaps 來映射源碼

  environment : 環境名稱

  sampleRate : 是否開啟隨機發送事件給 sentry ,1為100%,0.1 為 10%幾率發送事件

  attachStacktrace : 是否開啟堆棧跟蹤,開啟后跟着消息一起收集

  beforeSend : 發送前操作

 

  4、sentry 的api

  

  captureException(exception) : 捕獲一個 js 異常,傳入一個 exception 對象或者類對象。

  captureMessage(message,level) : 捕獲一條信息,傳入信息內容和信息級別

  captureEvent(sentryEvent) : 捕獲一個事件,sentryEvent 是手動創建的,自定義的

  addBreadcrumb(Breadcrumb) : 添加一個面包屑,以供接下里的捕獲

  configureScope((scope)=>{}) : 設置 context 信息到 scope 上面

  withScope((scope)=>{}) : 設置一個零時的 scope 信息到 context 上面

 

  5、context 上下文信息

  

  上下文信息包括 :user 、 tags 、 level 、fingerprint 、 extra data

  這些信息我們可以通過在 scope 上面設置來定義。

  其中可以通過兩種方法得到 scope 。

1
2
3
4
// 將 scope 配置到 context 上面
Sentry.configureScope((scope) => { }); <br data-filtered= "filtered" >
// 創建一個零時到 scope ,配置到 context 上面
Sentry.withScope((scope) => { });

  

  

  User

1
2
3
4
5
6
scope.setUser({
        id: '1' ,
        username: 'xiao' ,
        ip_address: '127.0.0.1' ,
        email:  'test.doe@example.com'  ,
      });

  通過 setUser 來設置 User 信息。

  其中 user 可以設置的信息包括 id 、 username 、 ip_address 、email

  

  Tags

   tags 是給事件定義不同的鍵/值對,可以在查找的時候更容易。

   后台查找的時候,查找選項會多出來一個選項,就是通過 tags 來設置的。

1
scope.setTag( "page_local" "de-at" );

  通過 setTag 來設置了一個page_local 的標簽。

  后台會多一個 page_local 選項。包括 de-at

 

  level

  通過這個來設置事件的嚴重性。

  包括:fatal 、error 、 warning 、 info 、 debug 。( fatal : 嚴重,error 錯誤,error 為默認 )

1
scope.setLevel( 'warning' );

  通過 setLevel 來設置。

 

  Fingerprint 

  指紋,通過指紋把信息分到不同的組中   

 

   Extra Data

  傳入額外的信息。並不會創建索引(也就是不可以提供來檢索)。

1
scope.setExtra( "character_name" "Mighty Fighter" );

  通過 setExtra 來設置。

 

  

  6、Breadcurumbs 面包屑  

   面包屑用於記錄一系列當行為,當下一次發生錯誤事件上傳當時候會隨着一起上報。

   瀏覽器 javascript sdk 將自動記錄所有當位置更改。

1
2
3
4
5
Sentry.addBreadcrumb({
   category:  'auth' ,
   message:  'Authenticated user '  + user.email,
   level:  'info'
});

  我們可以通過 addBreadcrumb 來添加一次行為記錄。

 

  7、user Feedback

  用戶反饋,sentry 提供了一個客戶反饋當窗口。

  當錯誤發生當時候,可以彈出窗口收集一些信息,例如:

  用戶名

  用戶當郵件地址

  發生的問題的描述等。

1
Sentry.showReportDialog();

  通過 showReportDialog 來實現框架的彈出。

 

  

 

 

   

 

 

sentry實現預警並且郵件提醒

  

  郵件預警和郵件提醒是在生產環境中不可缺少的一部分,只有有效的提醒來能讓我們最快的解決問題。

  在項目中選擇 setting -->  alerts  進入郵件預警設置頁面。

 

 

   這里都是基本的郵件規則。

  在 tabs 中的 rule 可以自定規則。

 

   規則設置:

 

  An event is seen : 一個事件發生的時候

  An issue is first seen : 第一個發生錯誤的時候

  An issue changes state from resolved to unresolved :問題從解決到未解決的時候

  An event's tags match {key} {match} {value}  : 匹配到 tags 的鍵值對的時候發送

  An issue is seen more than {value} times in {interval} :在固定時間內出現次數匹配的時候

  An issue is seen by more than {value} users in {interval} :在固定時間內出現用戶的次數匹配的時候

  An event's {attribute} value {match} {value} : 匹配到某一個事件的時候

  An event's level is {match} {level} : 事件級別匹配的時候

 

 

 

 

sentry 生產的 sourcemap 配置 

 

  介紹

 

  現在開發很多時候,我們的代碼都會利用構建工具對代碼合並、壓縮、混淆等。

  在產生這些生產代碼的時候,為了利於我們開發調試、bug修復會產生一個 sourcemap 。

  sourecmap 的主要作用就是將我們的打包的代碼前后最了一個關聯。

  這里,sentry 對生產的 sourcemap 有很好的處理,它可以很快的讓我們確定代碼的錯誤位置。

 

  准備工作

 

  首先我們需要添加 sentry 的命令行的管理工具 sentry-cli

1
2
npm i -g @sentry/cli<br data-filtered= "filtered" > // 上面的不行就用下面的
npm install -g @sentry/cli --unsafe-perm

  

  獲取認證的 token 

 

  選擇API后就可以生成token,記得勾選 project:write 權限。

  這里的 token 是用於登陸的。

  

  登陸

 

1
sentry-cli --url myserver  login

  回車后輸入上一步獲得的 token 即可

  

  創建版本 

 

1
sentry-cli releases -o 組織 -p 項目  new  release@1.1.0

  -o : 組織,可以在我們的 Organization Settings 中找到

  -p : 項目名稱 , 可以在 projuct 中找到

  release@1.1.0 : 發布的版本號,可以自定義,這個后需要在應用配置的時候傳入

 

 配置 release 到應用   

1
2
3
4
Sentry.init({
   dsn:  'http://18ac34902da74aa29a4328879a58fb0d@localhost:9000/2' ,
   release:  'release@1.1.0' ,
});

  

  上傳 sourcemap 文件

 

1
sentry-cli releases -o 組織 -p 項目 files release@1.1.0 upload-sourcemaps jspath文件所在目錄 --url-prefix 線上資源URI

  

  -o , -p : 和上文一樣

  jspath : js 文件的位置

  uri : js 文件相對於域名的位置

  特殊說明 url-prefix

  這里是必須傳的,不傳找不到 map 文件,例如:

  你的 js 線上的地址為 :https://test.com/static/js/test.js

  這個時候 url-prefix 應該為 : '~/static/js/'

   

    完成!!!!

 

  配置文件,在命令行操作的時候,sentry 支持配置文件。

  配置文件默認文命令的目錄。

  配置文件 .sentryclirc

1
2
3
4
5
6
7
[auth]
token=1a59c94sdfsdfs33b5588b27bd3628c98ff2837c054b4503be089ad623620527
 
[defaults]
url=http: //localhost:9000
project=react-test
org=test

  配置之后就不需要在輸入項目名稱和地址了。

 

 

總結步驟:

  1、注冊賬號 、創建項目 

   直接登陸 sentry 官網,注冊賬號,並且創建一個項目

 

  2、在項目中配置 sentry 

1
2
3
4
Sentry.init({
   dsn:  'http://18ac34902da74aa29a4328879a58fb0d@localhost:9000/2' ,
   release: RELEASE_VERSION,
});

  

  3、打包時候上傳 sourcemap 文件

 

  4、配置郵件預警

 

 

https://www.cnblogs.com/jiebba/p/10049938.html 

   我的博客 :  XiaoLong's Blog

   博客園小結巴巴: https://www.cnblogs.com/jiebba


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM