繁体   English   中英

NodeJS http 服务器指标

[英]NodeJS http server metrics

我有一项任务是做一个带有某种形式的指标的 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 正确地做到这一点?

如果您不能使用 express 或 koa 等框架,请在每条路线上创建自己的中间件

注意:这是最简单的例子,但它给出了研究的线索

class Middleware {
    use(func) {
        this.next_func = (
          (stack) =>
            (next) =>
              stack(
                func.bind(this, next.bind(this)),
              )
        )(this.next_func);
    }
    next_func = (next) => next();
}

您可以通过res object 的finish事件来处理它。当您调用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
  }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM