簡體   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