javascript - NodeJS http 服务器指标
问题描述
我有一个任务是做一个 nodeJS HTTP 服务器,上面有某种形式的指标。
对于这个任务,我不允许使用任何形式的外部库&作为请求的度量,我将存储响应时间。
对于路由处理,请使用一个简单的 switch 语句来比较请求的 URL
const http = require("http");
var metrics = []
http.createServer((req, res) => {
switch(req.url){
case "/route"
var start = Date.now();
// some code to process the request, maybe some requests to the database, maybe retrieve some files etc
res.end();
metrics.push(Date.now() - start);
break;
}
}).listen(8080,()=>console.log("Server running!"))
问题是,如果我想用一个或少量请求来执行这个应用程序,这种方法是可以的,但是,在任何其他正常情况下,这对于对这些指标的任何进一步更改等等都是可怕的。
我正在考虑尝试使用某种事件侦听器来解决这个问题,我会在请求的开头和结尾调用这些事件侦听器。在开始时存储有关请求的信息并在结束时启动事件以停止处理指标的东西。
server.on('end', (data)=>{
//end metrics somehow
})
虽然它似乎有点难以实现,特别是因为我真的不想覆盖 nodeJS 事件来添加一些数据(例如,我可能想要添加请求的 id 或时间戳)
有没有办法用 nodeJS HTTP 正确地做到这一点?
解决方案
finish
您可以通过对象的事件来处理它res
。res.end()
当您调用(或类似的东西)时,将调用该事件。
我的建议是,要衡量 API 服务,您需要的信息比响应时间更多。
const http = require("http");
var metrics = []
http.createServer((req, res) => {
const startPoint = Date.now();
res.on("finish", () => {
if (req.url === "/metrics") {
return; // no metrics for metrics route
}
metrics.push({
path: req.url,
method: req.method,
status: res.statusCode,
dateTime: startPoint,
times: Date.now() - startPoint,
});
});
switch (req.url) {
case "/route":
// some code to process the request, maybe some requests to the database, maybe retrieve some files etc
setTimeout(() => {
res.end();
}, 1000);
break;
case "/metrics":
res.setHeader('Content-Type', 'application/json');
res.write(JSON.stringify(metrics));
res.end()
break;
default:
res.statusCode = 404;
res.end();
break;
}
}).listen(8080, () => console.log("Server running!"))
如您所见,当您调用GET http://localhost:8080/metrics
api 时,响应将如下所示:
[
{
"path": "/test",
"method": "GET",
"status": 404,
"dateTime": 1613631702906,
"times": 1
},
{
"path": "/route",
"method": "GET",
"status": 200,
"dateTime": 1613631702906,
"times": 1004
}
]
推荐阅读
- java - 强制 maven 使用不同的 java 版本
- distributed - IPFS 不能真正强制节点删除上传的文件,这不是问题吗?
- swift - 从 Xcode 12.5.1 CarPlay 模拟器启动时,CarPlay 停车应用程序崩溃
- android - 尝试在 appium android 中获取 URL 时出错
- javascript - “FastifyInstance”类型上不存在属性“db”
//工具文件
async function dbconnector(fastify, options) { try { await client.connect() console.log('db connected succesfully') fas
- django - Django:如何在使用 cron 作业时测试并发问题
- azure - 用于批量邀请来宾用户到 Azure AD 并为其分配用户属性的 PowerShell 脚本
- html - 为什么 `transform: scale(1)` 会改变页脚位置(在 Chrome 中)?
- python - 在 python 的 setup.py 中根据用户及其偏好(动态)安装要求
- reactjs - 当我想使用 react axios 从 django rest api 获取一些东西时,它在我的控制台中显示 [object Object]