-
Notifications
You must be signed in to change notification settings - Fork 1
/
statsd.lua
69 lines (60 loc) · 1.46 KB
/
statsd.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
-- StatsD.php ported to lua
-- A simple statsd client
-- original from Joel Barciauskas (https://gist.github.com/1065177)
local math = require "math"
local os = require "os"
local socket = require "socket"
local type, pairs, ipairs, next = type, pairs, ipairs, next
local pcall = pcall
math.randomseed(os.time())
module((...))
function timing(stat, time, sample_rate)
sample_rate = sample_rate or 1
send({ [stat] = time .. '|ms'}, sample_rate)
end
function increment(stats, sample_rate)
sample_rate = sample_rate or 1
update_stats(stats, 1, sample_rate)
end
function decrement(stats, sample_rate)
sample_rate = sample_rate or 1
update_stats(stats, -1, sample_rate)
end
function update_stats(stats, delta, sample_rate)
delta = delta or 1
sample_rate = sample_rate or 1
if type(stats) ~= 'table' then
stats = { stats }
end
local data = {}
for _,v in ipairs(stats) do
data[v] = delta .. '|c'
end
send(data, sample_rate)
end
function send(data, sample_rate)
sample_rate = sample_rate or 1
local sampled_data = {}
if sample_rate < 1 then
for k,v in pairs(data) do
if math.random() <= sample_rate then
sampled_data[k] = v .. '|@' .. sample_rate
end
end
else
sampled_data = data
end
if not next(sampled_data) then
return
end
-- ignore any errors
pcall(function()
local udp = socket.udp()
local host, port = "localhost", 8125
udp:setpeername(host, port)
for k,v in pairs(data) do
udp:send(k .. ':' .. v)
end
udp:close()
end)
end