Sha256: b4ad675399eba249a853dd448ba5a0b2fb2b7277f97fc30065e38ddbef27ff8b

Contents?: true

Size: 1.46 KB

Versions: 1

Compression:

Stored size: 1.46 KB

Contents

require 'socket'

module Fozzie
  module Socket

    RESERVED_CHARS_REGEX = /[\:\|\@\s]/

    private

    # Send the statistic to the server
    #
    # Creates the Statsd key from the given values, and sends to socket (depending on sample rate)
    #
    def send(stat, delta, type, sample_rate)
      stat = [stat].flatten.compact.collect(&:to_s).join('.').downcase
      stat = stat.gsub('::', '.').gsub(RESERVED_CHARS_REGEX, '_')

      k =  [Fozzie.c.data_prefix, stat].compact.join('.')
      k << ":"
      k << [delta, type].join('|')
      k << '@%s' % sample_rate.to_s if sample_rate < 1

      sampled(sample_rate) { send_to_socket(k.strip) }
    end

    # If the statistic is sampled, generate a condition to check if it's good to send
    def sampled(sample_rate)
      yield unless sample_rate < 1 and rand > sample_rate
    end

    # Send data to the server via the socket
    def send_to_socket(message)
      begin
        Fozzie.logger.debug {"Statsd: #{message}"} if Fozzie.logger
        Timeout.timeout(Fozzie.c.timeout) {
          res = socket.send(message, 0, Fozzie.c.host, Fozzie.c.port)
          Fozzie.logger.debug {"Statsd sent: #{res}"} if Fozzie.logger
          (res.to_i == message.length)
        }
      rescue => exc
        Fozzie.logger.debug {"Statsd Failure: #{exc.message}\n#{exc.backtrace}"} if Fozzie.logger
        false
      end
    end

    # The Socket we want to use to send data
    def socket
      @socket ||= ::UDPSocket.new
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
fozzie-0.0.26 lib/fozzie/socket.rb