https://github.com/statsd/statsd
Raw File
Tip revision: 712dcfbb588a3babf20acd1947857263b4a0722a authored by Daniel Schauenberg on 20 July 2012, 16:07:19 UTC
bump to v0.5.0
Tip revision: 712dcfb
ruby_example2.rb
require 'socket'
require 'yaml'

# ruby_example.rb

# Ian Sefferman <iseff@iseff.com>
# 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.gauges(stats, value, sample_rate=1)
    Statsd.update_stats(stats, value, sample_rate, 'g')
  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

  def self.config
    return @@config if self.class_variable_defined?(:@@config)
    begin 
      config_path = File.join(File.dirname(__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
back to top