mod_measure_client_features: Add a module to count the features of each connected client
--- /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)