forked from statsd/statsd
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add a new ruby_example.rb file with a library for ruby. heavily inspi…
…red by python_example.py.
- Loading branch information
Showing
1 changed file
with
97 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
require 'socket' | ||
require 'yaml' | ||
|
||
# ruby_example.rb | ||
|
||
# Ian Sefferman <[email protected]> | ||
# http://www.iseff.com | ||
|
||
# If this is running in a Rails environment, will pick up config/statsd.yml. | ||
# config/statsd.yml should look like: | ||
# production: | ||
# host: statsd.domain.com | ||
# port: 8125 | ||
# development: | ||
# host: localhost | ||
# port: 8125 | ||
|
||
# If this file is not running in Rails environment, will pick up ./statsd.yml | ||
# ./statsd.yml should look like: | ||
# host: localhost | ||
# port: 8125 | ||
|
||
# If neither of these files are present, it will default to localhost:8125 | ||
|
||
# Sends statistics to the stats daemon over UDP | ||
class Statsd | ||
|
||
def self.timing(stats, time, sample_rate=1) | ||
Statsd.update_stats(stats, time, sample_rate, 'ms') | ||
end | ||
|
||
def self.increment(stats, sample_rate=1) | ||
Statsd.update_stats(stats, 1, sample_rate) | ||
end | ||
|
||
def self.decrement(stats, sample_rate=1) | ||
Statsd.update_stats(stats, -1, sample_rate) | ||
end | ||
|
||
def self.update_stats(stats, delta=1, sample_rate=1, metric='c') | ||
stats = [stats].flatten | ||
|
||
data = {} | ||
stats.each do |stat| | ||
data[stat] = "%s|%s" % [delta, metric] | ||
end | ||
|
||
Statsd.send(data, sample_rate) | ||
end | ||
|
||
def self.send(data, sample_rate=1) | ||
begin | ||
host = config["host"] || "localhost" | ||
port = config["port"] || "8125" | ||
|
||
sampled_data = {} | ||
if sample_rate < 1 | ||
if rand <= sample_rate | ||
data.each_pair do |stat, val| | ||
sampled_data[stat] = "%s|@%s" % [val, sample_rate] | ||
end | ||
end | ||
else | ||
sampled_data = data | ||
end | ||
|
||
udp = UDPSocket.new | ||
sampled_data.each_pair do |stat, val| | ||
send_data = "%s:%s" % [stat, val] | ||
udp.send send_data, 0, host, port | ||
end | ||
rescue => e | ||
puts e.message | ||
end | ||
end | ||
|
||
@@config = {} | ||
def self.config | ||
return @@config if @@config | ||
begin | ||
config_path = File.join(File.dir(__FILE__), "statsd.yml") | ||
# for Rails environments, check Rails.root/config/statsd.yml | ||
if defined? Rails | ||
config_path = File.join(Rails.root, "config", "statsd.yml") | ||
@@config = open(config_path) { |f| YAML.load(f) } | ||
@@config = @@config[Rails.env] | ||
else | ||
@@config = open(config_path) { |f| YAML.load(f) } | ||
end | ||
rescue => e | ||
puts "config: #{e.message}" | ||
@@config = {} | ||
end | ||
|
||
@@config | ||
end | ||
end |