mod_streamstats/mod_streamstats.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 741 a7f7a7e75737
permissions -rw-r--r--
mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel) Otherwise the global event handlers accumulate, one added each time logging is reoladed, and each invocation of the signal or event triggers one dump of each created ringbuffer.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
     1
module:set_global();
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
     2
local stats = module:shared"stats";
639
d4f3754c4286 mod_streamstats: Import count and keys from util.iterators
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
     3
local iter = require "util.iterators";
d4f3754c4286 mod_streamstats: Import count and keys from util.iterators
Matthew Wild <mwild1@gmail.com>
parents: 259
diff changeset
     4
local count, keys = iter.count, iter.keys;
259
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
     6
stats.stats = stats.stats or {};
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
     7
stats.conns = stats.conns or {};
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
     8
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
     9
setmetatable(stats, {
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    10
	__index = {
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    11
259
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
		broadcast = function (self, stat)
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
			local value = self.stats[stat];
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
			for conn in pairs(self.conns) do
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
				conn:write(stat..":"..value.."\n");
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
			end
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
		end;
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
		adjust = function (self, stat, delta)
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
			if delta == 0 then return; end
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
			self.stats[stat] = (self.stats[stat] or 0) + delta;
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
			self:broadcast(stat);
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
		end;
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
		set = function (self, stat, value)
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
			if value == self.stats[stat] then return; end
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
			self.stats[stat] = value;
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
			self:broadcast(stat);
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
		end;
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    30
259
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
		add_conn = function (self, conn)
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
			self.conns[conn] = true;
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
			for stat, value in pairs(self.stats) do
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
				conn:write(stat..":"..value.."\n");
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
			end
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
		end;
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    37
259
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
		remove_conn = function (self, conn)
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
			self.conns[conn] = nil;
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
		end;
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
	};
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    42
});
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    43
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    44
local network = {};
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    45
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    46
function network.onconnect(conn)
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    47
	stats:add_conn(conn);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    48
end
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    49
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    50
function network.onincoming(conn, data)
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    51
end
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    52
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    53
function network.ondisconnect(conn, reason)
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    54
	stats:remove_conn(conn);
259
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
end
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    57
module:add_timer(1, function ()
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    58
	stats:set("s2s-in", count(keys(prosody.incoming_s2s)));
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    59
	return math.random(10, 20);
259
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
end);
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    61
module:add_timer(3, function ()
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    62
	local s2sout_count = 0;
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    63
	for _, host in pairs(prosody.hosts) do
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    64
		s2sout_count = s2sout_count + count(keys(host.s2sout));
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    65
	end
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    66
	stats:set("s2s-out", s2sout_count);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    67
	return math.random(10, 20);
259
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
end);
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    70
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    71
function module.add_host(module)
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    72
	module:hook("resource-bind", function ()
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    73
		stats:adjust("c2s", 1);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    74
	end);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    75
	module:hook("resource-unbind", function ()
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    76
		stats:adjust("c2s", -1);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    77
	end);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    78
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    79
	local c2s_count = 0;
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    80
	for username, user in pairs(hosts[module.host].sessions or {}) do
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    81
		for resource, session in pairs(user.sessions or {}) do
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    82
			c2s_count = c2s_count + 1;
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    83
		end
259
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
	end
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    85
	stats:set("c2s", c2s_count);
259
d137515e0701 mod_streamstats: New module that streams live stats from Prosody over a TCP stream
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
741
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    87
	module:hook("s2sin-established", function (event)
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    88
		stats:adjust("s2s-in", 1);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    89
	end);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    90
	module:hook("s2sin-destroyed", function (event)
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    91
		stats:adjust("s2s-in", -1);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    92
	end);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    93
	module:hook("s2sout-established", function (event)
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    94
		stats:adjust("s2s-out", 1);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    95
	end);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    96
	module:hook("s2sout-destroyed", function (event)
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    97
		stats:adjust("s2s-out", -1);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    98
	end);
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
    99
end
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
   100
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
   101
module:provides("net", {
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
   102
	default_port = 5444;
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
   103
	listener = network;
a7f7a7e75737 mod_streamstats: Switch to portmanager and other 0.9 goodness
Kim Alvefur <zash@zash.se>
parents: 639
diff changeset
   104
});