# HG changeset patch # User Matthew Wild # Date 1731333826 0 # Node ID 491c56449a763ca908a0fda778287cc5b37932c7 # Parent cce76628c83a258d8bc1ea312d38c07063ae5021 mod_measure_conn_buffers: Measure total size of connection write buffers diff -r cce76628c83a -r 491c56449a76 mod_measure_conn_buffers/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_measure_conn_buffers/README.md Mon Nov 11 14:03:46 2024 +0000 @@ -0,0 +1,12 @@ +--- +labels: +- Statistics +- Stage-Alpha +summary: Measure connection buffer usage +... + +Description +=========== + +This module measures data that is buffered by Prosody, waiting to be written +to sockets. diff -r cce76628c83a -r 491c56449a76 mod_measure_conn_buffers/mod_measure_conn_buffers.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_measure_conn_buffers/mod_measure_conn_buffers.lua Mon Nov 11 14:03:46 2024 +0000 @@ -0,0 +1,29 @@ +local measure_total_pending_tx = module:measure("total_pending_tx", "amount"); + +local server = require "net.server"; + +if server.get_backend() ~= "epoll" or not server.loop.fds then + module:log_status("error", "This module is not compatible with your network_backend, only epoll is supported"); + return; +end + +local fds = server.loop.fds; + +module:hook("stats-update", function () + local pending_tx = 0; + for _, conn in pairs(fds) do + local buffer = conn.writebuffer; + if buffer then + if type(buffer) == "string" then + pending_tx = pending_tx + #buffer; + elseif buffer._length then -- dbuffer + pending_tx = pending_tx + buffer._length; + else -- simple table + for i = 1, #buffer do + pending_tx = pending_tx + #buffer[i]; + end + end + end + end + measure_total_pending_tx(pending_tx); +end);