您现在的位置是:首页 > Javascript
当前栏目
监控Nodejs的性能
2023-02-18 15:28:53 时间
最近想监控一下Nodejs的性能。记录分析Log太麻烦,最简单的方式是记录每个HTTP请求的处理时间,直接在HTTP Response Header中返回。
记录HTTP请求的时间很简单,就是收到请求记一个时间戳,响应请求的时候再记一个时间戳,两个时间戳之差就是处理时间。
但是,res.send()
代码遍布各个js文件,总不能把每个URL处理函数都改一遍吧。
正确的思路是用middleware实现。但是Nodejs没有任何拦截res.send()
的方法,怎么破?
其实只要稍微转换一下思路,放弃传统的OOP方式,以函数对象看待res.send()
,我们就可以先保存原始的处理函数res.send
,再用自己的处理函数替换res.send
:
app.use(function (req, res, next) {
// 记录start time:
var exec_start_at = Date.now();
// 保存原始处理函数:
var _send = res.send;
// 绑定我们自己的处理函数:
res.send = function () {
// 发送Header:
res.set('X-Execution-Time', String(Date.now() - exec_start_at));
// 调用原始处理函数:
return _send.apply(res, arguments);
};
next();
});
只用了几行代码,就把时间戳搞定了。
对于res.render()
方法不需要处理,因为res.render()
内部调用了res.send()
。
调用apply()
函数时,传入res
对象很重要,否则原始的处理函数的this
指向undefined
直接导致出错。
实测首页响应时间9毫秒:
相关文章
- js日志输出还是只会console.log么,那你就out了
- Jackson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo
- Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
- @JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇
- Jackson精解第4篇-@JacksonInject与@JsonAlias注解
- 属性序列化自定义与字母表排序-JSON框架Jackson精解第3篇
- URL及日期等特殊数据格式处理-JSON框架Jackson精解第2篇
- JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法
- 通过java程序(JSch)运行远程linux主机上的shell脚本
- JS/TS项目里的Module都是什么?
- 为啥JS/TS里都会有"use strict"
- api接口返回动态的json格式?我太难了,尝试一下 linq to json
- 教你如何解决JS/TS里特定String进行拆分然后遍历各个元素
- 对 JsonConvert 的认识太肤浅了,终于还是遇到了问题
- knockoutjs如何动态加载外部的file作为component中的template数据源
- 掌握这20个JS技巧,做一个不加班的前端人
- 如何在TypeScript/JavaScript项目里引入MD5校验和
- Javascript之旅——终点站:困惑的settimeout
- Javascript之旅——第十一站:原型也不好理解?
- Javascript之旅——第十站:为什么都说闭包难理解呢?