mod_measure_client_presence: Counts presence show and reports using 0.10+ statistics API.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_measure_client_presence/README.markdown Mon Oct 09 19:28:17 2017 +0100
@@ -0,0 +1,9 @@
+---
+summary: Collect statistics on user presences
+---
+
+Description
+===========
+
+This module measures the number of resources of a certain show (available,
+away, etc.) currently connected, and reports using Prosody 0.10 APIs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_measure_client_presence/mod_measure_client_presence.lua Mon Oct 09 19:28:17 2017 +0100
@@ -0,0 +1,48 @@
+module:set_global();
+
+local measure = require"core.statsmanager".measure;
+
+local valid_shows = {
+ available = true,
+ chat = true,
+ away = true,
+ dnd = true,
+ xa = true,
+ unavailable = true,
+}
+
+local counters = {
+ available = measure("amount", "client_presence.available"),
+ chat = measure("amount", "client_presence.chat"),
+ away = measure("amount", "client_presence.away"),
+ dnd = measure("amount", "client_presence.dnd"),
+ xa = measure("amount", "client_presence.xa"),
+ unavailable = measure("amount", "client_presence.unavailable"),
+ invalid = measure("amount", "client_presence.invalid");
+};
+
+module:hook("stats-update", function ()
+ local buckets = {
+ available = 0,
+ chat = 0,
+ away = 0,
+ dnd = 0,
+ xa = 0,
+ unavailable = 0,
+ invalid = 0,
+ };
+ for _, session in pairs(full_sessions) do
+ local status = "unavailable";
+ if session.presence then
+ status = session.presence:get_child_text("show") or "available";
+ end
+ if valid_shows[status] ~= nil then
+ buckets[status] = buckets[status] + 1;
+ else
+ buckets.invalid = buckets.invalid + 1;
+ end
+ end
+ for bucket, count in pairs(buckets) do
+ counters[bucket](count)
+ end
+end)