淺談 OneAPM 在 express 項(xiàng)目中的實(shí)踐

【編者按】OneAPM 運(yùn)營團(tuán)隊(duì),近日在 github 上發(fā)現(xiàn)了一篇文章,特別奉獻(xiàn)給大家片林。本文作者王宇先生從2015年年初就開始使用我們的產(chǎn)品,也是OneAPM 的忠實(shí)用戶怀骤。

OneAPM 是一個(gè)優(yōu)秀的性能監(jiān)控平臺(tái)费封。為什么我們要使用性能監(jiān)控呢? 并不是為了炫耀我有多么酷的玩具蒋伦,僅僅因?yàn)槲覀兿M趩栴}發(fā)生的第一時(shí)間就能知道孝偎。 在第一時(shí)間發(fā)現(xiàn)問題,把問題解決于無形之中凉敲,總比出了大麻煩通宵達(dá)旦加班舒服得多衣盾。

然而有的人喜歡說:「有些問題留著也不會(huì)有什么影響∫ィ」但我覺得服務(wù)端的事情势决, 凡是冒煙的地方,終究會(huì)著火的蓝撇。

還有的人喜歡說:「我的代碼絕對(duì)不可能有 bug 果复。」不過這只是吹牛逼渤昌。

廢話不說了虽抄,直接上干貨吧。

OneAPM 的監(jiān)控服務(wù)主要分以下幾塊

使用 OneAPM 監(jiān)控自己的項(xiàng)目独柑,首先你需要去 OneAPM.com 注冊(cè)一個(gè)開發(fā)者賬號(hào)迈窟。

Application Insight 應(yīng)用程序監(jiān)控

登錄平臺(tái)以后根據(jù)自己項(xiàng)目的語言選擇探針,我這里項(xiàng)目是用的 express忌栅,所以選擇了 nodejs, 在 OneAPM 里面對(duì)怎么安裝探針寫得很詳細(xì)车酣,大概就是在項(xiàng)目的目錄下運(yùn)行

npm install OneAPM --registry http://npm.OneAPM.com

然后配置文件從 node_modules/OneAPM 里面拷出來,改一下 License Key ,就這么簡單索绪。

我們安裝好探針以后湖员,過幾分鐘讓插件收集到數(shù)據(jù),就能在面板里面看到各種圖標(biāo)瑞驱。

首先需要關(guān)注的是 響應(yīng)時(shí)間圖表

response time
response time

這個(gè)圖表會(huì)對(duì)服務(wù)端耗時(shí)給一個(gè)大體印象娘摔,大家可以發(fā)現(xiàn)我們項(xiàng)目最慢的時(shí)候, 是發(fā)生在 8 月 18 號(hào)晚上左右唤反,有請(qǐng)求大約 1.25s 才結(jié)束凳寺。紫色的占了絕大多數(shù)嫡丙, 這些都是外部服務(wù)消耗的時(shí)間。

右上角的窗口叫做 apdex

apdex
apdex

這是一個(gè)評(píng)估用戶滿意度的指標(biāo)读第,從這個(gè)指標(biāo)可以看到用戶是否滿意我們的響應(yīng)速度曙博, 最右上角有 1[0.5] 可以看到我們 100% 的用戶都滿意我們的響應(yīng)速度,小于 0.5 秒的請(qǐng)求怜瞒, 我們稱之為滿意父泳。我們這里是用的 OneAPM 的默認(rèn)設(shè)置,小于 0.5 秒表示滿意吴汪,0.5-2 秒是可容忍惠窄, 2秒以上則不滿意。

cpm 圖表

cpm
cpm

這個(gè)圖表代表吞吐量

我們可以看到項(xiàng)目最高的時(shí)候漾橙,大概每分鐘 80 次請(qǐng)求杆融,平均每分鐘 17.88 次請(qǐng)求。

web事務(wù)圖表

web
web

這是一個(gè)很重要的圖表霜运,在這里我們能看到性能最差的幾個(gè) web 事務(wù)脾歇,我們通過 url, 能找到代碼中對(duì)應(yīng)的 controller 函數(shù)淘捡,從而找到這個(gè)接口中性能的瓶頸

我們來仔細(xì)看一個(gè)請(qǐng)求吧藕各,第一條 express/POST/api/ex... (鼠標(biāo)放上去可以顯示全部的 url, 實(shí)際上這一條是這樣的 Expressjs/POST/api/exams/signup-all)

我們可以點(diǎn)進(jìn)去,查看接口的詳細(xì)情況焦除。

里面有一些僅對(duì)這個(gè)接口的吞吐量激况,執(zhí)行時(shí)間等等的圖表,具體含義和前面介紹的差不多 膘魄,只不過考察的對(duì)象變成了唯一這一個(gè)接口乌逐。

我認(rèn)為最重要的一個(gè)圖表是 breakdown table

breakdown
breakdown

這個(gè)圖表反應(yīng)了我們這個(gè)接口對(duì)外部應(yīng)用(external),數(shù)據(jù)庫( database )的調(diào)用情況。 從圖表上可以發(fā)現(xiàn)创葡,每次我們調(diào)用這個(gè)接口浙踢,我們會(huì)調(diào)用 37 次一個(gè)叫做 xxxxxtct.com 是 http 協(xié)議的 外部服務(wù)。執(zhí)行的時(shí)間占到了 96.88%蹈丸,另外查了 2 次數(shù)據(jù)庫成黄。分別占 0.49% 和 0.07%

看到這里,咱們就知道怎么優(yōu)化啦~~拿我這個(gè)接口來說逻杖,這里的瓶頸主要是卡在發(fā)送 37 次 http 請(qǐng)求給 xxxxxtct.com 這個(gè)地方,這個(gè) xxxxxtct.com 其實(shí)是我們自己的一個(gè)子系統(tǒng)思瘟,如果我在子系統(tǒng)里面寫一個(gè)接口荸百,把現(xiàn)在 37 個(gè)請(qǐng)求的內(nèi)容合并,這個(gè)性能問題就完美的解決了滨攻。

另外 OneAPM 的 Application Insight 還給我們提供了够话,系統(tǒng)拓?fù)鋱D蓝翰,按 web 事務(wù)查找瓶頸的功能,按 sql 查找瓶頸的功能女嘲, 外部服務(wù)的具體執(zhí)行時(shí)間(這個(gè)很重要畜份,看誰在拖我們的后腿)以及后臺(tái)服務(wù)的監(jiān)控。

最后說一下錯(cuò)誤率這個(gè) table欣尼,這是我個(gè)人的經(jīng)驗(yàn)

express 在拋出系統(tǒng)異常的時(shí)候爆雹,有可能會(huì)掛掉。下面舉2個(gè)栗子

exports.show = function(req, res) {
  a.b //a == undefined
}

拋出異常

exports.show = function(req, res) {
  request.post({
    url: xxx-service.com
  }, function(err, response, body) {
    a.b //a == undefined
  })
} 

拋出異常,然后服務(wù)掛掉愕鼓。

OneAPM 是被 express 程序啟起來的钙态,算是 express 進(jìn)程的一個(gè)子進(jìn)程,如果 express 掛掉了菇晃, OneAPM 也跟著掛了册倒,所以,不可能有機(jī)會(huì)發(fā)回錯(cuò)誤信息磺送。 結(jié)論是只要在回調(diào)里面拋出的異常驻子,任何探針都沒有辦法收集到錯(cuò)誤, 因?yàn)樵谶@一層無法做這件事情估灿。

當(dāng)然拴孤,我們雖然有 pm2 這樣優(yōu)秀的進(jìn)程管理工具來幫我們,掛掉之后自動(dòng)重啟服務(wù)甲捏。演熟。。 但我們需要在第一時(shí)間獲得報(bào)錯(cuò)信息啊司顿。芒粹。。大溜。即使 pm2 的 errpr.log 里面會(huì)保留異常化漆, 但誰又會(huì)沒事專門盯著 error 這個(gè)日志看呢。

針對(duì)這個(gè)問題钦奋,我自己寫了一段代碼來收集錯(cuò)誤日志座云,希望對(duì)大家有幫助。

var pm2 = require('pm2');
var Slack = require('slack-node');

pm2.launchBus(function(err, bus) {
  console.log('connected');

  bus.on('log:err', function(data) {
    var webhookUri = "{你的slack webhook}";
    var slack = new Slack();
    slack.setWebhook(webhookUri);

    slack.webhook({
      channel: "#general",
      username: "cq-tct",
      icon_emoji: ":ghost:",
      text: data.data
    }, function(err, response) {
      console.log(response);
    });
  });

});

把這一段保存為 err_notifier.js 放在項(xiàng)目根目錄下付材,每次啟完服務(wù)之后運(yùn)行
node err_notifier.js 這樣就能通過 slack 第一時(shí)間收到報(bào)錯(cuò)了朦拖。即使服務(wù)掛掉也能發(fā)過來。

這里用了另一個(gè)叫做 slack 的工具厌衔,slack 是一款即時(shí)通信的辦公協(xié)作工具璧帝,相信大家或多或少都聽說過 (就是創(chuàng)業(yè)半年估值 11 億美元,一年變 28 億那個(gè)家伙)富寿。國外類似的還有 hipchat, 國內(nèi)我不太清楚睬隶。

首先去 slack 申請(qǐng)一個(gè) team, 然后創(chuàng)建一個(gè) room锣夹,為 room 打開一個(gè) webhook, 把 webhook 的地址賦值給 webhookUri, 這樣我們無論在哪里苏潜,只要項(xiàng)目報(bào)錯(cuò)银萍,就能第一時(shí)間 收到通過 slack 推送過來的錯(cuò)誤日志。

當(dāng)然恤左,你可以把推送的工具改成贴唇,hipchat,郵件赃梧,短信滤蝠,這個(gè)隨大家高興了。 關(guān)于 pm2 的 event monitor授嘀,還有更多事情可做物咳,大家可以參考這里

https://github.com/xiaoyang2022/PM2/blob/dadf0f5806536ae95636ac929155c39b8bf030bb/doc/PROGRAMMATIC.md

最后

OneAPM 雖然可以幫大家在開發(fā)初期鋪平道路,但也不意味著因?yàn)橛辛吮O(jiān)控就可以胡作非為 (反正項(xiàng)目只要冒煙了蹄皱,OneAPM 一目了然)览闰。

我認(rèn)為最靠譜的做法是: 嚴(yán)格遵守各種 style guide 來寫代碼 + 一個(gè)監(jiān)控系統(tǒng) + 100% 覆蓋率的單元測(cè)試 + 幾套集成測(cè)試 + 一套可靠的發(fā)布流程。

寫在最后:OneAPM 非常感謝王宇先生對(duì)我們產(chǎn)品的支持巷折,未來我們將更加努力压鉴,為用戶提供更大的價(jià)值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锻拘,一起剝皮案震驚了整個(gè)濱河市油吭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌署拟,老刑警劉巖婉宰,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異推穷,居然都是意外死亡心包,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門馒铃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟹腾,“玉大人,你說我怎么就攤上這事区宇⊥拗常” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵萧锉,是天一觀的道長珊随。 經(jīng)常有香客問我,道長柿隙,這世上最難降的妖魔是什么叶洞? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮禀崖,結(jié)果婚禮上衩辟,老公的妹妹穿的比我還像新娘。我一直安慰自己波附,他們只是感情好艺晴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掸屡,像睡著了一般封寞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仅财,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天狈究,我揣著相機(jī)與錄音,去河邊找鬼盏求。 笑死抖锥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碎罚。 我是一名探鬼主播磅废,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荆烈!你這毒婦竟也來了拯勉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤憔购,失蹤者是張志新(化名)和其女友劉穎宫峦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倦始,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斗遏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鞋邑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诵次。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖枚碗,靈堂內(nèi)的尸體忽然破棺而出逾一,到底是詐尸還是另有隱情,我是刑警寧澤肮雨,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布遵堵,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏陌宿。R本人自食惡果不足惜锡足,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壳坪。 院中可真熱鬧舶得,春花似錦、人聲如沸爽蝴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝎亚。三九已至九孩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間发框,已是汗流浹背躺彬。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缤底,地道東北人顾患。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像个唧,于是被迫代替她去往敵國和親江解。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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