【編者按】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ù)主要分以下幾塊
- Application Insight: 應(yīng)用程序監(jiān)控
- Browser Insight: 瀏覽器客戶端監(jiān)控
- Mobile Insight: 移動(dòng)客戶端監(jiān)控
- Infrastructure Insight: 服務(wù)器監(jiān)控
使用 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í)間圖表
這個(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
這是一個(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 圖表
這個(gè)圖表代表吞吐量
我們可以看到項(xiàng)目最高的時(shí)候漾橙,大概每分鐘 80 次請(qǐng)求杆融,平均每分鐘 17.88 次請(qǐng)求。
web事務(wù)圖表
這是一個(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
這個(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授嘀,還有更多事情可做物咳,大家可以參考這里
最后
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à)值。