線上bug追蹤之Sentry 定制錯(cuò)誤信息(三)

線上bug追蹤之Sentry初步嘗試(一)
線上bug追蹤之Sentry release+sourceMap(二)

前兩章說(shuō)了sentry的基本用法和設(shè)置陡蝇,這章繼續(xù)用來(lái)說(shuō)明sentry的一些高級(jí)應(yīng)用膨报。

獲取bug的上下文信息

分析一個(gè)bug僵缺,如果知道了在哪行出錯(cuò)了踊挠,基本上就解決了70%的問題弄唧,但是在有些場(chǎng)景下啡专,還不夠险毁,比如說(shuō)一個(gè)api請(qǐng)求返回了奇怪的數(shù)據(jù),這個(gè)時(shí)候報(bào)錯(cuò)了们童,但是我們bug信息如果沒有錯(cuò)誤的上下問畔况,那么我們要復(fù)原這個(gè)bug就比較麻煩了,所以sentry還提供了關(guān)于bug信息上下文的接口

https://docs.sentry.io/enriching-error-data/context/?platform=browser

主要就是關(guān)于user(責(zé)任人)慧库、tag(標(biāo)簽)跷跪、level(錯(cuò)誤級(jí)別)、extra(附加數(shù)據(jù))

舉個(gè)例子:如果需要監(jiān)控一個(gè)比較重要的api齐板,每次出錯(cuò)了吵瞻,我們都需要告訴他,出錯(cuò)時(shí)覆积,返回的錯(cuò)誤信息听皿,請(qǐng)求的是什么數(shù)據(jù)?應(yīng)該怎么寫尼宽档?請(qǐng)看下面的代碼

Sentry.setUser({"email": "xx@xx.cn"});
Sentry.setTag('api', 'api/list/get')
Sentry.setLevel('error');
Sentry.setExtra('data', {
  req: {a:1},
  res: {b:1},
  header:headers
})
Sentry.captureException(new Error('throw new api'))

sentry后臺(tái)接收到的信息


標(biāo)簽信息
附加數(shù)據(jù)

以上代碼就是定制錯(cuò)誤信息了尉姨。如果你的項(xiàng)目比較簡(jiǎn)單,甚至都不需要寫Sentry.captureException吗冤,只需要簡(jiǎn)單的init sentry又厉,它就可以自動(dòng)捕捉錯(cuò)誤了。

請(qǐng)繼續(xù)往下看椎瘟。

sentry自動(dòng)上傳錯(cuò)誤

到了這一階段覆致,sentry的主要核心應(yīng)用都介紹完了,但是有很多不好的地方肺蔚,比如說(shuō)

  • [ ] 錯(cuò)誤需要手動(dòng)的調(diào)用captureException,是否可以自動(dòng)記錄
  • [ ] 關(guān)于如何和vue結(jié)合煌妈,這里并沒有體現(xiàn)

直接上代碼


<template
  <div class="sentry">
    <button @click="handlerError">直接new一個(gè)錯(cuò)誤</button>
    <button @click="handlerError2">程序內(nèi)不知名bug</button>
  </div>
</template>

<script>
export default {
  name: 'sentry',
  methods: {
    handlerError() {
      throw new Error('throw new Error')
    },
    handlerError2() {
      this.data.list = 1
    }
  }
}
</script>

代碼很簡(jiǎn)單,兩個(gè)按鈕

  • 第一個(gè)按鈕直接 throw 一個(gè)錯(cuò)誤
  • 第二個(gè)按鈕因?yàn)闆]有定義data宣羊,所以賦值肯定也會(huì)出錯(cuò)

當(dāng)我們點(diǎn)擊按鈕時(shí)璧诵,都會(huì)觸發(fā)錯(cuò)誤,這個(gè)時(shí)候仇冯,沒有顯式的調(diào)用sentry之宿,那么錯(cuò)誤是否會(huì)記錄尼?我們打開sentry的后臺(tái)記錄看看

自動(dòng)記錄錯(cuò)誤

很明顯是會(huì)的苛坚,為什么尼比被?

因?yàn)樵贎sentry/integrations(用于增強(qiáng)sentry的api)內(nèi)色难,它在初始化的時(shí)候,重新初始化了errorHandler等缀,所以我們不用寫captureException枷莉,也能記錄錯(cuò)誤信息

@sentry/integrations核心代碼

代碼:https://github.com/getsentry/sentry-javascript/blob/master/packages/integrations/src/vue.ts

雖然@sentry/integrations提供了這方面的支持,但是個(gè)人不建議使用项滑,因?yàn)樗@種方式強(qiáng)制綁定了errorHandler依沮,如果我們需要對(duì)錯(cuò)誤進(jìn)行進(jìn)一步定制,它就沒有辦法滿足了枪狂。

在實(shí)際商業(yè)環(huán)境中危喉,我們可能有多套系統(tǒng),但是這些系統(tǒng)都是在一個(gè)體系下的州疾,如果不想每個(gè)系統(tǒng)都創(chuàng)建一個(gè)sentry項(xiàng)目辜限,有沒有辦法公用一個(gè)sentry項(xiàng)目,然后還能區(qū)分不同的系統(tǒng)嗎严蓖?

這個(gè)sentry雖然沒有直接提供解決方案薄嫡,但是它的設(shè)置environment的方式,我覺得可以間接解決這個(gè)問題颗胡,就是在代碼設(shè)置environment的時(shí)候毫深,不同的系統(tǒng),給它一個(gè)標(biāo)識(shí)符毒姨,這樣哑蔫,release版本號(hào)的時(shí)候,也加上這個(gè)表示弧呐,就可以識(shí)別了闸迷。

// 初始化sentry,process.env.NODE_ENV有兩個(gè)值development俘枫、production
 Sentry.init({
      dsn: 'https://xxxxx@sentry.io/1511376',
      environment: process.env.NODE_ENV,
      integrations: [new Integrations.Vue({ Vue, attachProps: true })],
      release: releaseConfig[releaseEnv].release || ''
    })

這樣在sentry的后臺(tái)就可以看到不同系統(tǒng)之間的bug腥沽,我個(gè)人還是不推薦這樣的方式,但是目前團(tuán)隊(duì)內(nèi)有個(gè)很大的系統(tǒng)鸠蚪,這個(gè)系統(tǒng)內(nèi)都是各種各樣的小系統(tǒng)組成的今阳,如果每個(gè)系統(tǒng)都配置一個(gè)sentry項(xiàng)目,確實(shí)比較麻煩茅信。

配置選項(xiàng)中設(shè)置之后的值

過濾選項(xiàng)

好了酣栈,結(jié)束了。

sentry其實(shí)之前一直在用汹押,但是是8.x版本,在新的公司沒有bug追蹤系統(tǒng)起便,所以也需要安裝一套棚贾,但是發(fā)現(xiàn)sentry已經(jīng)更新到9.x版本了窖维,這個(gè)版本,不管從系統(tǒng)安裝還是到項(xiàng)目部署都和8x有很大不同妙痹,踩了一些坑铸史,寫一個(gè)教程,避免大家再踩坑怯伊。

目前這個(gè)系統(tǒng)唯一不好的是琳轿,不提供截圖,這個(gè)需要自己開發(fā)插件耿芹,還有就是官方提供上傳的sourcemap的webpack插件比較坑吧崭篡,還是社區(qū)提供的比較好。

關(guān)于如何安裝sentry

關(guān)于sentry的安裝最好讓運(yùn)維幫忙安裝吧秕,因?yàn)橐蕾嚨沫h(huán)境比較多(nginx琉闪、Redis、PostgreSQL砸彬、stmp服務(wù))颠毙,

  1. 官網(wǎng)的安裝方式(Python+Docker),提供了兩種方式砂碉,一種Docker安裝蛀蜜,一種Python環(huán)境安裝。

https://docs.sentry.io/server/installation/

  1. 社區(qū)從零開始安裝增蹭,從Docker滴某,到相關(guān)依賴,最終到安裝sentry沪铭,非常清晰明了壮池,適合小白選手

https://learnku.com/articles/4285/build-your-own-sentry-service

以上兩種方式,選用了官網(wǎng)推薦用Docker-compose進(jìn)行安裝杀怠, 具體方式就是fork一個(gè)官網(wǎng)推薦的Docker腳本椰憋,然后進(jìn)行配置定制,之后通過git的方式進(jìn)行版本更新赔退,如果有問題了修改下git橙依,然后遠(yuǎn)程拉下就好了,更方便硕旗,目前采用的就是這種方式

https://github.com/getsentry/onpremise

遇到的坑

a. 發(fā)送email的時(shí)候窗骑,一直沒有設(shè)置正確導(dǎo)致郵件收不到,主要原因有兩個(gè)

  • 騰訊郵件的官方提供的SMTP的端口是465漆枚,但是實(shí)際上企業(yè)郵箱的端口是587创译,這個(gè)巨坑
  • 現(xiàn)在最新版本是9.x版本,和之前8.x的配置有一定的區(qū)別墙基,然后我選的是Docker-compose的安裝方式软族,需要在.env單獨(dú)設(shè)置環(huán)境變量

參考解決頁(yè)面 https://learnku.com/articles/9405/the-deployment-of-sentry-into-the-production-environment

b. 8x版本客戶端的api(raven)都不適用刷喜,已經(jīng)廢棄了,任何和提到raven這方面文檔的都是過去式了立砸,不要看掖疮。

https://docs.sentry.io/clients/javascript/

整體上這個(gè)bug追蹤系統(tǒng)還是很優(yōu)秀的,不僅支持js客戶端颗祝,還支持各類后端語(yǔ)言浊闪,關(guān)鍵免費(fèi)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末螺戳,一起剝皮案震驚了整個(gè)濱河市搁宾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌温峭,老刑警劉巖猛铅,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凤藏,居然都是意外死亡奸忽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門揖庄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栗菜,“玉大人,你說(shuō)我怎么就攤上這事蹄梢「沓铮” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵禁炒,是天一觀的道長(zhǎng)而咆。 經(jīng)常有香客問我,道長(zhǎng)幕袱,這世上最難降的妖魔是什么暴备? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮们豌,結(jié)果婚禮上涯捻,老公的妹妹穿的比我還像新娘。我一直安慰自己望迎,他們只是感情好障癌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辩尊,像睡著了一般涛浙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天蝗拿,我揣著相機(jī)與錄音晾捏,去河邊找鬼。 笑死哀托,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的劳秋。 我是一名探鬼主播仓手,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼玻淑!你這毒婦竟也來(lái)了嗽冒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤补履,失蹤者是張志新(化名)和其女友劉穎添坊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箫锤,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贬蛙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谚攒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阳准。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖馏臭,靈堂內(nèi)的尸體忽然破棺而出野蝇,到底是詐尸還是另有隱情,我是刑警寧澤括儒,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布绕沈,位于F島的核電站,受9級(jí)特大地震影響帮寻,放射性物質(zhì)發(fā)生泄漏乍狐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一规婆、第九天 我趴在偏房一處隱蔽的房頂上張望澜躺。 院中可真熱鬧,春花似錦抒蚜、人聲如沸掘鄙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)操漠。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浊伙,已是汗流浹背撞秋。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嚣鄙,地道東北人吻贿。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哑子,于是被迫代替她去往敵國(guó)和親舅列。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 編者注:作者是網(wǎng)易資深前端@金炳,當(dāng)前負(fù)責(zé)網(wǎng)易嚴(yán)選自研Node框架建設(shè)工作弥奸。做過前端榨惠、后端、產(chǎn)品設(shè)計(jì)盛霎,是一名全棧工...
    金炳閱讀 1,289評(píng)論 0 0
  • 前言 現(xiàn)在的前端項(xiàng)目赠橙,如果一旦發(fā)布上線,代碼一般都會(huì)進(jìn)行混淆摩渺、壓縮甚至加密简烤,如果線上沒有bug跟蹤系統(tǒng),客戶端一旦...
    前端滄海閱讀 1,071評(píng)論 0 0
  • 線上bug追蹤之Sentry初步嘗試(一) 前言 上一章摇幻,介紹了横侦,為啥前端需要線上bug追蹤系統(tǒng),以及簡(jiǎn)單的在se...
    前端滄海閱讀 2,404評(píng)論 2 0
  • 簡(jiǎn)介 sentry是一個(gè)人性化收集&定位&定格程序錯(cuò)誤的工具绰姻。說(shuō)白了就是在網(wǎng)頁(yè)上就能看到你的錯(cuò)誤棧信息枉侧,和各種當(dāng)時(shí)...
    weidwonder閱讀 2,514評(píng)論 0 1
  • 1.前言 目前我主要負(fù)責(zé)的是公司的營(yíng)銷活動(dòng)類項(xiàng)目,基本都是直接面向用戶端的狂芋,并且JS也沒有如后端一樣有完善的日志系...
    max_wwwwww閱讀 56,869評(píng)論 6 39