mod_statsd/mod_statsd.lua
changeset 1443 faf1a5d89cd7
child 1445 e96ac4291b36
equal deleted inserted replaced
1442:253e374824a8 1443:faf1a5d89cd7
       
     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)