comparison mod_streamstats/mod_streamstats.lua @ 741:a7f7a7e75737

mod_streamstats: Switch to portmanager and other 0.9 goodness
author Kim Alvefur <zash@zash.se>
date Wed, 11 Jul 2012 19:07:15 +0200
parents d4f3754c4286
children
comparison
equal deleted inserted replaced
740:1861d6ba6ff6 741:a7f7a7e75737
1 local stats = prosody.stats; 1 module:set_global();
2 local stats = module:shared"stats";
2 local iter = require "util.iterators"; 3 local iter = require "util.iterators";
3 local count, keys = iter.count, iter.keys; 4 local count, keys = iter.count, iter.keys;
4 5
5 if not stats then 6 stats.stats = stats.stats or {};
6 stats = { 7 stats.conns = stats.conns or {};
7 stats = {}; conns = {}; 8
8 9 setmetatable(stats, {
10 __index = {
11
9 broadcast = function (self, stat) 12 broadcast = function (self, stat)
10 local value = self.stats[stat]; 13 local value = self.stats[stat];
11 for conn in pairs(self.conns) do 14 for conn in pairs(self.conns) do
12 conn:write(stat..":"..value.."\n"); 15 conn:write(stat..":"..value.."\n");
13 end 16 end
22 set = function (self, stat, value) 25 set = function (self, stat, value)
23 if value == self.stats[stat] then return; end 26 if value == self.stats[stat] then return; end
24 self.stats[stat] = value; 27 self.stats[stat] = value;
25 self:broadcast(stat); 28 self:broadcast(stat);
26 end; 29 end;
27 30
28 add_conn = function (self, conn) 31 add_conn = function (self, conn)
29 self.conns[conn] = true; 32 self.conns[conn] = true;
30 for stat, value in pairs(self.stats) do 33 for stat, value in pairs(self.stats) do
31 conn:write(stat..":"..value.."\n"); 34 conn:write(stat..":"..value.."\n");
32 end 35 end
33 end; 36 end;
34 37
35 remove_conn = function (self, conn) 38 remove_conn = function (self, conn)
36 self.conns[conn] = nil; 39 self.conns[conn] = nil;
37 end; 40 end;
38 }; 41 };
39 prosody.stats = stats; 42 });
40 43
41 local network = {}; 44 local network = {};
42 45
43 function network.onconnect(conn) 46 function network.onconnect(conn)
44 stats:add_conn(conn); 47 stats:add_conn(conn);
45 end
46
47 function network.onincoming(conn, data)
48 end
49
50 function network.ondisconnect(conn, reason)
51 stats:remove_conn(conn);
52 end
53
54 require "util.iterators";
55 require "util.timer".add_task(1, function ()
56 stats:set("s2s-in", count(keys(prosody.incoming_s2s)));
57 return math.random(10, 20);
58 end);
59 require "util.timer".add_task(3, function ()
60 local s2sout_count = 0;
61 for _, host in pairs(prosody.hosts) do
62 s2sout_count = s2sout_count + count(keys(host.s2sout));
63 end
64 stats:set("s2s-out", s2sout_count);
65 return math.random(10, 20);
66 end);
67
68 require "net.connlisteners".register("stats", network);
69 require "net.connlisteners".start("stats", { port = module:get_option("stats_ports") or 5444, interface = "127.0.0.1" });
70 end 48 end
71 49
72 module:hook("resource-bind", function () 50 function network.onincoming(conn, data)
73 stats:adjust("c2s", 1); 51 end
52
53 function network.ondisconnect(conn, reason)
54 stats:remove_conn(conn);
55 end
56
57 module:add_timer(1, function ()
58 stats:set("s2s-in", count(keys(prosody.incoming_s2s)));
59 return math.random(10, 20);
74 end); 60 end);
75 module:hook("resource-unbind", function () 61 module:add_timer(3, function ()
76 stats:adjust("c2s", -1); 62 local s2sout_count = 0;
63 for _, host in pairs(prosody.hosts) do
64 s2sout_count = s2sout_count + count(keys(host.s2sout));
65 end
66 stats:set("s2s-out", s2sout_count);
67 return math.random(10, 20);
77 end); 68 end);
78 69
79 local c2s_count = 0; 70
80 for username, user in pairs(hosts[module.host].sessions or {}) do 71 function module.add_host(module)
81 for resource, session in pairs(user.sessions or {}) do 72 module:hook("resource-bind", function ()
82 c2s_count = c2s_count + 1; 73 stats:adjust("c2s", 1);
74 end);
75 module:hook("resource-unbind", function ()
76 stats:adjust("c2s", -1);
77 end);
78
79 local c2s_count = 0;
80 for username, user in pairs(hosts[module.host].sessions or {}) do
81 for resource, session in pairs(user.sessions or {}) do
82 c2s_count = c2s_count + 1;
83 end
83 end 84 end
85 stats:set("c2s", c2s_count);
86
87 module:hook("s2sin-established", function (event)
88 stats:adjust("s2s-in", 1);
89 end);
90 module:hook("s2sin-destroyed", function (event)
91 stats:adjust("s2s-in", -1);
92 end);
93 module:hook("s2sout-established", function (event)
94 stats:adjust("s2s-out", 1);
95 end);
96 module:hook("s2sout-destroyed", function (event)
97 stats:adjust("s2s-out", -1);
98 end);
84 end 99 end
85 stats:adjust("c2s", c2s_count);
86 100
87 module:hook("s2sin-established", function (event) 101 module:provides("net", {
88 stats:adjust("s2s-in", 1); 102 default_port = 5444;
89 end); 103 listener = network;
90 module:hook("s2sin-destroyed", function (event) 104 });
91 stats:adjust("s2s-in", -1);
92 end);
93 module:hook("s2sout-established", function (event)
94 stats:adjust("s2s-out", 1);
95 end);
96 module:hook("s2sout-destroyed", function (event)
97 stats:adjust("s2s-out", -1);
98 end);