Mercurial > prosody-hg
comparison plugins/mod_bosh.lua @ 9990:f122972b77b2
mod_bosh: Added metrics for active/inactive sessions, new BOSH sessions, BOSH errors, and timeouts (finishes #998)
| author | Arc Riley <arcriley@gmail.com> |
|---|---|
| date | Fri, 03 May 2019 04:10:31 -0700 |
| parents | 7259a61bacc8 |
| children | 0f335815244f |
comparison
equal
deleted
inserted
replaced
| 9989:026f9594f661 | 9990:f122972b77b2 |
|---|---|
| 53 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat; | 53 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat; |
| 54 | 54 |
| 55 -- All sessions, and sessions that have no requests open | 55 -- All sessions, and sessions that have no requests open |
| 56 local sessions = module:shared("sessions"); | 56 local sessions = module:shared("sessions"); |
| 57 | 57 |
| 58 local measure_active = module:measure("active_sessions", "amount"); | |
| 59 local measure_inactive = module:measure("inactive_sessions", "amount"); | |
| 60 local report_bad_host = module:measure("bad_host", "rate"); | |
| 61 local report_bad_sid = module:measure("bad_sid", "rate"); | |
| 62 local report_new_sid = module:measure("new_sid", "rate"); | |
| 63 local report_timeout = module:measure("timeout", "rate"); | |
| 64 | |
| 65 module:hook("stats-update", function () | |
| 66 local active = 0; | |
| 67 local inactive = 0; | |
| 68 for _, session in pairs(sessions) do | |
| 69 if #session.requests > 0 then | |
| 70 active = active + 1; | |
| 71 else | |
| 72 inactive = inactive + 1; | |
| 73 end | |
| 74 end | |
| 75 measure_active(active); | |
| 76 measure_inactive(inactive); | |
| 77 end); | |
| 78 | |
| 58 -- Used to respond to idle sessions (those with waiting requests) | 79 -- Used to respond to idle sessions (those with waiting requests) |
| 59 function on_destroy_request(request) | 80 function on_destroy_request(request) |
| 60 log("debug", "Request destroyed: %s", tostring(request)); | 81 log("debug", "Request destroyed: %s", tostring(request)); |
| 61 local session = sessions[request.context.sid]; | 82 local session = sessions[request.context.sid]; |
| 62 if session then | 83 if session then |
| 72 local max_inactive = session.bosh_max_inactive; | 93 local max_inactive = session.bosh_max_inactive; |
| 73 if max_inactive and #requests == 0 then | 94 if max_inactive and #requests == 0 then |
| 74 if session.inactive_timer then | 95 if session.inactive_timer then |
| 75 session.inactive_timer:stop(); | 96 session.inactive_timer:stop(); |
| 76 end | 97 end |
| 77 session.inactive_timer = module:add_timer(max_inactive, check_inactive, session, request.context, | 98 session.inactive_timer = module:add_timer(max_inactive, session_timeout, session, request.context, |
| 78 "BOSH client silent for over "..max_inactive.." seconds"); | 99 "BOSH client silent for over "..max_inactive.." seconds"); |
| 79 (session.log or log)("debug", "BOSH session marked as inactive (for %ds)", max_inactive); | 100 (session.log or log)("debug", "BOSH session marked as inactive (for %ds)", max_inactive); |
| 80 end | 101 end |
| 81 if session.bosh_wait_timer then | 102 if session.bosh_wait_timer then |
| 82 session.bosh_wait_timer:stop(); | 103 session.bosh_wait_timer:stop(); |
| 83 session.bosh_wait_timer = nil; | 104 session.bosh_wait_timer = nil; |
| 84 end | 105 end |
| 85 end | 106 end |
| 86 end | 107 end |
| 87 | 108 |
| 88 function check_inactive(now, session, context, reason) -- luacheck: ignore 212/now | 109 function session_timeout(now, session, context, reason) -- luacheck: ignore 212/now |
| 89 if not session.destroyed then | 110 if not session.destroyed then |
| 111 report_timeout(); | |
| 90 sessions[context.sid] = nil; | 112 sessions[context.sid] = nil; |
| 91 sm_destroy_session(session, reason); | 113 sm_destroy_session(session, reason); |
| 92 end | 114 end |
| 93 end | 115 end |
| 94 | 116 |
| 184 -- A response has been sent already, or we're ignoring this request | 206 -- A response has been sent already, or we're ignoring this request |
| 185 -- (e.g. so a different instance of the module can handle it) | 207 -- (e.g. so a different instance of the module can handle it) |
| 186 return; | 208 return; |
| 187 end | 209 end |
| 188 module:log("warn", "Unable to associate request with a session (incomplete request?)"); | 210 module:log("warn", "Unable to associate request with a session (incomplete request?)"); |
| 211 report_bad_sid(); | |
| 189 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate", | 212 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate", |
| 190 ["xmlns:stream"] = xmlns_streams, condition = "item-not-found" }); | 213 ["xmlns:stream"] = xmlns_streams, condition = "item-not-found" }); |
| 191 return tostring(close_reply) .. "\n"; | 214 return tostring(close_reply) .. "\n"; |
| 192 end | 215 end |
| 193 | 216 |
| 251 | 274 |
| 252 local to_host = nameprep(attr.to); | 275 local to_host = nameprep(attr.to); |
| 253 local wait = tonumber(attr.wait); | 276 local wait = tonumber(attr.wait); |
| 254 if not to_host then | 277 if not to_host then |
| 255 log("debug", "BOSH client tried to connect to invalid host: %s", tostring(attr.to)); | 278 log("debug", "BOSH client tried to connect to invalid host: %s", tostring(attr.to)); |
| 279 report_bad_host(); | |
| 256 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate", | 280 local close_reply = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate", |
| 257 ["xmlns:stream"] = xmlns_streams, condition = "improper-addressing" }); | 281 ["xmlns:stream"] = xmlns_streams, condition = "improper-addressing" }); |
| 258 response:send(tostring(close_reply)); | 282 response:send(tostring(close_reply)); |
| 259 return; | 283 return; |
| 260 end | 284 end |
| 288 | 312 |
| 289 local filter = initialize_filters(session); | 313 local filter = initialize_filters(session); |
| 290 | 314 |
| 291 session.log("debug", "BOSH session created for request from %s", session.ip); | 315 session.log("debug", "BOSH session created for request from %s", session.ip); |
| 292 log("info", "New BOSH session, assigned it sid '%s'", sid); | 316 log("info", "New BOSH session, assigned it sid '%s'", sid); |
| 317 report_new_sid(); | |
| 293 | 318 |
| 294 module:fire_event("bosh-session", { session = session, request = request }); | 319 module:fire_event("bosh-session", { session = session, request = request }); |
| 295 | 320 |
| 296 -- Send creation response | 321 -- Send creation response |
| 297 local creating_session = true; | 322 local creating_session = true; |
| 342 | 367 |
| 343 local session = sessions[sid]; | 368 local session = sessions[sid]; |
| 344 if not session then | 369 if not session then |
| 345 -- Unknown sid | 370 -- Unknown sid |
| 346 log("info", "Client tried to use sid '%s' which we don't know about", sid); | 371 log("info", "Client tried to use sid '%s' which we don't know about", sid); |
| 372 report_bad_sid(); | |
| 347 response:send(tostring(st.stanza("body", { xmlns = xmlns_bosh, type = "terminate", condition = "item-not-found" }))); | 373 response:send(tostring(st.stanza("body", { xmlns = xmlns_bosh, type = "terminate", condition = "item-not-found" }))); |
| 348 context.notopen = nil; | 374 context.notopen = nil; |
| 349 return; | 375 return; |
| 350 end | 376 end |
| 351 | 377 |
