首页 > 解决方案 > 如何监控来自 express 和 socket.io 服务器的传入和传出网络字节

问题描述

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

标签: javascriptnode.jsnginxmonitoring

解决方案


如果您也想捕获 socket.io 统计信息,则需要进入 tcp 层。节点 js 中的 tcp 套接字具有方便的属性:bytesRead& bytesWrittenhttps ://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 标头和其他开销。我不知道套接字没有正确关闭时会发生什么(超时等)

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

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


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

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。


推荐阅读