module StatsdServer::Proto::V1
Public Class Methods
parse(data, stats)
click to toggle source
# File lib/statsdserver/proto/v1.rb, line 6 def self.parse(data, stats) data.split("\n").each do |update| self.parse_update(update, stats) end end
parse_update(update, stats)
click to toggle source
# File lib/statsdserver/proto/v1.rb, line 12 def self.parse_update(update, stats) bits = update.split(":") # TODO: optimize into single regexp & compile? key = bits.shift.gsub(/\s+/, "_") \ .gsub(/\//, "-") \ .gsub(/[^a-zA-Z_\-0-9\.]/, "") bits << "1" if bits.length == 0 bits.each do |bit| fields = bit.split("|") if fields.length != 2 raise ParseError, "invalid update: #{bit}" end if fields[1] == "ms" or fields[1] == "t" # timer update if fields[0].index(",") fields[0].split(",").each do |value_str| value = Float(value_str) rescue nil stats.timers[key] << value if value end else value = Float(fields[0]) rescue nil if value.nil? raise ParseError, "invalid timer value for #{key}: #{fields[0]}" end stats.timers[key] << value end elsif fields[1] == "c" # counter update count_str, sample_rate_str = fields[0].split("@", 2) if sample_rate_str sample_rate = Float(sample_rate_str) rescue nil if sample_rate.nil? raise ParseError, "invalid sample_rate for #{key}: " + "#{sample_rate_str}" end else sample_rate = 1 end count = Integer(count_str) rescue nil if count.nil? raise ParseError, "invalid count for #{key}: #{count_str}" end stats.counters[key] += count.to_i * (1 / sample_rate.to_f) elsif fields[1] == "g" # gauge update value = Float(fields[0]) rescue nil if value.nil? raise ParseError, "invalid gauge value for #{key}: #{fields[0]}" end stats.gauges[key] = value else raise ParseError, "invalid update: #{update}: unknown type #{fields[1]}" end end end