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); |
