class GELF::Transport::TCP
Attributes
addresses[R]
Public Class Methods
new(addresses)
click to toggle source
`addresses` Array of [host, port] pairs
# File lib/gelf/transport/tcp.rb, line 7 def initialize(addresses) @sockets = [] self.addresses = addresses end
Public Instance Methods
addresses=(addresses)
click to toggle source
# File lib/gelf/transport/tcp.rb, line 12 def addresses=(addresses) @addresses = addresses.dup.freeze.tap do |addrs| @sockets.each(&:close) @sockets = addrs.map { |peer| connect(*peer) } end end
send(message)
click to toggle source
# File lib/gelf/transport/tcp.rb, line 19 def send(message) return if @addresses.empty? loop do connected = @sockets.reject(&:closed?) reconnect_all if connected.empty? break if write_any(connected, message) end end
Private Instance Methods
connect(host, port)
click to toggle source
# File lib/gelf/transport/tcp.rb, line 30 def connect(host, port) socket_class.new(host, port) end
reconnect_all()
click to toggle source
# File lib/gelf/transport/tcp.rb, line 34 def reconnect_all @sockets = @sockets.each_with_index.map do |old_socket, index| old_socket.closed? ? connect(*@addresses[index]) : old_socket end end
socket_class()
click to toggle source
# File lib/gelf/transport/tcp.rb, line 40 def socket_class if defined?(Celluloid::IO::TCPSocket) Celluloid::IO::TCPSocket else ::TCPSocket end end
unsafe_write_socket(socket, message)
click to toggle source
# File lib/gelf/transport/tcp.rb, line 62 def unsafe_write_socket(socket, message) r,w = IO.select([socket], [socket]) # Read everything first while r.any? do # don't expect any reads, but a readable socket might # mean the remote end closed, so read it and throw it away. # we'll get an EOFError if it happens. socket.sysread(16384) r = IO.select([socket]) end # Now send the payload return false unless w.any? return socket.syswrite(message) > 0 end
write_any(sockets, message)
click to toggle source
# File lib/gelf/transport/tcp.rb, line 48 def write_any(sockets, message) sockets.shuffle.each do |socket| return true if write_socket(socket, message) end false end
write_socket(socket, message)
click to toggle source
# File lib/gelf/transport/tcp.rb, line 55 def write_socket(socket, message) unsafe_write_socket(socket, message) rescue IOError, SystemCallError socket.close unless socket.closed? false end