sentry使用實(shí)踐

1.前言

目前我主要負(fù)責(zé)的是公司的營(yíng)銷活動(dòng)類項(xiàng)目耕姊,基本都是直接面向用戶端的桶唐,并且JS也沒(méi)有如后端一樣有完善的日志系統(tǒng),因此線上的各種bug都非常難以迅速定位茉兰。在加入錯(cuò)誤日志收集前尤泽,每次報(bào)告bug都要?jiǎng)跓┯脩魠f(xié)助開發(fā)人員進(jìn)行bug定位,這一方面對(duì)用戶極不友好规脸,同時(shí)也加大了Bug定位的難度坯约;因此我們需要一個(gè)工具來(lái)幫我們收集錯(cuò)誤信息,如接口報(bào)錯(cuò)莫鸭,dom報(bào)錯(cuò)以及語(yǔ)法錯(cuò)誤等等闹丐。下面我就介紹一下sentry這個(gè)工具如何在項(xiàng)目中使用。

2.sentry介紹

Sentry 是一個(gè)實(shí)時(shí)事件日志記錄和匯集的平臺(tái)被因。其專注于錯(cuò)誤監(jiān)控以及提取一切事后處理所需信息而不依賴于麻煩的用戶反饋卿拴。它分為客戶端和服務(wù)端,客戶端(目前客戶端有Python, PHP,C#, Ruby等多種語(yǔ)言)就嵌入在你的應(yīng)用程序中間梨与,程序出現(xiàn)異常就向服務(wù)端發(fā)送消息堕花,服務(wù)端將消息記錄到數(shù)據(jù)庫(kù)中并提供一個(gè)web頁(yè)方便查看。Sentry由python編寫粥鞋,源碼開放缘挽,性能卓越,易于擴(kuò)展,目前著名的用戶有Disqus, Path, mozilla, Pinterest等壕曼。

3.如何在項(xiàng)目中使用sentry

3.1 安裝

為了在vue項(xiàng)目中使用sentry,你需要同時(shí)使用Raven.js(Senrty的瀏覽器JsSDK)和Raven.js Vue插件苏研。Raven.js將自動(dòng)報(bào)告所有未被捕獲的異常,進(jìn)一步了解Raven.js的用請(qǐng)參考Raven.js窝稿。Raven.js Vue插件將會(huì)自動(dòng)捕捉拋出錯(cuò)誤的活動(dòng)組件狀態(tài)以及名稱楣富。
使用npm安裝:

npm install raven-js --save

然后在main.js里同時(shí)引入raven.js和Raven.js Vue plugin

import Vue from 'vue';
import Raven from 'raven-js';
import RavenVue from 'raven-js/plugins/vue';

Raven
    .config('https://08dc77f2b5dd42e490be150ad705ddd@sentry.io/123456')
    .addPlugin(RavenVue, Vue)
    .install()
3.2 在sentry上新建自己的項(xiàng)目

Sentry上新建一個(gè)賬號(hào),再新建一個(gè)組織伴榔,一個(gè)組織可以邀請(qǐng)多人參與到其中來(lái)纹蝴。然后創(chuàng)建一個(gè)新的項(xiàng)目,選中JavaScript項(xiàng)目踪少。左下角填寫項(xiàng)目名然后創(chuàng)建項(xiàng)目塘安。

QQ20180207-104024.png

創(chuàng)建完成之后,我們得到了一個(gè)Sentry DSN(在初始化的時(shí)候會(huì)用到),然后將得到的Sentry DSN替換到上面config里的內(nèi)容援奢。至此兼犯,sentry就完成了與項(xiàng)目的整合,之后就可以捕獲異常并發(fā)送到sentry集漾,我們可以在sentry監(jiān)控web頁(yè)(https://sentry.io/組織名/項(xiàng)目名/)看到具體的異常信息切黔。
QQ20180207-104253.png

3.3 關(guān)于DSN

在Sentry完成一個(gè)項(xiàng)目的設(shè)置后,您將獲得一個(gè)我們稱之為DSN或數(shù)據(jù)源名稱的值.它看起來(lái)很像一個(gè)標(biāo)準(zhǔn)的URL具篇,但它實(shí)際上只是Sentry SDK所需的配置的標(biāo)識(shí).它由幾個(gè)部分組成纬霞,包括協(xié)議,公共密鑰和密鑰驱显,服務(wù)器地址和項(xiàng)目標(biāo)識(shí)符诗芜。

'{PROTOCOL}://{PUBLIC_KEY}:{SECRET_KEY}@{HOST}/{PATH}{PROJECT_ID}'

它由5部分組成:
1. 使用的協(xié)議: http或https;
2. 驗(yàn)證sdk的公鑰和密鑰;
3. 目標(biāo)sentry服務(wù)器;
4. 驗(yàn)證用戶綁定的項(xiàng)目id.

生成好DSN后,將其塞入到初始化的配置中:

import Raven from 'raven-js'
Raven.config('https://08dc77f2b5dd42e490be150ad70527dd:38dded13008c4afca16c650854b73ce0@sentry.io/272180')
3.4 如何使用

1.最簡(jiǎn)單的方式是主動(dòng)觸發(fā):

try {
    doSomething(a[0])
} catch(e) {
    Raven.captureException(e)
}
  1. window.onerror捕捉異常
window.onerror = function (e) {
    Raven.captureException(e)
}
  1. 在vue里可以使用Vue.config.errorHandler 鉤子來(lái)捕捉
Vue.config.errorHandler = (err, vm, info) => {
  Raven.captureException(err)
}

4.對(duì)于接口報(bào)錯(cuò)埃疫,可以在全局?jǐn)r截里實(shí)現(xiàn)

request.interceptors.response.use(null, error => {
      axiosHelper.error(error)
      Raven.captureException(error)
      return Promise.reject(error)
    })

4.使用過(guò)程中可能遇到的問(wèn)題

  1. 采集到的信息不全伏恐,沒(méi)有我們想要的用戶信息,如用戶guid和phone
    解決方案:文檔里有提供方法setUserContext(),顧名思義該方法是設(shè)置全局上下文栓霜,因此我們可以在拿到用戶信息后執(zhí)行一次該方法翠桦。
request.interceptors.response.use(null, error => {
      axiosHelper.error(error)
      Raven.setUserContext({
        phone: token.Phone || '',
        guid: token.CustomerGuid || ''
      })
      Raven.captureException(error)
      return Promise.reject(error)
    })

2.當(dāng)異常信息過(guò)多時(shí),在監(jiān)控后臺(tái)沒(méi)有有效的篩選條件叙淌,導(dǎo)致我要看指定的異常信息什么困難
解決方案:查詢文檔發(fā)現(xiàn)有新增標(biāo)簽的方法秤掌,標(biāo)簽可以幫助我們來(lái)篩選異常信息。

Raven.setTagsContext({
   phone: token.Phone || '未登錄'
})

3.由于線上的代碼都是壓縮過(guò)的鹰霍,所以報(bào)錯(cuò)時(shí)很難定位到具體的哪一行代碼出錯(cuò)闻鉴。
解決方案: 上傳sourcemap,sentry會(huì)自動(dòng)匹配源碼(上傳sourcemap文檔)。
官方提供了幾種上傳sourcemap的方法茂洒,具體請(qǐng)查看文檔孟岛。
我選擇的是手動(dòng)上傳的方式,通過(guò)官方提供的工具sentry-cli,首先生成一個(gè)版本號(hào)并在sentry初始化的時(shí)候配置版本號(hào):

Raven.config('https://08dc77f2b5dd42e490be150ad70527dd@sentry.io/272180', {
  autoBreadcrumbs: {
    xhr: true,
    console: true
  },
  release: 'first'
})
  .addPlugin(RavenVue, Vue)
  .install()

然后通過(guò)sentry-cli將*.map.js文件上傳至sentry服務(wù)器,之后就可以在監(jiān)控平臺(tái)看到具體的錯(cuò)誤了渠羞。

5.搭建自己的sentry服務(wù)

由于官方提供的免費(fèi)服務(wù)有一定次數(shù)的限制斤贰,達(dá)到一定限制后想要再使用就需要收費(fèi)了,但是sentry是開源項(xiàng)目所以我們可以在本地搭建自己的服務(wù)次询,官方頁(yè)提供了具體的操作步驟荧恍。
Sentry的搭建主要有兩種

官方的推薦是使用Docker來(lái)進(jìn)行部署.在實(shí)際生產(chǎn)中,docker更為簡(jiǎn)潔易控.下面我們就來(lái)講講docker部署本地Sentry的步驟
1.安裝docker
本人使用的mac系統(tǒng)。直接從Docker官網(wǎng)下載屯吊。 官方下載地址

QQ20180209-135348@2x.png

可以看到docker和docker-compose 已經(jīng)在運(yùn)行了送巡。
2.搭建服務(wù)
首先從github上拉去sentry的docker配置文件

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

接著通過(guò)命令生成密鑰

docker-compose run --rm web config generate-secret-key
QQ20180209-135653@2x.png

紅線畫出的就是生成好的密鑰,然后將其復(fù)制到docker-compose.yml文件中:


QQ20180209-140417@2x.png

注意將前面的注釋'#'號(hào)去掉盒卸。
然后更新配置骗爆,創(chuàng)建管理員用戶:

docker-compose run --rm web upgrade

過(guò)程中會(huì)讓我們填寫郵箱和密碼
然后再修改docker-compose.yml 文件,為其中的web容器添加volumes卷.讓配置文件生效蔽介。


QQ20180209-140749@2x.png

最后摘投,開啟所用容器:

docker-comose up -d

至此大功告成!此時(shí)訪問(wèn)http://localhost:9000即可登錄本地監(jiān)控平臺(tái)虹蓄。
后續(xù)操作如前文提到的一致犀呼。

6.總結(jié)

sentry是一款非常強(qiáng)大的工具,除了上面介紹的基本功能外薇组,捕獲到錯(cuò)誤信息后還會(huì)以郵件的方式告知圆凰,除此之外它還可以與github,jira等進(jìn)行整合達(dá)到令人意向不到的效果。它也提供了強(qiáng)大api供開發(fā)者來(lái)完善更加詳細(xì)的錯(cuò)誤采集体箕,并以圖表的形式展現(xiàn)數(shù)據(jù),幫助開發(fā)者更好的分析問(wèn)題挑童。
總之在項(xiàng)目中使用sentry之后累铅,能快速的定位問(wèn)題所在,知道問(wèn)題所在之后解決起來(lái)也是什么方便的站叼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娃兽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尽楔,更是在濱河造成了極大的恐慌投储,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阔馋,死亡現(xiàn)場(chǎng)離奇詭異玛荞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)呕寝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門勋眯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事客蹋∪洌” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵讶坯,是天一觀的道長(zhǎng)番电。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辆琅,這世上最難降的妖魔是什么漱办? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮涎跨,結(jié)果婚禮上洼冻,老公的妹妹穿的比我還像新娘。我一直安慰自己隅很,他們只是感情好撞牢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叔营,像睡著了一般屋彪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绒尊,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天畜挥,我揣著相機(jī)與錄音,去河邊找鬼婴谱。 笑死蟹但,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谭羔。 我是一名探鬼主播华糖,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘟裸!你這毒婦竟也來(lái)了客叉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤话告,失蹤者是張志新(化名)和其女友劉穎兼搏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沙郭,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佛呻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了病线。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片件相。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡再扭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夜矗,到底是詐尸還是另有隱情泛范,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布紊撕,位于F島的核電站罢荡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏对扶。R本人自食惡果不足惜区赵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浪南。 院中可真熱鬧笼才,春花似錦、人聲如沸络凿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)絮记。三九已至摔踱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怨愤,已是汗流浹背派敷。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撰洗,地道東北人篮愉。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像差导,于是被迫代替她去往敵國(guó)和親潜支。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評(píng)論 25 707
  • When people are getting old, they will inevitably suffer ...
    玲玲A閱讀 402評(píng)論 0 1
  • 人世間走得久了柿汛,便在歲月中逐漸麻木。能堅(jiān)持的原則越來(lái)越少埠对。感情在歲月中慢慢淡忘络断,心中能留下的人與愛也越來(lái)越少。 大...
    鄱湖飛魚閱讀 360評(píng)論 2 4
  • 我姓方项玛,方南貌笨。 童年,我和眾多孩子格格不入襟沮。大概是因?yàn)榉接甑木壒拾伞?方雨是我的父親锥惋,他是一家鋼鐵廠的工人昌腰,離異,...
    毒賭犢閱讀 460評(píng)論 0 1
  • 去你媽的恐韓癥,讓他見鬼去吧捅伤!銀狐里皮讓前4場(chǎng)懦弱的國(guó)足小伙子們變成了善斗的雄獅劫流,對(duì)不起,讓那些賽前等著看笑話的人...
    羅克閱讀 436評(píng)論 0 0