浅谈 在 express 项目中的实践

网友投稿 741 2022-09-08

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

浅谈 在 express 项目中的实践

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

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

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

废话不说了,直接上干货

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

Application Insight 应用程序监控

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

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

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

右上角的窗口叫做 apdex

cpm 图表

Web 事务图表

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

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

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

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

.selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}

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

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

抛出异常

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

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

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

当然,我们虽然有 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 推送过来的错误日志。

最后

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

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

上一篇:ES6中的高阶函数:如同 a => b => c 一样简单(es6构造函数)
下一篇:初创公司谁来当你们的运维
相关文章

 发表评论

暂时没有评论,来抢沙发吧~