1443
|
1 -- Log common stats to statsd |
|
2 -- |
|
3 -- Copyright (C) 2014 Daurnimator |
|
4 -- |
|
5 -- This module is MIT/X11 licensed. |
|
6 |
|
7 local socket = require "socket" |
|
8 local iterators = require "util.iterators" |
|
9 local jid = require "util.jid" |
|
10 |
|
11 local options = module:get_option("statsd") or {} |
|
12 |
|
13 -- Create UDP socket to statsd server |
|
14 local sock = socket.udp() |
|
15 sock:setpeername(options.hostname or "127.0.0.1", options.port or 8125) |
|
16 |
|
17 -- Metrics are namespaced by ".", and seperated by newline |
|
18 function clean(s) return (s:gsub("[%.\n]", "_")) end |
|
19 |
|
20 -- A 'safer' send function to expose |
|
21 function send(s) return sock:send(s) end |
|
22 |
|
23 -- prefix should end in "." |
|
24 local prefix = (options.prefix or ("prosody." .. clean(module.host))) .. "." |
|
25 |
|
26 -- Track users as they bind/unbind |
|
27 -- count bare sessions every time, as we have no way to tell if it's a new bare session or not |
|
28 module:hook("resource-bind", function(event) |
|
29 send(prefix.."bare_sessions:"..iterators.count(bare_sessions).."|g") |
|
30 send(prefix.."full_sessions:+1|g") |
|
31 end, 1) |
|
32 module:hook("resource-unbind", function(event) |
|
33 send(prefix.."bare_sessions:"..iterators.count(bare_sessions).."|g") |
|
34 send(prefix.."full_sessions:-1|g") |
|
35 end, 1) |
|
36 |
|
37 -- Track MUC occupants as they join/leave |
|
38 module:hook("muc-occupant-joined", function(event) |
|
39 send(prefix.."n_occupants:+1|g") |
|
40 local room_node = jid.split(event.room.jid) |
|
41 send(prefix..clean(room_node)..".occupants:+1|g") |
|
42 end) |
|
43 module:hook("muc-occupant-left", function(event) |
|
44 send(prefix.."n_occupants:-1|g") |
|
45 local room_node = jid.split(event.room.jid) |
|
46 send(prefix..clean(room_node)..".occupants:-1|g") |
|
47 end) |
|
48 |
|
49 -- Misc other MUC |
|
50 module:hook("muc-broadcast-message", function(event) |
|
51 send(prefix.."broadcast-message:1|c") |
|
52 local room_node = jid.split(event.room.jid) |
|
53 send(prefix..clean(room_node)..".broadcast-message:1|c") |
|
54 end) |
|
55 module:hook("muc-invite", function(event) |
|
56 send(prefix.."invite:1|c") |
|
57 local room_node = jid.split(event.room.jid) |
|
58 send(prefix..clean(room_node)..".invite:1|c") |
|
59 local to_node, to_host, to_resource = jid.split(event.stanza.attr.to) |
|
60 send(prefix..clean(to_node)..".invites:1|c") |
|
61 end) |