Changeset

6049:491c56449a76

mod_measure_conn_buffers: Measure total size of connection write buffers
author Matthew Wild <mwild1@gmail.com>
date Mon, 11 Nov 2024 14:03:46 +0000
parents 6048:cce76628c83a
children 6050:81805f11263c
files mod_measure_conn_buffers/README.md mod_measure_conn_buffers/mod_measure_conn_buffers.lua
diffstat 2 files changed, 41 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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.
--- /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);