require 'socket'
class Statsd
@@config = {}
def self.configure(host, port)
@@config = {
:host => host,
:port => port
}
end
def self.timing(stat, time, sample_rate=1)
# Log timing information
# > require 'ruby_example'
# > Statsd.timing('some.time', 500)
stats = {}
stats[stat] = "#{time}|ms"
Statsd.send(stats, sample_rate)
end
def self.increment(stats, sample_rate=1)
# Increments one or more stats counters
# > Statsd.increment('some.int')
# > Statsd.increment('some.int',0.5)
Statsd.update_stats(stats, 1, sample_rate)
end
def self.decrement(stats, sample_rate=1)
# Decrements one or more stats counters
# > Statsd.decrement('some.int')
Statsd.update_stats(stats, -1, sample_rate)
end
def self.update_stats(stats, delta=1, sampleRate=1)
# Updates one or more stats counters by arbitrary amounts
# > Statsd.update_stats('some.int',10)
stats = [stats] unless stats.kind_of?(Array)
data = {}
stats.each do |stat|
data[stat] = "#{delta}|c"
end
Statsd.send(data, sampleRate)
end
def self.send(data, sample_rate=1)
# Squirt the metrics over UDP
if @@config[:host].nil? || @@config[:port].nil?
raise ArgumentError.new("No configuration was specified")
end
sampled_data = {}
if sample_rate < 1
if rand <= sample_rate
data.each_key do |stat|
value = data[stat]
sampled_data[stat] = "#{value}|@#{sample_rate}"
end
end
else
sampled_data = data
sock = UDPSocket.new
sampled_data.each_key do |stat|
value = data[stat]
sock.send("#{stat}:#{value}", 0, @@config[:host], @@config[:port])
end
end
end
end