class Datadog::Statsd::Connection

Attributes

logger[R]
telemetry[R]

Public Class Methods

new(telemetry: nil, logger: nil) click to toggle source
# File lib/datadog/statsd/connection.rb, line 6
def initialize(telemetry: nil, logger: nil)
  @telemetry = telemetry
  @logger = logger
end

Public Instance Methods

reset_telemetry() click to toggle source
# File lib/datadog/statsd/connection.rb, line 11
def reset_telemetry
  telemetry.reset if telemetry
end
write(payload) click to toggle source

not thread safe: ‘Sender` instances that use this are required to properly synchronize or sequence calls to this method

# File lib/datadog/statsd/connection.rb, line 16
def write(payload)
  logger.debug { "Statsd: #{payload}" } if logger

  send_message(payload)

  telemetry.sent(packets: 1, bytes: payload.length) if telemetry

  true
rescue StandardError => boom
  # Try once to reconnect if the socket has been closed
  retries ||= 1
  if retries <= 1 &&
    (boom.is_a?(Errno::ENOTCONN) or
     boom.is_a?(Errno::ECONNREFUSED) or
     boom.is_a?(IOError) && boom.message =~ /closed stream/i)
    retries += 1
    begin
      close
      connect
      retry
    rescue StandardError => e
      boom = e
    end
  end

  telemetry.dropped_writer(packets: 1, bytes: payload.length) if telemetry
  logger.error { "Statsd: #{boom.class} #{boom}" } if logger
  nil
end

Private Instance Methods

close() click to toggle source
# File lib/datadog/statsd/connection.rb, line 55
def close
  raise 'Should be implemented by subclass'
end
connect() click to toggle source
# File lib/datadog/statsd/connection.rb, line 51
def connect
  raise 'Should be implemented by subclass'
end