elbping 0.0.11 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/elbping/cli.rb +4 -1
- data/lib/elbping/display.rb +13 -1
- data/lib/elbping/resolver.rb +5 -37
- data/lib/elbping/stats.rb +1 -16
- metadata +1 -1
data/lib/elbping/cli.rb
CHANGED
@@ -91,8 +91,9 @@ module ElbPing
|
|
91
91
|
nameserver = OPTIONS[:nameserver]
|
92
92
|
begin
|
93
93
|
nodes = ElbPing::Resolver.find_elb_nodes elb_uri.host, nameserver
|
94
|
-
rescue
|
94
|
+
rescue StandardError => e
|
95
95
|
ElbPing::Display.error "Unable to query DNS for #{elb_uri.host} using #{nameserver}"
|
96
|
+
ElbPing::Display.debug e
|
96
97
|
exit(false)
|
97
98
|
end
|
98
99
|
|
@@ -116,6 +117,8 @@ module ElbPing
|
|
116
117
|
##
|
117
118
|
# Ping each node while tracking requests, responses, and latencies
|
118
119
|
nodes.map { |node|
|
120
|
+
break if not run
|
121
|
+
|
119
122
|
status = ElbPing::HttpPinger.ping_node(node,
|
120
123
|
elb_uri.port,
|
121
124
|
(elb_uri.path == "") ? "/" : elb_uri.path,
|
data/lib/elbping/display.rb
CHANGED
@@ -21,6 +21,17 @@ module ElbPing
|
|
21
21
|
self.out "ERROR: #{msg}"
|
22
22
|
end
|
23
23
|
|
24
|
+
# Print debug information to the screen
|
25
|
+
#
|
26
|
+
# Arguments:
|
27
|
+
# * exception: (Exception object)
|
28
|
+
|
29
|
+
def self.debug(exception)
|
30
|
+
if ENV["DEBUG"]
|
31
|
+
self.out "DEBUG: #{exception.backtrace}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
24
35
|
# Format and display the ping data given a response
|
25
36
|
#
|
26
37
|
# Arguments:
|
@@ -46,7 +57,8 @@ module ElbPing
|
|
46
57
|
# * stats: (ElbPing::Stats)
|
47
58
|
|
48
59
|
def self.summary(stats)
|
49
|
-
stats.nodes.keys.
|
60
|
+
pinged_nodes = stats.nodes.keys.select { |n| stats.nodes[n][:requests] > 0 }
|
61
|
+
pinged_nodes.each { |node|
|
50
62
|
loss_pct = (stats.node_loss(node) * 100).to_i
|
51
63
|
self.out "--- #{node} statistics ---"
|
52
64
|
self.out "#{stats.nodes[node][:requests]} requests, #{stats.nodes[node][:responses]} responses, #{loss_pct}% loss"
|
data/lib/elbping/resolver.rb
CHANGED
@@ -1,40 +1,6 @@
|
|
1
1
|
|
2
2
|
require 'resolv'
|
3
|
-
|
4
|
-
# A TCP-only resolver built from `Resolv::DNS`. See the docs for what it's about.
|
5
|
-
# http://ruby-doc.org/stdlib-1.9.3/libdoc/resolv/rdoc/Resolv/DNS.html
|
6
|
-
class TcpDNS < Resolv::DNS
|
7
|
-
# Override fetch_resource to use a TCP requester instead of a UDP requester. This
|
8
|
-
# is mostly borrowed from `lib/resolv.rb` with the UDP->TCP fallback logic removed.
|
9
|
-
def fetch_resource(name, typeclass)
|
10
|
-
lazy_initialize
|
11
|
-
request = make_tcp_requester
|
12
|
-
sends = {}
|
13
|
-
begin
|
14
|
-
@config.resolv(name) { |candidate, tout, nameserver, port|
|
15
|
-
msg = Message.new
|
16
|
-
msg.rd = 1
|
17
|
-
msg.add_question(candidate, typeclass)
|
18
|
-
unless sender = senders[[candidate, nameserver, port]]
|
19
|
-
sender = senders[[candidate, nameserver, port]] =
|
20
|
-
requester.sender(msg, candidate, nameserver, port)
|
21
|
-
end
|
22
|
-
reply, reply_name = requester.request(sender, tout)
|
23
|
-
case reply.rcode
|
24
|
-
when RCode::NoError
|
25
|
-
yield(reply, reply_name)
|
26
|
-
return
|
27
|
-
when RCode::NXDomain
|
28
|
-
raise Config::NXDomain.new(reply_name.to_s)
|
29
|
-
else
|
30
|
-
raise Config::OtherResolvError.new(reply_name.to_s)
|
31
|
-
end
|
32
|
-
}
|
33
|
-
ensure
|
34
|
-
requester.close
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
3
|
+
require 'elbping/tcp_dns.rb'
|
38
4
|
|
39
5
|
module ElbPing
|
40
6
|
# Handles all DNS resolution and, more specifically, ELB node discovery
|
@@ -57,10 +23,12 @@ module ElbPing
|
|
57
23
|
Timeout::timeout(timeout) do
|
58
24
|
TcpDNS.open :nameserver => nameservers, :search => '', :ndots => 1 do |dns|
|
59
25
|
# TODO: Exceptions
|
60
|
-
resp = dns.getresources target, Resolv::DNS::Resource::IN::
|
26
|
+
resp = dns.getresources target, Resolv::DNS::Resource::IN::ANY
|
61
27
|
end
|
62
28
|
end
|
63
|
-
resp
|
29
|
+
if resp
|
30
|
+
resp.select { |r| r.respond_to? "address" and r.address }.map { |r| r.address.to_s }
|
31
|
+
end
|
64
32
|
end
|
65
33
|
end
|
66
34
|
end
|
data/lib/elbping/stats.rb
CHANGED
@@ -1,19 +1,5 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
|
4
|
-
# An array for doing some basic stats on latencies (currently only mean)
|
5
|
-
class LatencyBucket < Array
|
6
|
-
def sum
|
7
|
-
self.inject { |sum, el| sum + el} || 0
|
8
|
-
end
|
9
|
-
|
10
|
-
def mean
|
11
|
-
i = 0
|
12
|
-
unless self.size == 0
|
13
|
-
i = (self.sum.to_f / self.size).to_i
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
2
|
+
require 'elbping/latency_bucket.rb'
|
17
3
|
|
18
4
|
module ElbPing
|
19
5
|
# Tracks the statistics of requests sent, responses received (hence loss) and latency
|
@@ -102,4 +88,3 @@ module ElbPing
|
|
102
88
|
|
103
89
|
end
|
104
90
|
end
|
105
|
-
|