首页 > 解决方案 > 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 正确地做到这一点?

标签: javascriptnode.js

解决方案


finish您可以通过对象的事件来处理它resres.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/metricsapi 时,响应将如下所示:

[
  {
    "path": "/test",
    "method": "GET",
    "status": 404,
    "dateTime": 1613631702906,
    "times": 1
  },
  {
    "path": "/route",
    "method": "GET",
    "status": 200,
    "dateTime": 1613631702906,
    "times": 1004
  }
]

推荐阅读