Mercurial > prosody-modules
comparison mod_measure_active_users/mod_measure_active_users.lua @ 4774:1132f2888cd2
mod_measure_active_users: Calculate active user counts over fixed time periods
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 17 Nov 2021 13:35:00 +0000 |
parents | |
children | 34b46d157797 |
comparison
equal
deleted
inserted
replaced
4773:eb63890ae8fc | 4774:1132f2888cd2 |
---|---|
1 local store = module:open_store("lastlog2"); | |
2 | |
3 local measure_d1 = module:measure("active_users_1d", "amount"); | |
4 local measure_d7 = module:measure("active_users_7d", "amount"); | |
5 local measure_d30 = module:measure("active_users_30d", "amount"); | |
6 | |
7 function update_calculations() | |
8 module:log("debug", "Calculating active users"); | |
9 local host_user_sessions = prosody.hosts[module.host].sessions; | |
10 local active_d1, active_d7, active_d30 = 0, 0, 0; | |
11 local now = os.time(); | |
12 for username in store:users() do | |
13 if host_user_sessions[username] then | |
14 -- Active now | |
15 active_d1, active_d7, active_d30 = | |
16 active_d1 + 1, active_d7 + 1, active_d30 + 1; | |
17 else | |
18 local lastlog_data = store:get(username); | |
19 if lastlog_data then | |
20 -- Due to server restarts/crashes/etc. some events | |
21 -- may not always get recorded, so we'll just take the | |
22 -- latest as a sign of last activity | |
23 local last_active = math.max( | |
24 lastlog_data.login and lastlog_data.login.timestamp or 0, | |
25 lastlog_data.logout and lastlog_data.logout.timestamp or 0 | |
26 ); | |
27 if now - last_active < 86400 then | |
28 active_d1 = active_d1 + 1; | |
29 end | |
30 if now - last_active < 86400*7 then | |
31 active_d7 = active_d7 + 1; | |
32 end | |
33 if now - last_active < 86400*30 then | |
34 active_d30 = active_d30 + 1; | |
35 end | |
36 end | |
37 end | |
38 end | |
39 module:log("debug", "Active users (took %ds): %d (24h), %d (7d), %d (30d)", os.time()-now, active_d1, active_d7, active_d30); | |
40 measure_d1(active_d1); | |
41 measure_d7(active_d7); | |
42 measure_d30(active_d30); | |
43 | |
44 return 3600 + (300*math.random()); | |
45 end | |
46 | |
47 module:add_timer(15, update_calculations); |