Sha256: 6260ed1a71de23837459f28dcc9153f436de7b4bfc3faea12840892327b797e0

Contents?: true

Size: 1.29 KB

Versions: 10

Compression:

Stored size: 1.29 KB

Contents

# frozen_string_literal: true

# @note This class is part of the new Client implementation that is intended
#   to become the new default in the next major release of this library.
class StatsD::Instrument::UDPSink
  def self.for_addr(addr)
    host, port_as_string = addr.split(':', 2)
    new(host, Integer(port_as_string))
  end

  attr_reader :host, :port

  def initialize(host, port)
    @host = host
    @port = port
    @mutex = Mutex.new
    @socket = nil
  end

  def sample?(sample_rate)
    sample_rate == 1 || rand < sample_rate
  end

  def <<(datagram)
    with_socket { |socket| socket.send(datagram, 0) > 0 }
    self

  rescue ThreadError
    # 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 datagram without a lock.
    socket.send(datagram, 0) > 0

  rescue SocketError, IOError, SystemCallError
    # TODO: log?
    invalidate_socket
  end

  def addr
    "#{host}:#{port}"
  end

  private

  def with_socket
    @mutex.synchronize { yield(socket) }
  end

  def socket
    if @socket.nil?
      @socket = UDPSocket.new
      @socket.connect(@host, @port)
    end
    @socket
  end

  def invalidate_socket
    @mutex.synchronize do
      @socket = nil
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
statsd-instrument-3.0.0 lib/statsd/instrument/udp_sink.rb
statsd-instrument-3.0.0.pre2 lib/statsd/instrument/udp_sink.rb
statsd-instrument-2.9.2 lib/statsd/instrument/udp_sink.rb
statsd-instrument-3.0.0.pre1 lib/statsd/instrument/udp_sink.rb
statsd-instrument-2.9.1 lib/statsd/instrument/udp_sink.rb
statsd-instrument-2.9.0 lib/statsd/instrument/udp_sink.rb
statsd-instrument-2.8.0 lib/statsd/instrument/udp_sink.rb
statsd-instrument-2.7.1 lib/statsd/instrument/udp_sink.rb
statsd-instrument-2.7.0 lib/statsd/instrument/udp_sink.rb
statsd-instrument-2.6.0 lib/statsd/instrument/udp_sink.rb