class StatsD::Instrument::Backends::UDPBackend

Constants

DEFAULT_IMPLEMENTATION

Attributes

host[R]
implementation[RW]
port[R]

Public Class Methods

new(server = nil, implementation = nil) click to toggle source
Calls superclass method
# File lib/statsd/instrument/backends/udp_backend.rb, line 13
def initialize(server = nil, implementation = nil)
  super()
  self.server = server || "localhost:8125"
  self.implementation = (implementation || DEFAULT_IMPLEMENTATION).to_sym
end

Public Instance Methods

collect_metric(metric) click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 19
def collect_metric(metric)
  unless implementation_supports_metric_type?(metric.type)
    StatsD.logger.warn("[StatsD] Metric type #{metric.type.inspect} not supported on #{implementation} implementation.")
    return false
  end

  if metric.sample_rate < 1.0 && rand > metric.sample_rate
    return false
  end

  write_packet(generate_packet(metric))
end
generate_packet(metric) click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 64
def generate_packet(metric)
  command = "#{metric.name}:#{metric.value}|#{metric.type}"
  command << "|@#{metric.sample_rate}" if metric.sample_rate < 1 || (implementation == :statsite && metric.sample_rate > 1)
  if metric.tags
    if tags_supported?
      command << "|##{metric.tags.join(',')}"
    else
      StatsD.logger.warn("[StatsD] Tags are only supported on Datadog implementation.")
    end
  end

  command << "\n" if implementation == :statsite
  command
end
host=(host) click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 46
def host=(host)
  @host = host
  invalidate_socket
end
implementation_supports_metric_type?(type) click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 32
def implementation_supports_metric_type?(type)
  case type
    when :h;  implementation == :datadog
    when :kv; implementation == :statsite
    else true
  end
end
invalidate_socket() click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 96
def invalidate_socket
  @socket = nil
end
port=(port) click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 51
def port=(port)
  @port = port
  invalidate_socket
end
server=(connection_string) click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 40
def server=(connection_string)
  self.host, port = connection_string.split(':', 2)
  self.port = port.to_i
  invalidate_socket
end
socket() click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 56
def socket
  if @socket.nil?
    @socket = UDPSocket.new
    @socket.connect(host, port)
  end
  @socket
end
tags_supported?() click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 79
def tags_supported?
  implementation == :datadog
end
write_packet(command) click to toggle source
# File lib/statsd/instrument/backends/udp_backend.rb, line 83
def write_packet(command)
  synchronize do
    socket.send(command, 0) > 0
  end
rescue ThreadError => e
  # In cases where a TERM or KILL signal has been sent, and we send stats as
  # part of a signal handler, locks cannot be acquired, so we do our best
  # to try and send the command without a lock.
  socket.send(command, 0) > 0
rescue SocketError, IOError, SystemCallError, Errno::ECONNREFUSED => e
  StatsD.logger.error "[StatsD] #{e.class.name}: #{e.message}"
end