annotate mod_streamstats/mod_streamstats.lua @ 4730:1da4b815d2fe

mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls This covers the following things: - A session that appears online, but has a broken TCP connection - Clients such as Siskin and Snikket iOS that require a push for calls to work It allows the stanza to be pushed immediately instead of waiting for the session to hibernate or an ack to timeout. It shouldn't break any existing cases.
author Matthew Wild <mwild1@gmail.com>
date Wed, 27 Oct 2021 19:12:03 +0100
parents a7f7a7e75737
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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 });