Software /
code /
prosody-modules
Comparison
mod_statistics/stats.lib.lua @ 1072:4dbdb1b465e8
mod_statistics: Initial version, and a rough 'prosodyctl mod_statistics top'
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Sat, 15 Jun 2013 19:08:34 +0100 |
child | 1075:164ed759b1d2 |
comparison
equal
deleted
inserted
replaced
1071:8f59b45fe6a7 | 1072:4dbdb1b465e8 |
---|---|
1 local it = require "util.iterators"; | |
2 local log = require "util.logger".init("stats"); | |
3 | |
4 local last_cpu_wall, last_cpu_clock; | |
5 local get_time = require "socket".gettime; | |
6 | |
7 local active_sessions, active_jids = {}, {}; | |
8 | |
9 local stats = { | |
10 total_users = { | |
11 get = function () return it.count(it.keys(bare_sessions)); end | |
12 }; | |
13 total_c2s = { | |
14 get = function () return it.count(it.keys(full_sessions)); end | |
15 }; | |
16 total_s2sin = { | |
17 get = function () return it.count(it.keys(prosody.incoming_s2s)); end | |
18 }; | |
19 total_s2sout = { | |
20 get = function () | |
21 local count = 0; | |
22 for host, host_session in pairs(hosts) do | |
23 count = count + it.count(it.keys(host_session.s2sout)); | |
24 end | |
25 return count; | |
26 end | |
27 }; | |
28 total_component = { | |
29 get = function () | |
30 local count = 0; | |
31 for host, host_session in pairs(hosts) do | |
32 if host_session.type == "component" then | |
33 local c = host_session.modules.component; | |
34 if c and c.connected then -- 0.9 only | |
35 count = count + 1; | |
36 end | |
37 end | |
38 end | |
39 return count; | |
40 end | |
41 }; | |
42 up_since = { | |
43 get = function () return prosody.start_time; end; | |
44 tostring = function (up_since) | |
45 return tostring(os.time()-up_since).."s"; | |
46 end; | |
47 }; | |
48 memory_used = { | |
49 get = function () return collectgarbage("count")/1024; end; | |
50 tostring = "%0.2fMB"; | |
51 }; | |
52 memory_process = { | |
53 get = function () return pposix.meminfo().allocated/1048576; end; | |
54 tostring = "%0.2fMB"; | |
55 }; | |
56 time = { | |
57 tostring = function () return os.date("%T"); end; | |
58 }; | |
59 cpu = { | |
60 get = function () | |
61 local new_wall, new_clock = get_time(), os.clock(); | |
62 local pc = 0; | |
63 if last_cpu_wall then | |
64 pc = 100/((new_wall-last_cpu_wall)/(new_clock-last_cpu_clock)); | |
65 end | |
66 last_cpu_wall, last_cpu_clock = new_wall, new_clock; | |
67 return math.ceil(pc); | |
68 end; | |
69 tostring = "%s%%"; | |
70 }; | |
71 }; | |
72 | |
73 local add_statistics_filter; -- forward decl | |
74 if prosody and prosody.full_sessions then -- start_time ensures we aren't in prosodyctl | |
75 setmetatable(active_sessions, { | |
76 __index = function ( t, k ) | |
77 local v = { | |
78 bytes_in = 0, bytes_out = 0; | |
79 stanzas_in = { | |
80 message = 0, presence = 0, iq = 0; | |
81 }; | |
82 stanzas_out = { | |
83 message = 0, presence = 0, iq = 0; | |
84 }; | |
85 } | |
86 rawset(t, k, v); | |
87 return v; | |
88 end | |
89 }); | |
90 local filters = require "util.filters"; | |
91 local function handle_stanza_in(stanza, session) | |
92 local s = active_sessions[session].stanzas_in; | |
93 local n = s[stanza.name]; | |
94 if n then | |
95 s[stanza.name] = n + 1; | |
96 end | |
97 return stanza; | |
98 end | |
99 local function handle_stanza_out(stanza, session) | |
100 local s = active_sessions[session].stanzas_out; | |
101 local n = s[stanza.name]; | |
102 if n then | |
103 s[stanza.name] = n + 1; | |
104 end | |
105 return stanza; | |
106 end | |
107 local function handle_bytes_in(bytes, session) | |
108 local s = active_sessions[session]; | |
109 s.bytes_in = s.bytes_in + #bytes; | |
110 return bytes; | |
111 end | |
112 local function handle_bytes_out(bytes, session) | |
113 local s = active_sessions[session]; | |
114 s.bytes_out = s.bytes_out + #bytes; | |
115 return bytes; | |
116 end | |
117 function add_statistics_filter(session) | |
118 filters.add_filter(session, "stanzas/in", handle_stanza_in); | |
119 filters.add_filter(session, "stanzas/out", handle_stanza_out); | |
120 filters.add_filter(session, "bytes/in", handle_bytes_in); | |
121 filters.add_filter(session, "bytes/out", handle_bytes_out); | |
122 end | |
123 end | |
124 | |
125 return { | |
126 stats = stats; | |
127 active_sessions = active_sessions; | |
128 filter_hook = add_statistics_filter; | |
129 }; |