Improve query time measurement accuracy and display
This commit is contained in:
parent
6a0b0c2ff5
commit
87cea8c04c
@ -136,10 +136,10 @@ def dnsping(host, server, dnsrecord, timeout, count, use_tcp=False, use_edns=Fal
|
|||||||
if shutdown: # user pressed CTRL+C
|
if shutdown: # user pressed CTRL+C
|
||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
stime = time.time()
|
stime = time.perf_counter()
|
||||||
answers = resolver.query(host, dnsrecord, tcp=use_tcp,
|
answers = resolver.query(host, dnsrecord, tcp=use_tcp,
|
||||||
raise_on_no_answer=False) # todo: response validation in future
|
raise_on_no_answer=False) # todo: response validation in future
|
||||||
etime = time.time()
|
etime = time.perf_counter()
|
||||||
except (dns.resolver.NoNameservers, dns.resolver.NoAnswer):
|
except (dns.resolver.NoNameservers, dns.resolver.NoAnswer):
|
||||||
break
|
break
|
||||||
except dns.resolver.Timeout:
|
except dns.resolver.Timeout:
|
||||||
|
10
dnsping.py
10
dnsping.py
@ -178,10 +178,10 @@ def main():
|
|||||||
if shutdown:
|
if shutdown:
|
||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
stime = time.time()
|
stime = time.perf_counter()
|
||||||
answers = resolver.query(hostname, dnsrecord, source_port=src_port, source=src_ip, tcp=use_tcp,
|
answers = resolver.query(hostname, dnsrecord, source_port=src_port, source=src_ip, tcp=use_tcp,
|
||||||
raise_on_no_answer=False)
|
raise_on_no_answer=False)
|
||||||
etime = time.time()
|
etime = time.perf_counter()
|
||||||
except dns.resolver.NoNameservers as e:
|
except dns.resolver.NoNameservers as e:
|
||||||
if not quiet:
|
if not quiet:
|
||||||
print("No response to dns request")
|
print("No response to dns request")
|
||||||
@ -207,7 +207,7 @@ def main():
|
|||||||
response_time.append(elapsed)
|
response_time.append(elapsed)
|
||||||
if not quiet:
|
if not quiet:
|
||||||
print(
|
print(
|
||||||
"%d bytes from %s: seq=%-3d time=%3.3f ms" % (
|
"%d bytes from %s: seq=%-3d time=%.3f ms" % (
|
||||||
len(str(answers.rrset)), dnsserver, i, elapsed))
|
len(str(answers.rrset)), dnsserver, i, elapsed))
|
||||||
if verbose:
|
if verbose:
|
||||||
print(answers.rrset)
|
print(answers.rrset)
|
||||||
@ -236,8 +236,8 @@ def main():
|
|||||||
r_stddev = 0
|
r_stddev = 0
|
||||||
|
|
||||||
print('\n--- %s dnsping statistics ---' % dnsserver)
|
print('\n--- %s dnsping statistics ---' % dnsserver)
|
||||||
print('%d requests transmitted, %d responses received, %3.0f%% lost' % (r_sent, r_received, r_lost_percent))
|
print('%d requests transmitted, %d responses received, %.0f%% lost' % (r_sent, r_received, r_lost_percent))
|
||||||
print('min=%3.3f ms, avg=%3.3f ms, max=%3.3f ms, stddev=%3.3f ms' % (r_min, r_avg, r_max, r_stddev))
|
print('min=%.3f ms, avg=%.3f ms, max=%.3f ms, stddev=%.3f ms' % (r_min, r_avg, r_max, r_stddev))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -91,7 +91,7 @@ shutdown = False
|
|||||||
|
|
||||||
def whoisrecord(ip):
|
def whoisrecord(ip):
|
||||||
try:
|
try:
|
||||||
currenttime = time.time()
|
currenttime = time.perf_counter()
|
||||||
ts = currenttime
|
ts = currenttime
|
||||||
if ip in whois:
|
if ip in whois:
|
||||||
asn, ts = whois[ip]
|
asn, ts = whois[ip]
|
||||||
@ -328,26 +328,26 @@ def main():
|
|||||||
curr_host = None
|
curr_host = None
|
||||||
|
|
||||||
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool: # dispatch dns lookup to another thread
|
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool: # dispatch dns lookup to another thread
|
||||||
stime = time.time()
|
stime = time.perf_counter()
|
||||||
thr = pool.submit(ping, resolver, hostname, dnsrecord, ttl, use_edns=use_edns)
|
thr = pool.submit(ping, resolver, hostname, dnsrecord, ttl, use_edns=use_edns)
|
||||||
|
|
||||||
try: # expect ICMP response
|
try: # expect ICMP response
|
||||||
_, curr_addr = icmp_socket.recvfrom(512)
|
_, curr_addr = icmp_socket.recvfrom(512)
|
||||||
curr_addr = curr_addr[0]
|
curr_addr = curr_addr[0]
|
||||||
except socket.error:
|
except socket.error:
|
||||||
etime = time.time()
|
etime = time.perf_counter()
|
||||||
pass
|
pass
|
||||||
finally:
|
finally:
|
||||||
etime = time.time()
|
etime = time.perf_counter()
|
||||||
icmp_socket.close()
|
icmp_socket.close()
|
||||||
|
|
||||||
reached = thr.result()
|
reached = thr.result()
|
||||||
|
|
||||||
if reached:
|
if reached:
|
||||||
curr_addr = dnsserver
|
curr_addr = dnsserver
|
||||||
stime = time.time() # need to recalculate elapsed time for last hop without waiting for an icmp error reply
|
stime = time.perf_counter() # need to recalculate elapsed time for last hop without waiting for an icmp error reply
|
||||||
ping(resolver, hostname, dnsrecord, ttl, use_edns=use_edns)
|
ping(resolver, hostname, dnsrecord, ttl, use_edns=use_edns)
|
||||||
etime = time.time()
|
etime = time.perf_counter()
|
||||||
|
|
||||||
elapsed = abs(etime - stime) * 1000 # convert to milliseconds
|
elapsed = abs(etime - stime) * 1000 # convert to milliseconds
|
||||||
|
|
||||||
@ -387,7 +387,7 @@ def main():
|
|||||||
if curr_addr == dnsserver:
|
if curr_addr == dnsserver:
|
||||||
c = color.G
|
c = color.G
|
||||||
|
|
||||||
print("%d\t%s (%s%s%s) %s%d ms" % (ttl, curr_name, c, curr_addr, color.N, as_name, elapsed), flush=True)
|
print("%d\t%s (%s%s%s) %s%.3f ms" % (ttl, curr_name, c, curr_addr, color.N, as_name, elapsed), flush=True)
|
||||||
trace_path.append(curr_addr)
|
trace_path.append(curr_addr)
|
||||||
else:
|
else:
|
||||||
print("%d\t *" % ttl, flush=True)
|
print("%d\t *" % ttl, flush=True)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user