Diff

plugins/mod_csi.lua @ 13510:393e265aafba

mod_csi: Count how many sessions are using CSI and their state
author Kim Alvefur <zash@zash.se>
date Sat, 17 Aug 2024 23:13:28 +0200
parent 13075:82980f6890cd
child 13511:453979e16f2d
line wrap: on
line diff
--- a/plugins/mod_csi.lua	Fri Aug 16 18:39:46 2024 +0200
+++ b/plugins/mod_csi.lua	Sat Aug 17 23:13:28 2024 +0200
@@ -1,8 +1,10 @@
+local statsmanager = require "prosody.core.statsmanager";
 local st = require "prosody.util.stanza";
 local xmlns_csi = "urn:xmpp:csi:0";
 local csi_feature = st.stanza("csi", { xmlns = xmlns_csi });
 
 local change = module:metric("counter", "changes", "events", "CSI state changes", {"csi_state"});
+local count = module:metric("gauge", "state", "sessions", "", { "state" });
 
 module:hook("stream-features", function (event)
 	if event.origin.username then
@@ -23,3 +25,21 @@
 
 module:hook("stanza/"..xmlns_csi..":active", refire_event("csi-client-active"));
 module:hook("stanza/"..xmlns_csi..":inactive", refire_event("csi-client-inactive"));
+
+module:hook_global("stats-update", function()
+	local sessions = prosody.hosts[module.host].sessions;
+	if not sessions then return end
+	statsmanager.cork();
+	-- Can't do :clear() on host-scoped measures?
+	count:with_labels("active"):set(0);
+	count:with_labels("inactive"):set(0);
+	count:with_labels("flushing"):set(0);
+	for user, user_session in pairs(sessions) do
+		for resource, session in pairs(user_session.sessions) do
+			if session.state == "inactive" or session.state == "active" or session.state == "flushing" then
+				count:with_labels(session.state):add(1);
+			end
+		end
+	end
+	statsmanager.uncork();
+end);