Javascript 如何监控express&;的传入和传出网络字节;socket.io服务器

Javascript 如何监控express&;的传入和传出网络字节;socket.io服务器,javascript,node.js,nginx,monitoring,Javascript,Node.js,Nginx,Monitoring,我有一个express服务器,其中也包含socket.io。我想知道在每个客户端的请求(包括HTTP和套接字(WSS))上,有多少字节从外部进入内部。我正在寻找一个使用开源技术的解决方案 我在网上找到了许多教程来获取createServer方法中的读取字节,但这里我不使用这个方法,因为我使用express.js。请参考我下面的代码并帮助我 我们使用Nginx作为生产服务器 const express = require('express') const app = express() const

我有一个express服务器,其中也包含socket.io。我想知道在每个客户端的请求(包括HTTP和套接字(WSS))上,有多少字节从外部进入内部。我正在寻找一个使用开源技术的解决方案

我在网上找到了许多教程来获取
createServer
方法中的读取字节,但这里我不使用这个方法,因为我使用
express.js
。请参考我下面的代码并帮助我

我们使用Nginx作为生产服务器

const express = require('express')
const app = express()
const http = require('http').Server(app)
const io = require('socket.io')(http)

app.get('/', (req, res) => {
    res.render('index')
})

http.listen(8080, () => console.log(`Server is running at 0.0.0.0:8080`))

如果您也想捕获socket.io统计数据,则需要访问tcp层。 节点js中的tcp套接字具有以下方便的属性:
bytesRead
&
bytesRead

当客户端关闭套接字时,使用这些来计算传输的全部内容

consthttp=require('http');
const express=require('express');
常量app=express();
const stats=新映射();
设置间隔(()=>{
log(“stats”,stats);
}, 3000)
const web=http.createServer(app);
web.on(“连接”,(套接字)=>{
console.log(“新连接”)
如果(!stats[socket.remoteAddress]){
stats[socket.remoteAddress]={
接收:0,,
传送:0
};
}
socket.on(“close”,()=>{
log(“保存统计数据”)
stats[socket.remoteAddress].receive+=socket.bytesRead;
stats[socket.remoteAddress].transmit+=socket.bytesWrite;
});
});
听(8080,“127.0.0.1”,()=>{
console.log(“正在运行”)
});
const io=require(“socket.io”)(web);
io.on('连接',套接字=>{
socket.on(“时间戳”,(数据)=>{
console.log(数据)
});
});
应用程序获取(“/”,(请求,请求)=>{
让html='';
html+='';
html+='const socket=io('http://127.0.0.1:8080");';
html+='setInterval(()=>{socket.emit(“timestamp”,Date.now())},1000');
html+='';
res.end(html);
});
请注意,这度量了所有内容,包括http头和其他开销。 我不知道当套接字未正确关闭时会发生什么(超时等)

这不是“失败保存”,您需要添加错误处理和超时内容,以便不会丢失任何传输的字节

如果您需要更改任何内容,或者它不能像预期的那样工作,请告诉我


根据评论/聊天记录更新答案

consthttp=require('http');
const express=require('express');
常量app=express();
const stats=新映射();
设置间隔(()=>{
log(“stats”,stats);
}, 3000)
const web=http.createServer(app);
听(8080,“127.0.0.1”,()=>{
console.log(“正在运行”)
});
const io=require(“socket.io”)(web);
应用程序获取(“/”,(请求,请求)=>{
const{socket}=req;
如果(!stats[socket.remoteAddress]){
stats[socket.remoteAddress]={
接收:0,,
传送:0
};
}
socket.once(“关闭”,()=>{
log(“保存统计数据”)
stats[socket.remoteAddress].receive+=socket.bytesRead;
stats[socket.remoteAddress].transmit+=socket.bytesWrite;
});
res.end(“你好世界”);
});

这只计算路由上的http请求
/
,没有WebSocket,只有纯http。

对于“客户端”,您指的是源ip或如何定义客户端?服务器和客户端如果不回答我的问题,您需要告诉如何识别“客户端”。不是指http/socket.io clientweb.on(“连接”,(套接字)=>{"从这里我如何才能得到客户端访问的端点?你指的是url?你不能。在tcp层,tcp不理解http协议。必须首先解析http消息DHTTP或WSS,这更消耗数据?在http上,你必须为每个请求反复发送完整的http消息,包括标头等。对于websockets message,一旦一个ws-connection被交换,只传输有效负载和一些其他字节,因为它使用底层tcp套接字。所以ws是更多的“带宽”friendly@AmalaAmala用于http&websocket?还是仅在快速路由内?