Class: Arborist::Monitor::Socket::TCP
- Inherits:
-
Object
- Object
- Arborist::Monitor::Socket::TCP
- Extended by:
- Loggability
- Includes:
- ConnectionBatching
- Defined in:
- lib/arborist/monitor/socket.rb
Overview
Arborist TCP socket monitor logic
Constant Summary collapse
- USED_PROPERTIES =
Always request the node addresses and port.
[ :addresses, :port ].freeze
Constants included from ConnectionBatching
ConnectionBatching::DEFAULT_BATCH_SIZE, ConnectionBatching::DEFAULT_TIMEOUT
Class Method Summary collapse
-
.node_properties ⇒ Object
Return the properties used by this monitor.
-
.run(nodes) ⇒ Object
Instantiate a monitor check and run it for the specified
nodes.
Instance Method Summary collapse
-
#initialize(timeout: Arborist::Monitor::Socket.default_timeout, batch_size: Arborist::Monitor::Socket.batch_size) ⇒ TCP
constructor
Create a new TCP monitor with the specified
options. -
#make_connections_enum(nodes) ⇒ Object
Return an Enumerator that lazily yields Hashes of the form expected by the ConnectionBatching mixin for each of the specified
nodes. -
#status_for_conn(conn_hash, duration) ⇒ Object
Build a status for the specified
conn_hashafter its :conn has indicated it is ready.
Methods included from ConnectionBatching
#handle_connections, included, #run, #with_batch_size, #with_timeout
Constructor Details
#initialize(timeout: Arborist::Monitor::Socket.default_timeout, batch_size: Arborist::Monitor::Socket.batch_size) ⇒ TCP
Create a new TCP monitor with the specified options. Valid options are:
:timeout
Set the number of seconds to wait for a connection for each node.
:batch_size
The number of UDP connection attempts to perform simultaneously.
65 66 67 68 |
# File 'lib/arborist/monitor/socket.rb', line 65 def initialize( timeout: Arborist::Monitor::Socket.default_timeout, batch_size: Arborist::Monitor::Socket.batch_size ) self.timeout = timeout self.batch_size = batch_size end |
Class Method Details
.node_properties ⇒ Object
Return the properties used by this monitor.
54 55 56 |
# File 'lib/arborist/monitor/socket.rb', line 54 def self::node_properties return USED_PROPERTIES end |
.run(nodes) ⇒ Object
Instantiate a monitor check and run it for the specified nodes.
48 49 50 |
# File 'lib/arborist/monitor/socket.rb', line 48 def self::run( nodes ) return self.new.run( nodes ) end |
Instance Method Details
#make_connections_enum(nodes) ⇒ Object
Return an Enumerator that lazily yields Hashes of the form expected by the ConnectionBatching mixin for each of the specified nodes.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/arborist/monitor/socket.rb', line 77 def make_connections_enum( nodes ) return nodes.lazy.map do |identifier, node_data| self.log.debug "Creating a socket for %s" % [ identifier ] # :TODO: Should this try all the addresses? Should you be able to specify an # address for a Service? address = node_data['addresses'].first port = node_data['port'] sockaddr = nil self.log.debug "Creating TCP connection for %s:%d" % [ address, port ] sock = Socket.new( :INET, :STREAM ) conn = begin sockaddr = Socket.sockaddr_in( port, address ) sock.connect_nonblock( sockaddr ) sock rescue Errno::EINPROGRESS self.log.debug " connection started" sock rescue => err self.log.error " %p setting up connection: %s" % [ err.class, err. ] err end { conn: conn, identifier: identifier } end end |
#status_for_conn(conn_hash, duration) ⇒ Object
Build a status for the specified conn_hash after its :conn has indicated it is ready.
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/arborist/monitor/socket.rb', line 109 def status_for_conn( conn_hash, duration ) sock = conn_hash[:conn] # Why getpeername? Testing socket success without read()ing, I think? # FreeBSD source? sock.getpeername return { tcp_socket_connect: { duration: duration } } rescue SocketError, SystemCallError => err self.log.debug "Got %p while connecting to %s" % [ err.class, conn_hash[:identifier] ] begin sock.read( 1 ) rescue => err return { error: err. } end ensure sock.close if sock end |