changeset 3374:5fdbf416bd40

mod_measure_client_features: Add a module to count the features of each connected client
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 11 Nov 2018 14:44:27 +0100
parents 322e8e7ba7d4
children 6317a5d8ce2d
files mod_measure_client_features/README.markdown mod_measure_client_features/mod_measure_client_features.lua
diffstat 2 files changed, 49 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_measure_client_features/README.markdown	Sun Nov 11 14:44:27 2018 +0100
@@ -0,0 +1,13 @@
+---
+labels:
+- Statistics
+summary: Collect statistics on client features
+---
+
+Description
+===========
+
+This module measures the features supported by each connected client.
+
+It requires mod\_cache\_c2s\_caps to be loaded on each VirtualHost to
+provide the disco#info data.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_measure_client_features/mod_measure_client_features.lua	Sun Nov 11 14:44:27 2018 +0100
@@ -0,0 +1,36 @@
+module:set_global();
+
+local measure = require"core.statsmanager".measure;
+
+local disco_ns = "http://jabber.org/protocol/disco#info";
+
+local counters = {
+	total = measure("amount", "client_features.total");
+};
+
+module:hook("stats-update", function ()
+	local total = 0;
+	local buckets = {};
+	for _, session in pairs(prosody.full_sessions) do
+		local disco_info = session.caps_cache;
+		if disco_info ~= nil then
+			for feature in disco_info:childtags("feature", disco_ns) do
+				local var = feature.attr.var;
+				if var ~= nil then
+					if buckets[var] == nil then
+						buckets[var] = 0;
+					end
+					buckets[var] = buckets[var] + 1;
+				end
+			end
+			total = total + 1;
+		end
+	end
+	for bucket, count in pairs(buckets) do
+		if counters[bucket] == nil then
+			counters[bucket] = measure("amount", "client_features."..bucket);
+		end
+		counters[bucket](count);
+	end
+	counters.total(total);
+end)