javascript - 如何监控来自 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`))
解决方案
如果您也想捕获 socket.io 统计信息,则需要进入 tcp 层。节点 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 标头和其他开销。我不知道套接字没有正确关闭时会发生什么(超时等)
这不是“失败保存”,您需要添加错误处理和超时内容,这样您就不会错过任何传输的字节。
如果您需要更改任何内容或无法按预期工作,请告诉我!
根据评论/“聊天”更新答案
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。
推荐阅读
- angular - 如何通过管道传输多个依赖的 Observable?
- node.js - 每分钟通过数组发出 http 请求
- php - SQLSTATE [42S22]:找不到列:在 laravel affte 中使用有子句?
- python - 如何在 Kivy 中更改图像画布大小
- python - Pyusb Windows 错误:USBError: [Errno None] libusb0-dll:err [claim_interface] could not claim interface 1, win error: The requested resource is in use
- perl - 自动检测时间格式的 Perl 模块?(并且可以转换)
- fortran - 获取 Fortran 中 OpenMP 线程之间的最大值
- android - Retrofit、RxJava2 和 Room 的类型一致性:如果响应是数组或对象,如何使用相同的有效负载反序列化 JSON,但不同的“根键”
- facebook - Facebook 调试器,Open Graph 图像标签 - Facebook 无法处理托管在 CloudFront 上的某些图像
- javascript - 如何停止 Socket.io 垃圾邮件连接?