【编者按】OneAPM 运营团队,近日在 github 上发现了一篇文章,特别奉献给大家。本文作者王宇先生从2015年年初就开始使用我们的产品,也是OneAPM 的忠实用户。

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

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

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

废话不说了,直接上干货吧。

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

  • Application Insight: 应用程序监控

  • Browser Insight: 浏览器客户端监控

  • Mobile Insight: 移动客户端监控

  • Infrastructure Insight: 服务器监控

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

Application Insight 应用程序监控

登录平台以后根据自己项目的语言选择探针,我这里项目是用的 express,所以选择了 nodejs, 在 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 的 errpr.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% 覆盖率的单元测试 + 几套集成测试 + 一套可靠的发布流程。

写在最后:OneAPM 非常感谢王宇先生对我们产品的支持,未来我们将更加努力,为用户提供更大的价值。

浅谈 OneAPM 在 express 项目中的实践相关推荐

  1. 浅谈反编译在项目中的使用

    浅谈反编译在项目中的使用 什么是反编译 反编译的作用 反编译工具 动态编程 JavaSsist 源码安全 什么是反编译 将可读性较好的高级计算机语言(JAVA,C#,C)转换成计算机能解读.运行的低阶 ...

  2. 浅谈ARCGIS在测绘项目中的一般应用

    浅谈ARCGIS在测绘项目中的 一般应用 一.概述 众所周知,ARCGIS是由Esri公司生产的一款的GIS平台.问世至今,已升级数代,现在比较常用的是ARCGIS10.2的版本.由于其强大及全面的地 ...

  3. 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...

    自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...

  4. 化学实验中计算机技术的应用,浅谈计算机在基础化学实验中的应用

    <浅谈计算机在基础化学实验中的应用.doc>由会员分享,可免费在线阅读全文,更多与<浅谈计算机在基础化学实验中的应用>相关文档资源请在帮帮文库(www.woc88.com)数亿 ...

  5. android 存储空间监控,浅谈 Android 内存监控(中)

    前言 在上篇 浅谈 Android 内存监控(上) 中,我们聊了 LeakCanary,微信的 Matirx 和美团的 Probe,它们各自有不同的应用场景,例如,在开发测试环境,我们会偏向用 Lea ...

  6. 计算机在体育教育中的作用,浅谈计算机在体育教学中的应用

    <浅谈计算机在体育教学中的应用>由会员分享,可在线阅读,更多相关<浅谈计算机在体育教学中的应用(2页珍藏版)>请在人人文库网上搜索. 1.浅谈计算机在体育教学中的应用摘要:随着 ...

  7. 浅谈计算机在农业工作中的应用,浅析计算机在农业中的应用论文

    计算机技术在农业科研中的广泛应用,为农业科研工作带来了研究成效,推动农业科研工作的顺利发展.下面是学习啦小编给大家推荐的浅析计算机在农业中的应用论文,希望大家喜欢! 浅析计算机在农业中的应用论文篇一 ...

  8. mysql cdc采集_浅谈CDC在微服务中的应用

    原标题:浅谈CDC在微服务中的应用 CDC(Change Data Capture)是一种通过监测数据变更(变更包括新增.修改.删除等)而对变更的数据进行进一步处理的一种设计模式,通常应用在数据仓库以 ...

  9. Mongo基础使用,以及在Express项目中使用Mongoose

    MongoDB的基本使用 MongoDB特点: 使用BSON存储数据 支持相对丰富的查询操作(相对其他nosql数据库) 支持索引 副本集(支持多个实例/多个服务器运行同个数据库) 分片(数据库水平扩 ...

最新文章

  1. portal认证 php,配置外置Portal认证示例(命令行)
  2. 【Jboss】热部署
  3. 小白安装eclipse插件—testNG
  4. 3-18函数——作用域的查找空间
  5. 图像信噪比计算公式_CT 科研设计之图像质量对比研究三步曲
  6. RT-Thread I2C设备驱动框架的对接使用
  7. 【Python学习】 - - 链表推导式[ 2*x for x in X ]、匿名函数、并行迭代
  8. 数字信号处理的fpga实现_FPGA数字信号处理:通信类I/Q信号及产生
  9. 的使用go_使用 Go 开发 Prometheus Exporter
  10. java w3c xml_org.w3c.dom(java dom)解析XML文档
  11. 震惊!几道Python 理论面试题,Python面试题No18
  12. Linux中路径的组成部分
  13. Swift - ??
  14. 378.有序矩阵中第k小的元素(力扣leetcode) 博主可答疑该问题
  15. python词库介绍_解析搜狗词库(python)
  16. win10专业版开机画面模糊_怎么解决win10专业版字体模糊发虚的教程
  17. 阻滞增长模型求解_阻滞增长模型logistic模型.ppt
  18. 什么无线蓝牙耳机好?英雄联盟推荐竞技游戏专用蓝牙耳机
  19. 解决Oracle使用in语句不能超过1000问题
  20. Redis由于目标计算机积极拒绝,无法连接。

热门文章

  1. java中死锁_关于java中死锁的总结
  2. inputstream 初始化_如何完美回答面试官问的Mybatis初始化原理!
  3. 祖孙俩人是什么关系_一个人生活也挺好,为什么还需要亲密关系?
  4. mysql谓词演算_MySQL基础知识
  5. html5边框闪烁,HTML – CSS框阴影动画像素艺术闪烁
  6. java调用c jni_Java调用C JNI
  7. debian查询端口进程_Linux查看端口、进程情况及kill进程
  8. 《团队激励与沟通》第 4 讲——有效沟通与沟通的障碍 重点部分总结
  9. HTML+CSS+JS 表白代码
  10. 2014 网选 5011 Game(Nim游戏,数学题)