【问题标题】:How to monitor incoming and outgoing network bytes from express & socket.io servers如何监控来自 express 和 socket.io 服务器的传入和传出网络字节
【发布时间】:2020-10-19 08:06:18
【问题描述】:

我有一个快递服务器,上面也包含 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`))

【问题讨论】:

  • 与“客户端”你的意思是源 IP 或你如何定义客户端是什么?
  • 服务器和客户端
  • 那不回答我的问题,你需要告诉你如何识别“客户”是什么。不是http/socket.io客户端的意思

标签: javascript node.js nginx monitoring


【解决方案1】:

如果你也想捕获 socket.io 统计信息,你需要进入 tcp 层。 node js 中的 tcp 套接字具有方便的属性:bytesRead & bytesWritten: https://nodejs.org/dist/latest-v12.x/docs/api/net.html#net_socket_bytesread

当客户端关闭套接字时,使用这些来计算传输的东西的总量。

const http = require('http');
const express = require('express');

const app = express();
const stats = new Map();

setInterval(() => {
    console.log("stats", stats);
}, 3000)

const web = http.createServer(app);

web.on("connection", (socket) => {
    console.log("new connection")

    if (!stats[socket.remoteAddress]) {
        stats[socket.remoteAddress] = {
            receive: 0,
            transmit: 0
        };
    }

    socket.on("close", () => {
        console.log("Save stats")
        stats[socket.remoteAddress].receive += socket.bytesRead;
        stats[socket.remoteAddress].transmit += socket.bytesWritten;
    });
});

web.listen(8080, "127.0.0.1", () => {
    console.log("Running")
});

const io = require("socket.io")(web);

io.on('connection', socket => {
    socket.on("timestamp", (data) => {
        console.log(data)
    });
});

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

    let html = '<script src="/socket.io/socket.io.js"></script>';
    html += '<script>';
    html += '   const socket = io("http://127.0.0.1:8080");';
    html += '   setInterval(() => {socket.emit("timestamp", Date.now())}, 1000)';
    html += '</script>';

    res.end(html);
});

请注意,这衡量一切,包括。 http 标头和其他开销。 不知道socket没有正常关闭时会发生什么(超时等)

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

如果您需要更改任何内容或无法按预期工作,请告诉我!


根据评论/“聊天”更新答案

const http = require('http');
const express = require('express');

const app = express();
const stats = new Map();

setInterval(() => {
    console.log("stats", stats);
}, 3000)



const web = http.createServer(app);


web.listen(8080, "127.0.0.1", () => {
    console.log("Running")
});


const io = require("socket.io")(web);



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

    const { socket } = req;

    if (!stats[socket.remoteAddress]) {
        stats[socket.remoteAddress] = {
            receive: 0,
            transmit: 0
        };
    }

    socket.once("close", () => {
        console.log("Save stats")
        stats[socket.remoteAddress].receive += socket.bytesRead;
        stats[socket.remoteAddress].transmit += socket.bytesWritten;
    });

    res.end("Hello World");

});

这仅计算路由 / 上的 http 请求,没有 websockets 只是普通的 http。

【讨论】:

  • web.on("connection", (socket) => { " 我怎样才能得到客户端访问的端点
  • 你的意思是网址?你不能。这个在tcp层上,tcp dosnt理解http协议。必须先解析 http 消息
  • HTTP 还是 WSS,哪个更耗数据?
  • 在 http 上,您必须发送完整的 http 消息,包括。每个请求的标题等一遍又一遍。对于 websockets 消息,一旦 ws 连接建立,只传输有效负载和其他几个字节,因为它使用底层 tcp 套接字。所以 ws 对“带宽”更友好
  • @AmalaAmala 对于 http 和 websocket ?还是在快速路线内?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多