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_example.rb
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
back to top