changeset 2789:37ae0801f925

mod_measure_client_presence: Counts presence show and reports using 0.10+ statistics API.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Mon, 09 Oct 2017 19:28:17 +0100
parents 512405077709
children 5163f7905371
files mod_measure_client_presence/README.markdown mod_measure_client_presence/mod_measure_client_presence.lua
diffstat 2 files changed, 57 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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)