Skip to content

Commit 8cb0401

Browse files
authored
Merge pull request #22 from taketo1113/add-query-response-time
Add query response time (a_response_time/aaaa_response_time)
2 parents f6dc910 + b2c1ec1 commit 8cb0401

7 files changed

Lines changed: 136 additions & 5 deletions

File tree

README.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ If bundler is not being used to manage dependencies, install the gem by executin
3434
ddig = Ddig.lookup('dns.google', nameservers: ['8.8.8.8', '2001:4860:4860::8888'])
3535

3636
ddig[:do53][:ipv4]
37-
=> #<Ddig::Resolver::Do53:0x00000001207aaeb0 @a=["8.8.4.4", "8.8.8.8"], @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @hostname="dns.google", @ip=:ipv4, @nameservers=["8.8.8.8"]>
37+
=> #<Ddig::Resolver::Do53:0x00000001207aaeb0 @a=["8.8.4.4", "8.8.8.8"], @a_response_time=18, @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @aaaa_response_time=16, @hostname="dns.google", @ip=:ipv4, @nameservers=["8.8.8.8"]>
3838
ddig[:do53][:ipv6]
39-
=> #<Ddig::Resolver::Do53:0x000000012073d2c0 @a=["8.8.4.4", "8.8.8.8"], @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @hostname="dns.google", @ip=:ipv4, @nameservers=["2001:4860:4860::8888"]>
39+
=> #<Ddig::Resolver::Do53:0x000000012073d2c0 @a=["8.8.4.4", "8.8.8.8"], @a_response_time=18, @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @aaaa_response_time=16, @hostname="dns.google", @ip=:ipv4, @nameservers=["2001:4860:4860::8888"]>
4040

4141
ddig[:ddr]
4242
=> [#<Ddig::Ddr::DesignatedResolver:0x0000000120735480
@@ -90,7 +90,7 @@ ddig[:ddr]
9090
- Do53
9191
```ruby
9292
do53 = Ddig::Resolver::Do53.new(hostname: 'dns.google', nameservers: '8.8.8.8').lookup
93-
=> #<Ddig::Resolver::Do53:0x0000000121717b78 @a=["8.8.8.8", "8.8.4.4"], @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @hostname="dns.google", @ip=nil, @nameserver=#<Ddig::Nameserver:0x00000001211fb108 @nameservers="8.8.8.8", @servers=["8.8.8.8"]>, @nameservers=["8.8.8.8"]>
93+
=> #<Ddig::Resolver::Do53:0x0000000121717b78 @a=["8.8.8.8", "8.8.4.4"], @a_response_time=18, @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @aaaa_response_time=16, @hostname="dns.google", @ip=nil, @nameserver=#<Ddig::Nameserver:0x00000001211fb108 @nameservers="8.8.8.8", @servers=["8.8.8.8"]>, @nameservers=["8.8.8.8"]>
9494

9595
do53.a
9696
=> ["8.8.4.4", "8.8.8.8"]
@@ -101,7 +101,7 @@ do53.aaaa
101101
- DoT
102102
```ruby
103103
dot = Ddig::Resolver::Dot.new(hostname: 'dns.google', server: '8.8.8.8').lookup
104-
=> #<Ddig::Resolver::Dot:0x000000012145da90 @a=["8.8.8.8", "8.8.4.4"], @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @hostname="dns.google", @open_timeout=3, @port=853, @server="8.8.8.8", @server_name=nil>
104+
=> #<Ddig::Resolver::Dot:0x000000012145da90 @a=["8.8.8.8", "8.8.4.4"], @a_response_time=108, @aaaa=["2001:4860:4860::8844", "2001:4860:4860::8888"], @aaaa_response_time=122, @hostname="dns.google", @open_timeout=3, @port=853, @server="8.8.8.8", @server_name=nil>
105105

106106
dot.a
107107
=> ["8.8.4.4", "8.8.8.8"]
@@ -112,7 +112,7 @@ dot.aaaa
112112
- DoH (HTTP/1.1)
113113
```ruby
114114
doh = Ddig::Resolver::DohH1.new(hostname: 'dns.google', server: 'dns.google', dohpath: '/dns-query{?dns}').lookup
115-
=> #<Ddig::Resolver::DohH1:0x00000001023ed020 @a=["8.8.4.4", "8.8.8.8"], @aaaa=["2001:4860:4860::8888", "2001:4860:4860::8844"], @address=nil, @dohpath="/dns-query{?dns}", @hostname="dns.google", @open_timeout=10, @port=443, @server="dns.google">
115+
=> #<Ddig::Resolver::DohH1:0x00000001023ed020 @a=["8.8.4.4", "8.8.8.8"], @a_response_time=62, @aaaa=["2001:4860:4860::8888", "2001:4860:4860::8844"], @aaaa_response_time=77, @address=nil, @dohpath="/dns-query{?dns}", @hostname="dns.google", @open_timeout=10, @port=443, @server="dns.google">
116116

117117
doh.a
118118
=> ["8.8.4.4", "8.8.8.8"]
@@ -151,6 +151,8 @@ dns.google A 8.8.8.8
151151
dns.google AAAA 2001:4860:4860::8844
152152
dns.google AAAA 2001:4860:4860::8888
153153

154+
# Query time (A): 15 msec
155+
# Query time (AAAA): 15 msec
154156
# SERVER: 8.8.8.8
155157

156158
# DDR
@@ -160,6 +162,8 @@ dns.google A 8.8.8.8
160162
dns.google AAAA 2001:4860:4860::8844
161163
dns.google AAAA 2001:4860:4860::8888
162164

165+
# Query time (A): 114 msec
166+
# Query time (AAAA): 187 msec
163167
# SERVER(Address): 8.8.4.4
164168
# PORT: 853
165169

@@ -174,6 +178,8 @@ dns.google A 8.8.4.4
174178
dns.google AAAA 2001:4860:4860::8844
175179
dns.google AAAA 2001:4860:4860::8888
176180

181+
# Query time (A): 89 msec
182+
# Query time (AAAA): 105 msec
177183
# SERVER(Hostname): 2001:4860:4860::8888
178184
# SERVER(Path): /dns-query{?dns}
179185
# PORT: 443
@@ -188,6 +194,8 @@ dns.google A 8.8.4.4
188194
dns.google AAAA 2001:4860:4860::8844
189195
dns.google AAAA 2001:4860:4860::8888
190196

197+
# Query time (A): 20 msec
198+
# Query time (AAAA): 16 msec
191199
# SERVER: 8.8.8.8
192200
```
193201

@@ -199,6 +207,8 @@ dns.google A 8.8.4.4
199207
dns.google AAAA 2001:4860:4860::8888
200208
dns.google AAAA 2001:4860:4860::8844
201209

210+
# Query time (A): 90 msec
211+
# Query time (AAAA): 167 msec
202212
# SERVER(Address): 8.8.8.8
203213
# PORT: 853
204214
```
@@ -211,6 +221,8 @@ dns.google A 8.8.4.4
211221
dns.google AAAA 2001:4860:4860::8888
212222
dns.google AAAA 2001:4860:4860::8844
213223

224+
# Query time (A): 69 msec
225+
# Query time (AAAA): 70 msec
214226
# SERVER(Hostname): dns.google
215227
# SERVER(Path): /dns-query{?dns}
216228
# PORT: 443

lib/ddig/resolver/do53.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module Resolver
77
class Do53
88
attr_reader :hostname, :nameservers, :ip
99
attr_reader :a, :aaaa
10+
attr_reader :a_response_time, :aaaa_response_time
1011

1112
def initialize(hostname:, nameservers: nil, ip: nil)
1213
@hostname = hostname
@@ -21,15 +22,19 @@ def lookup
2122
return nil
2223
end
2324

25+
a_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
2426
@a = Resolv::DNS.open(nameserver: @nameservers) do |dns|
2527
ress = dns.getresources(@hostname, Resolv::DNS::Resource::IN::A)
2628
ress.map { |resource| resource.address.to_s }
2729
end
30+
@a_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - a_start) * 1000).round
2831

32+
aaaa_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
2933
@aaaa = Resolv::DNS.open(nameserver: @nameservers) do |dns|
3034
ress = dns.getresources(@hostname, Resolv::DNS::Resource::IN::AAAA)
3135
ress.map { |resource| resource.address.to_s }
3236
end
37+
@aaaa_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - aaaa_start) * 1000).round
3338

3439
self
3540
end
@@ -41,6 +46,8 @@ def as_json(*)
4146
hostname: @hostname,
4247
nameservers: @nameservers,
4348
ip: @ip,
49+
a_response_time: @a_response_time,
50+
aaaa_response_time: @aaaa_response_time,
4451
}
4552
end
4653

@@ -59,6 +66,12 @@ def to_cli
5966
end
6067

6168
puts
69+
unless @a_response_time.nil?
70+
puts "# Query time (A): #{@a_response_time} msec"
71+
end
72+
unless @aaaa_response_time.nil?
73+
puts "# Query time (AAAA): #{@aaaa_response_time} msec"
74+
end
6275
puts "# SERVER: #{@nameservers.join(', ')}"
6376
end
6477

lib/ddig/resolver/doh_h1.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ module Resolver
1111
class DohH1
1212
attr_reader :hostname, :server, :address, :dohpath, :port
1313
attr_reader :a, :aaaa
14+
attr_reader :a_response_time, :aaaa_response_time
1415

1516
def initialize(hostname:, server:, address: nil, dohpath: '/dns-query{?dns}', port: 443)
1617
@hostname = hostname
@@ -27,9 +28,13 @@ def lookup
2728
return nil
2829
end
2930

31+
a_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
3032
@a = get_resources(@hostname, Resolv::DNS::Resource::IN::A).map { |resource| resource.address.to_s if resource.is_a?(Resolv::DNS::Resource::IN::A) }.compact
33+
@a_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - a_start) * 1000).round
3134

35+
aaaa_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
3236
@aaaa = get_resources(@hostname, Resolv::DNS::Resource::IN::AAAA).map { |resource| resource.address.to_s if resource.is_a?(Resolv::DNS::Resource::IN::AAAA) }.compact
37+
@aaaa_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - aaaa_start) * 1000).round
3338

3439
self
3540
end
@@ -67,6 +72,8 @@ def as_json(*)
6772
address: @address,
6873
dohpath: @dohpath,
6974
port: @port,
75+
a_response_time: @a_response_time,
76+
aaaa_response_time: @aaaa_response_time,
7077
}
7178
end
7279

@@ -85,6 +92,12 @@ def to_cli
8592
end
8693

8794
puts
95+
unless @a_response_time.nil?
96+
puts "# Query time (A): #{@a_response_time} msec"
97+
end
98+
unless @aaaa_response_time.nil?
99+
puts "# Query time (AAAA): #{@aaaa_response_time} msec"
100+
end
88101
puts "# SERVER(Hostname): #{@server}"
89102
puts "# SERVER(Path): #{@dohpath}"
90103
puts "# PORT: #{@port}"

lib/ddig/resolver/dot.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module Resolver
1010
class Dot
1111
attr_reader :hostname, :server, :server_name, :port
1212
attr_reader :a, :aaaa
13+
attr_reader :a_response_time, :aaaa_response_time
1314

1415
def initialize(hostname:, server:, server_name: nil, port: 853)
1516
@hostname = hostname
@@ -25,9 +26,13 @@ def lookup
2526
return nil
2627
end
2728

29+
a_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
2830
@a = get_resources(@hostname, Resolv::DNS::Resource::IN::A).map { |resource| resource.address.to_s if resource.is_a?(Resolv::DNS::Resource::IN::A) }.compact
31+
@a_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - a_start) * 1000).round
2932

33+
aaaa_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
3034
@aaaa = get_resources(@hostname, Resolv::DNS::Resource::IN::AAAA).map { |resource| resource.address.to_s if resource.is_a?(Resolv::DNS::Resource::IN::AAAA) }.compact
35+
@aaaa_response_time = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - aaaa_start) * 1000).round
3136

3237
self
3338
end
@@ -84,6 +89,8 @@ def as_json(*)
8489
server: @server,
8590
server_name: @server_name,
8691
port: @port,
92+
a_response_time: @a_response_time,
93+
aaaa_response_time: @aaaa_response_time,
8794
}
8895
end
8996

@@ -102,6 +109,12 @@ def to_cli
102109
end
103110

104111
puts
112+
unless @a_response_time.nil?
113+
puts "# Query time (A): #{@a_response_time} msec"
114+
end
115+
unless @aaaa_response_time.nil?
116+
puts "# Query time (AAAA): #{@aaaa_response_time} msec"
117+
end
105118
puts "# SERVER(Address): #{@server}"
106119
#puts "# SERVER(Hostname): #{@server_name}"
107120
puts "# PORT: #{@port}"

spec/ddig/resolver/do53_spec.rb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
expect(@do53.aaaa).to include "2001:4860:4860::8888"
1818
end
1919

20+
it "a_response_time / aaaa_response_time return value" do
21+
expect(@do53.a_response_time).not_to be_nil
22+
expect(@do53.aaaa_response_time).not_to be_nil
23+
end
24+
2025
it "hostname set value" do
2126
expect(@do53.hostname).to eq 'dns.google'
2227
end
@@ -48,6 +53,11 @@
4853
expect(@do53.aaaa).to include "2001:4860:4860::8888"
4954
end
5055

56+
it "a_response_time / aaaa_response_time return value" do
57+
expect(@do53.a_response_time).not_to be_nil
58+
expect(@do53.aaaa_response_time).not_to be_nil
59+
end
60+
5161
it "hostname set value" do
5262
expect(@do53.hostname).to eq 'dns.google'
5363
end
@@ -93,6 +103,11 @@
93103
expect(@do53.aaaa).to include "2001:4860:4860::8888"
94104
end
95105

106+
it "a_response_time / aaaa_response_time return value" do
107+
expect(@do53.a_response_time).not_to be_nil
108+
expect(@do53.aaaa_response_time).not_to be_nil
109+
end
110+
96111
it "hostname set value" do
97112
expect(@do53.hostname).to eq 'dns.google'
98113
end
@@ -127,6 +142,11 @@
127142
expect(@do53.aaaa).to include "2001:4860:4860::8888"
128143
end
129144

145+
it "a_response_time / aaaa_response_time return value" do
146+
expect(@do53.a_response_time).not_to be_nil
147+
expect(@do53.aaaa_response_time).not_to be_nil
148+
end
149+
130150
it "hostname set value" do
131151
expect(@do53.hostname).to eq 'dns.google'
132152
end
@@ -156,6 +176,11 @@
156176
expect(@do53.as_json[:aaaa]).to include "2001:4860:4860::8888"
157177
end
158178

179+
it "a_response_time / aaaa_response_time return value" do
180+
expect(@do53.as_json[:a_response_time]).not_to be_nil
181+
expect(@do53.as_json[:aaaa_response_time]).not_to be_nil
182+
end
183+
159184
it "hostname set value" do
160185
expect(@do53.as_json[:hostname]).to eq 'dns.google'
161186
end
@@ -205,5 +230,10 @@
205230
expect { @do53.to_cli }.to output(/2001:4860:4860::8888/).to_stdout
206231
expect { @do53.to_cli }.to output(/2001:4860:4860::8844/).to_stdout
207232
end
233+
234+
it "a_response_time / aaaa_response_time return value" do
235+
expect { @do53.to_cli }.to output(/Query time \(A\)/).to_stdout
236+
expect { @do53.to_cli }.to output(/Query time \(AAAA\)/).to_stdout
237+
end
208238
end
209239
end

spec/ddig/resolver/doh_h1_spec.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
expect(@doh.aaaa).to include "2001:4860:4860::8844"
1717
expect(@doh.aaaa).to include "2001:4860:4860::8888"
1818
end
19+
20+
it "a_response_time / aaaa_response_time return value" do
21+
expect(@doh.a_response_time).not_to be_nil
22+
expect(@doh.aaaa_response_time).not_to be_nil
23+
end
1924
end
2025

2126
context "#lookup: with server (ipv4) / address" do
@@ -33,6 +38,11 @@
3338
expect(@doh.aaaa).to include "2001:4860:4860::8844"
3439
expect(@doh.aaaa).to include "2001:4860:4860::8888"
3540
end
41+
42+
it "a_response_time / aaaa_response_time return value" do
43+
expect(@doh.a_response_time).not_to be_nil
44+
expect(@doh.aaaa_response_time).not_to be_nil
45+
end
3646
end
3747

3848
context "#lookup: with server (ipv6) / address" do
@@ -52,6 +62,11 @@
5262
expect(@doh.aaaa).to include "2001:4860:4860::8844"
5363
expect(@doh.aaaa).to include "2001:4860:4860::8888"
5464
end
65+
66+
it "a_response_time / aaaa_response_time return value" do
67+
expect(@doh.a_response_time).not_to be_nil
68+
expect(@doh.aaaa_response_time).not_to be_nil
69+
end
5570
end
5671

5772
context "#lookup: with invalid address" do
@@ -104,6 +119,11 @@
104119
expect(@doh.as_json[:aaaa]).to include "2001:4860:4860::8888"
105120
end
106121

122+
it "a_response_time / aaaa_response_time return value" do
123+
expect(@doh.as_json[:a_response_time]).not_to be_nil
124+
expect(@doh.as_json[:aaaa_response_time]).not_to be_nil
125+
end
126+
107127
it "hostname set value" do
108128
expect(@doh.as_json[:hostname]).to eq 'dns.google'
109129
end
@@ -170,6 +190,11 @@
170190
expect { @doh.to_cli }.to output(/2001:4860:4860::8844/).to_stdout
171191
end
172192

193+
it "a_response_time / aaaa_response_time return value" do
194+
expect { @doh.to_cli }.to output(/Query time \(A\)/).to_stdout
195+
expect { @doh.to_cli }.to output(/Query time \(AAAA\)/).to_stdout
196+
end
197+
173198
it "hostname return values" do
174199
expect { @doh.to_cli }.to output(/dns.google/).to_stdout
175200
end

0 commit comments

Comments
 (0)