Node應用沒有錯誤監(jiān)控怎么行板辽?

編者注:作者是網(wǎng)易資深前端@金炳,當前負責網(wǎng)易嚴選自研Node框架建設工作棘催。做過前端劲弦、后端、產(chǎn)品設計醇坝,是一名全棧工程師邑跪。目前致力于Node應用框架研究開發(fā)與生態(tài)建設,實踐Node應用在Serverless呼猪、Faas場景下的遷移和落地画畅,探索Service Mesh在Node應用中的價值。

本文講解node郑叠,以及node+typescript+sourcemap夜赵,兩種類型的Node應用監(jiān)控

一、背景

經(jīng)過了一陣子的學習時間乡革,那個看了一些Node開發(fā)技巧的童鞋,終于開發(fā)出了他人生中第一個后端應用摊腋。熱血沸騰沸版,寫出了一個應用,好開心兴蒸,然后開啟了他漫漫長路的功能迭代的時代视粮,準備迎接他產(chǎn)品的黃金時代。

但是突然有一天橙凳,發(fā)現(xiàn)他的用戶蕾殴,說這怎么不能用,那怎么報錯提示岛啸,然后他花了大量的時間钓觉,去幫他們定位,去復現(xiàn)各種問題坚踩,去重構荡灾,去review代碼,終于解決了這些問題。但是這個過程中批幌,因為解決問題肯定要時間础锐,所以慢慢的用戶也就流失了。

上面這個情況荧缘,應該是大部分后端經(jīng)歷過的問題皆警,也是很多初級開發(fā)遇到的痛點。

但是截粗,這整個過程中信姓,其實有很多可以改進的地方,本文桐愉,作為以一個過來人的經(jīng)驗财破,準備講講Node的錯誤監(jiān)控,來提升我們自身的成長速度以及錯誤定位速度从诲。

二左痢、監(jiān)控

錯誤監(jiān)控,是監(jiān)控里面的一種系洛,我們常常將監(jiān)控做到三個維度.

機器的性能俊性,內(nèi)存,CPU這些的系統(tǒng)監(jiān)控

調(diào)用失敗描扯,RT定页,QPS等類型的應用監(jiān)控

業(yè)務賣的怎么樣的業(yè)務監(jiān)控

2.1 系統(tǒng)監(jiān)控

系統(tǒng)監(jiān)控,比如你的機器绽诚,是不是磁盤讀寫出問題了典徊,CPU是不是要被占用光了,內(nèi)存是不是要沒了恩够。

2.2 調(diào)用失敗卒落,RT,QPS等類型的應用監(jiān)控

整個系統(tǒng)蜂桶,調(diào)用出錯了多少次儡毕,QPS有多少,這個類型的監(jiān)控扑媚。

2.3 業(yè)務監(jiān)控

比如運營同學會問腰湾,"開發(fā)小哥哥,今天我負責的某某商品今天銷量如何疆股?", "我要做活動费坊,但是什么時間開售比較好呢?", "我去別的公眾號投了廣告押桃,但是廣告有沒有帶來效果葵萎,我下次要不要再投他們家廣告呢"导犹。

這類,就需要我們開發(fā)同學羡忘,去做業(yè)務監(jiān)控嘍谎痢。

所以我們看到,錯誤監(jiān)控卷雕,屬于應用類型的監(jiān)控节猿,只是我們監(jiān)控的一個環(huán)節(jié),如果后續(xù)希望看到其他文章介紹漫雕,請關注我們滨嘱。

三、搭建錯誤監(jiān)控系統(tǒng)

最快的解決方式浸间,就是去了解這塊有什么知名的開源解決方案以及哪些我們可以用的服務太雨。

有哪幾個呢?

Fundebug-不放過每一個BUG

sentry

總的來說:

上面的以前是免費的魁蒜,后來收費了囊扳。下面的開源的,挺好用的兜看。所以下面我們就介紹sentry相關應用吧锥咸,畢竟文章不能太長,哈哈哈细移。

3.1 sentry是什么搏予?

sentry是一個開源的實時錯誤報告工具,支持web前后端弧轧,移動應用以及游戲雪侥,支持Python, OC,Java,Go, Node, Django等主流編程語言和框架,還提供了Github精绎、Slack校镐、Trello等常見開發(fā)工具的集成。

3.2 文檔地址

官網(wǎng)地址:https://sentry.io/welcome/

github地址:https://github.com/getsentry/sentry

整體項目是用django開發(fā)的后端+django的后端模板渲染的前端捺典。

3.3 安裝方法

這邊用官方的docker-compose的方式進行安裝,關于其他安裝方法从祝,隨便搜襟己,畢竟知名呀,如果你以前沒用過牍陌,說明要趕緊的了哈擎浴。

官方的一個方式:

步驟一:

git clone代碼.倉庫地址: https://github.com/getsentry/onpremise.git,然后下載完代碼后進入這個目錄進行操作毒涧。

gitclone?https://github.com/getsentry/onpremise.git

步驟二:

docker?volumecreate--name=sentry-data?&&?docker?volume?create?--name=sentry-postgres

步驟三:

把他的環(huán)境配置文件拷貝一份贮预,修改。

cp-n.env.example.env

步驟四:

執(zhí)行build

docker-compose?build

步驟五:

產(chǎn)生一個key。

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

會提示給我們一個key的仿吞。

然后將這個key滑频,修改vim .env然后填進去。

步驟六:

數(shù)據(jù)庫orm的執(zhí)行唤冈,生成數(shù)據(jù)庫表和數(shù)據(jù)庫初始數(shù)據(jù)

docker-compose?run--rm?web?upgrade?

然后他會提示我們創(chuàng)建一個賬號峡迷,那這時大家輸入一個賬號。

步驟七:

運行

docker-compose?up?-d

步驟八:

打開我們的網(wǎng)頁訪問: http://127.0.0.1:9000你虹,看到以下界面:

然后我們輸入賬號密碼后绘搞,他會進入這個頁面:

image.png

然后我們輸入賬號密碼后,他會進入這個頁面:

image.png

然后我們進入后就能看到如下界面:

image.png

然后直接進入實戰(zhàn)吧傅物。

四夯辖、Node基礎應用篇

4.1.1 新建項目

我們打開sentry網(wǎng)站,如下圖董饰,點擊新建一個項目:

image.png

然后我們選擇nodejs

image.png

然后我們就到了這個頁面:

image.png

4.1.2 新建代碼工程

我們選擇一個自己的目錄蒿褂,然后創(chuàng)建一個文件夾。

mkdir?-p?hello_world?&&cdhello_world

然后我們執(zhí)行下面命令來初始化一個npm項目

npminit?-y

然后我們新建一個index.js文件尖阔,并且安裝@sentry/node這個庫

npminstall?@sentry/node?-s

然后index.js的代碼如下:

constSentry?=require('@sentry/node');

Sentry.init({dsn:'http://dfa471316a1143a689364ff5d7517753@127.0.0.1:9000//3'});

4.1.3 構建異常

我們修改index.js文件

constSentry?=require('@sentry/node');

Sentry.init({dsn:'http://dfa471316a1143a689364ff5d7517753@127.0.0.1:9000//3'});

thrownewError("hello")

然后運行這個代碼.

node./index.js

4.1.4 查看異常

然后我們點開剛剛項目頁面會看到:

image.png

說明異常已經(jīng)報告上來了贮缅。

點擊查看詳情:

image.png

4.1.5 解決問題

然后根據(jù)異常,我們就需要去解決代碼里面這個異常介却。比如代碼修改成下面這樣:

constSentry?=require('@sentry/node');

Sentry.init({dsn:'http://dfa471316a1143a689364ff5d7517753@127.0.0.1:9000//3'});

console.log("hello?world")

然后再執(zhí)行谴供,問題就不上報了。

然后同時我們把剛剛這個問題給resolve掉齿坷。

image.png

最終確保我們項目頁面異常是空的桂肌,否則雖然報錯了,但是問題又不改永淌,那這個平臺的價值就沒了崎场。

五、Node + Typescript + sourceMap篇

上面我們介紹了Node.js的基礎使用方法遂蛀,下面我們介紹一下Node + typescript + sourcemap的情況谭跨。

前兩步會跟上面差不多。

5.1.1 新建項目

我們打開sentry網(wǎng)站李滴,如下圖螃宙,點擊新建一個項目:

image.png

然后我們選擇nodejs

image.png

然后我們就到了這個頁面:

image.png

5.1.2 新建代碼工程

我們選擇一個自己的目錄,然后創(chuàng)建一個文件夾所坯。

mkdir?-p?hello_world?&&cdhello_world

然后我們執(zhí)行下面命令來初始化一個npm項目,這步開始跟基礎篇不一樣,然后tsc --init會給我們生成一個tsconfig.json文件

npminit?-y?&&?tsc?--init

修改tsconfig.json文件內(nèi)容:

{

"compilerOptions":?{

"target":"es2017",

"module":"commonjs",

"sourceMap":true,

"outDir":"./dist",

"baseUrl":".",

"inlineSources":true,

"strict":true,

"esModuleInterop":true

}

}

然后我們新建一個index.js文件谆扎,并且安裝@sentry/node這個庫

npminstall?@sentry/node?-s

然后index.ts的代碼如下:此處代碼也不一樣了

import*asSentryfrom'@sentry/node'

import*asIntegrationsfrom'@sentry/integrations';

Sentry.init({dsn:'http://dfa471316a1143a689364ff5d7517753@127.0.0.1:9000//3',release:'dev',integrations:?[

newIntegrations.RewriteFrames()

]});

5.1.3 構建異常

為了后續(xù)根據(jù)js和sourcemap還原ts文件,還需要安裝@sentry/integrations

npminstall?@sentry/integrations?-s

然后修改index.ts文件

import*asSentryfrom'@sentry/node'

import*asIntegrationsfrom'@sentry/integrations';

Sentry.init({dsn:'http://dfa471316a1143a689364ff5d7517753@127.0.0.1:9000//3',release:'dev',integrations:?[

newIntegrations.RewriteFrames()

]});

thrownewError("hello123")

然后我們可以首先運行ts版本的:

ts-node?./index.ts

然后我們來看平臺上確實查看到了這個報錯芹助,雖然下面有報錯堂湖,這個報錯原因是沒有node_modules:

image.png

5.1.4 編譯typescript代碼

我們除了本地環(huán)境以外闲先,測試、線上都只會跑js版本无蜂。因為會將ts代碼編譯js伺糠。

執(zhí)行編譯

tsc-p?./tsconfig.json

然后會生成js和sourcemap文件。

5.1.5 上傳代碼準備

上傳這個我們需要做一個準備酱讶,在工程目錄下退盯,我們創(chuàng)建一個文件:

文件名: .sentryclirc

[auth]

token=fc8e6e2e3d12427fb005105694ac576593578d0f667946b0adbffc855c6cf39f

[defaults]

url=http://127.0.0.1:9000/

org=sentry

project=hello

url的話,是sentry網(wǎng)站的地址

org:項目有個org的泻肯,拷貝過來

project:項目名字

token創(chuàng)建方法:

image.png

新建一個token渊迁,并且主要勾選權限。

image.png

5.1.6 安裝上傳工具

上傳工具:

npminstall?@sentry/cli?-g

5.1.7 上傳js和sourcemap

首先我們創(chuàng)建一個release,取名: dev

sentry-cli?releasesnewdev

然后執(zhí)行上傳:

sentry-cli?releases?files?dev?upload-sourcemaps--rewrite?dist?

上傳完畢:

image.png

5.1.8 測試異常

然后我們跑編譯后的灶挟,模擬測試服和線上服琉朽。

運行方式:

node./dist/index.js

然后我們?nèi)テ脚_上查看:

image.png

5.1.9 解決問題

然后根據(jù)異常,我們就需要去解決代碼里面這個異常稚铣。比如代碼修改成下面這樣:

import*asSentryfrom'@sentry/node'

import*asIntegrationsfrom'@sentry/integrations';

Sentry.init({dsn:'http://dfa471316a1143a689364ff5d7517753@127.0.0.1:9000//3',release:'dev3',integrations:?[

newIntegrations.RewriteFrames()

]});

console.log("hello?world")

然后再執(zhí)行箱叁,問題就不上報了。

然后同時我們把剛剛這個問題給resolve掉惕医。

image.png

最終確保我們項目頁面異常是空的耕漱,否則雖然報錯了,但是問題又不改抬伺,那這個平臺的價值就沒了螟够。

六、其他的使用指南

文章目錄其實很長峡钓,暫時只整理了Node相關的一些使用妓笙,比如react,vue能岩,angular這類前端項目也可以用寞宫,electron這類的跨平臺的也可以用。

關于Sentry這樣的錯誤監(jiān)控拉鹃,在項目開發(fā)中挺有用的辈赋,有些公司采用自建,有些是用這類開源項目二次開發(fā)膏燕,所以還沒學會的同學炭庙,趕緊試試吧。

七煌寇、結論

本文其實也只是講解了sentry這塊的錯誤監(jiān)控的一小塊,例如react這類前端項目里面也可以用逾雄。還有郵件報警等等阀溶。

如果聽了之后腻脏,對你有所啟發(fā)和幫助,希望能幫忙轉發(fā)一下银锻,如果有問題永品,可以關注下面微信公眾號聯(lián)系我。

公眾號名字: Node全棧進階

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末击纬,一起剝皮案震驚了整個濱河市鼎姐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌更振,老刑警劉巖炕桨,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肯腕,居然都是意外死亡献宫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門实撒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姊途,“玉大人,你說我怎么就攤上這事知态〗堇迹” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵负敏,是天一觀的道長贡茅。 經(jīng)常有香客問我,道長原在,這世上最難降的妖魔是什么友扰? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮庶柿,結果婚禮上村怪,老公的妹妹穿的比我還像新娘。我一直安慰自己浮庐,他們只是感情好甚负,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著审残,像睡著了一般梭域。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搅轿,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天病涨,我揣著相機與錄音,去河邊找鬼璧坟。 笑死既穆,一個胖子當著我的面吹牛赎懦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幻工,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼励两,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了囊颅?” 一聲冷哼從身側響起当悔,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踢代,沒想到半個月后盲憎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡奸鬓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年焙畔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片串远。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡宏多,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澡罚,到底是詐尸還是另有隱情伸但,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布留搔,位于F島的核電站更胖,受9級特大地震影響,放射性物質發(fā)生泄漏隔显。R本人自食惡果不足惜却妨,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望括眠。 院中可真熱鬧彪标,春花似錦、人聲如沸掷豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽当船。三九已至题画,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間德频,已是汗流浹背苍息。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人档叔。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓桌粉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衙四。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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