浅谈 OneAPM 在 express 项目中的实践

为什么我们要使用性能监控呢?

OneAPM 是一个优秀的性能监控平台。为什么我们要使用性能监控呢?并不是为了炫耀我有多么酷的玩具,仅仅因为我们希望在问题发生的第一时间就能知道。在第一时间发现问题,把问题解决于无形之中,总比出了大麻烦通宵达旦加班舒服得多。

然而有的人喜欢说:“有些问题留着也不会有什么影响。”,但我觉得服务端的事情,
凡是冒烟的地方,终究会着火的。

还有的人喜欢说:“我的代码绝对不可能有bug”。不过这只是吹牛逼。

废话不说了,直接上干货

OneAPM的监控服务主要分以下几块

  • Application Insight 应用程序监控
  • Browser Insight 浏览器客户端监控
  • Mobile Insight 移动客户端监控
  • Cloud Insight 云服务器监控

使用 OneAPM 监控自己的项目,首先你需要去 oneapm.com 注册一个开发者账号。

Application Insight 应用程序监控

登录平台以后根据自己项目的语言选择探针,我这里项目是用的 express,所以选择了 node.js,
在 OneAPM 里面对怎么安装探针写得很详细,大概就是在项目的目录下运行

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

然后配置文件从 node_modules/oneapm 里面拷出来,改一下 License Key ,就这么简单。

我们安装好探针以后,过几分钟让插件收集到数据,就能在面板里面看到各种图标。

首先需要关注的是响应时间图表

这个图表会对服务端耗时给一个大体印象,大家可以发现我们项目最慢的时候,
是发生在8月18号晚上左右,有请求大约1.25s才结束。紫色的占了绝大多数,
这些都是外部服务消耗的时间。

右上角的窗口叫做 apdex

这是一个评估用户满意度的指标,从这个指标可以看到用户是否满意我们的响应速度,
最右上角有 1[0.5] 可以看到我们 100% 的用户都满意我们的响应速度,小于0.5秒的请求,
我们称之为满意。我们这里是用的 OneAPM 的默认设置,小于0.5秒表示满意,0.5-2秒是可容忍,
2秒以上则不满意。

cpm 图表

这个图表代表吞吐量,我们可以看到项目最高的时候,大概每分钟80次请求,平均每分钟17.88次请求。

Web 事务图表

这是一个很重要的图表,在这里我们能看到性能最差的几个 web 事务,我们通过 url,
能找到代码中对应的 controller 函数,从而找到这个接口中性能的瓶颈

我们来仔细看一个请求吧,第一条 express/POST/api/ex…
(鼠标放上去可以显示全部的url, 实际上这一条是这样的 Expressjs/POST/api/exams/signup-all

我们可以点进去,查看接口的详细情况。

里面有一些仅对这个接口的吞吐量,执行时间等等的图表,具体含义和前面介绍的差不多
,只不过考察的对象变成了唯一这一个接口。

我认为最重要的一个图表是 breakdown table

这个图表反应了我们这个接口对外部应用(external),数据库(database)的调用情况。
从图表上可以发现,每次我们调用这个接口,我们会调用37次一个叫做xxxxxtct.com是http协议的
外部服务。执行的时间占到了96.88%,另外查了2次数据库。分别占0.49%和 0.07%

看到这里,咱们就知道怎么优化啦~~拿我这个接口来说,这里的瓶颈主要是卡在发送37次http请求给
xxxxxtct.com这个地方,这个xxxxxtct.com其实是我们自己的一个子系统,如果我在子系统里面
写一个接口,把现在37个请求的内容合并,这个性能问题就完美的解决了。

另外 OneAPM 的 Application Insight 还给我们提供了,系统拓扑图,按 web 事务查找瓶颈的功能,按 sql 查找瓶颈的功能,
外部服务的具体执行时间(这个很重要,看谁在拖我们的后腿)以及后台服务的监控。

最后说一下错误率这个 table,这是我个人的经验

express 在抛出系统异常的时候,有可能会挂掉。下面举2个栗子

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
  })
}

抛出异常,然后服务挂掉。

OneAPM 是被 express 程序启起来的,算是 express 进程的一个子进程,如果 express 挂掉了,
OneAPM 也跟着挂了,所以,不可能有机会发回错误信息。
结论是只要在回调里面抛出的异常,任何探针都没有办法收集到错误,
因为在这一层无法做这件事情。

当然,我们虽然有 pm2 这样优秀的进程管理工具来帮我们,挂掉之后自动重启服务。。。
但我们需要在第一时间获得报错信息啊。。。。即使 pm2 的 error.log 里面会保留异常,
但谁又会没事专门盯着 error 这个日志看呢。

针对这个问题,我自己写了一段代码来收集错误日志,希望对大家有帮助。

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 放在项目根目录下,每次启完服务之后运行

node err_notifier.js

这样就能通过 slack 第一时间收到报错了。即使服务挂掉也能发过来。

这里用了另一个叫做 slack 的工具,slack 是一款即时通信的办公协作工具,相信大家或多或少都听说过
(就是创业半年估值11亿美元,一年变28亿那个家伙)。国外类似的还有 hipchat,国内我不太清楚。

首先去 slack 申请一个 team, 然后创建一个 room,为 room 打开一个 webhook,
把 webhook 的地址赋值给 webhookUri, 这样我们无论在哪里,只要项目报错,就能第一时间
收到通过 slack 推送过来的错误日志。

当然,你可以把推送的工具改成,hipchat,邮件,短信,这个随大家高兴了。
关于 pm2 的 event monitor,还有更多事情可做,大家可以参考这里
https://github.com/xiaoyang2022/PM2/blob/dadf0f5806536ae95636ac929155c39b8bf030bb/doc/PROGRAMMATIC.md

最后

OneAPM 虽然可以帮大家在开发初期铺平道路,但也不意味着因为有了监控就可以胡作非为
(反正项目只要冒烟了,OneAPM一目了然)。

我认为最靠谱的做法是:严格遵守各种 style guide 来写代码 + 一个监控系统 + 100% 覆盖率的单元测试 + 几套集成测试 + 一套可靠的发布流程

时间: 2024-11-02 15:00:15

浅谈 OneAPM 在 express 项目中的实践的相关文章

浅谈TeeChart组件在ASP中的应用

chart 浅谈TeeChart组件在ASP中的应用 由于TeeChart VCL 版本广泛应用于多种开发环境并得到很好的认可,西班牙Steema Software SL公司于1997年10月又开发了TeeChart Pro ActiveX.对于B/S的开发模式无疑是一个好消息,由于它只需安装在服务器端,客户端无需安装其他软件,只要使用通用浏览器即可显示统计图形,因此一面市更是又一次得到极大的欢迎. 下面我们结合ASP技术介绍一下TeeChart Pro V5 ActiveX组件常用属性及应用.

浅谈java 执行jar包中的main方法_java

浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 main 方法,那么如何运行指定的 main 方法呢? 用下面的命令试试看: java -classpath ****.jar ****.****.className [args] "****.****"表示"包名": "className"表示&

浅谈游戏化在保险项目中的实践

引子 虽说是关于Gamification游戏化的实践分享,其实也是两年前做过的项目了.之所以现在才写出这篇实践分享,也是源于最近看<MacTalk人生元编程>中提到的使用智能手环对思想和行为的改变:"用这玩意的另一个好处就是,如果需要徒步去做点什么,以前的反映是'我了个擦,怎么这么远'.现在的反映是'好,又可以增加几千步了'". 这让我意识到,这不也是游戏化嘛,只是不局限在和在线业务结合紧密的领域,但却更深入地改变了我们的生活习惯. 言归正传,游戏化是最近几年比较热门的一个

浅谈ASP.NET MVC 3中如何使用Model

昨天博客发了新文章,讲一下我对如何使用MVC中的Model的看法,不是什么大技术,当是一个技术讨论^^ 原文地址:http://www.youguanbumen.net/Article.aspx?id=79 原文: 前两天写了个文章ASP.NET MVC 3 -- Model远程验证,主要记录了一下ASP.NET MVC 3中新增的RemoteAttribute类的使用,得益于这个类,我们可以在模型中为属性配置客户端远程校验的业务,文章中给了出一个简单的实体类MyUser_Add,举了一个最常见

浅谈域名转入解析过程中遇到的问题

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 前面写了一篇SEO内功心法 内容+外链",是讲述SEO的内功心法.今天讲述的是域名转入,解析过程中的问题,这个问题跟SEO也是紧密相关的,如果处理不好,网站会长时间无法访问,对于网站排名会有很大的影响的.之前也有一篇"浅谈面临更换空间的困惑及相关准备"是讲述更空间对SEO的影响.大家都注重服务器了,但大部分人却忽

浅谈瀑布流网页实现中遇到的问题和解决方法

  先上Demo 瀑布流排序 : http://cued.xunlei.com/demos/publ/demo1.html 瀑布流+无限拖 http://cued.xunlei.com/demos/publ/demo2.html 随着pinterest的走红,瀑布流式的布局被越来越多的网站所使用,这种布局确实有很多好处,图片列表页有很强大的视觉感染力,而且还提高了用 户"发现好图"的效率.瀑布流的实现有很多种方式,之前淘宝UED有篇文章详细的介绍过各种方式的优劣.今天我们主要讨论一下绝

艾伟也谈项目管理,杂谈项目中的那些事儿:计划与变化

IT项目中,我们最恐惧什么? 项目中止?不是,因为对于尽心尽力的我们而言,"项目中止"很少是因为咱这些苦哈哈,也许是财务危机.也许是项目的必要性已不存在.也许仅仅是无限期的延迟. 所以,这里我们讨论的是:一个正在执行的还算正常的项目进程中的事情. 对于项目执行和管理者而言,我们最恐惧的其实是"变化",如果谁为了讨好客户和老板,大声呼喊:"我会快乐地拥抱变化",那么不要客气,对他倒竖中指吧,因为他正把大家拖入泥潭. 事实如此,但是纵然我们再怎么不喜

浅谈矩阵分解在推荐系统中的应用

推荐系统是当下越来越热的一个研究问题,无论在学术界还是在工业界都有很多优秀的人才参与其中.近几年举办的推荐系统比赛更是一次又一次地把推荐系统的研究推向了高潮,比如几年前的Neflix百万大奖赛,KDD CUP 2011的音乐推荐比赛,去年的百度电影推荐竞赛,还有最近的阿里巴巴大数据竞赛.这些比赛对推荐系统的发展都起到了很大的推动作用,使我们有机会接触到真实的工业界数据.我们利用这些数据可以更好地学习掌握推荐系统,这些数据网上很多,大家可以到网上下载. 推荐系统在工业领域中取得了巨大的成功,尤其是

浅谈中国半导体产业快速发展中的隐忧

半导体是现代高科技产业的基础,是支撑我国经济社会发展和保障国家安全的战略性.基础性和先导性产业,有着切实的安全需求和经济效益.我国是世界上半导体芯片产品最大的消耗国,半导体芯片年进口额超过2300亿美元, 是我国第一大宗的进口产品.同时我国需求中每年能够自给提供的芯片不到10%. 党和国家领导人高度重视半导体产业发展,国家最高领导人在上海业内企业家关于半导体产业发展的建言书中给予明确批示"我赞成将芯片产业作为战略性产业抓住不放,实现跨越".国务院也制定了<国家集成电路产业发展推进