Improve query time measurement accuracy and display

This commit is contained in:
Babak Farrokhi 2017-04-23 13:23:17 +04:30
parent 6a0b0c2ff5
commit 87cea8c04c
Signed by: farrokhi
GPG Key ID: 6B267AD85D632E9A
3 changed files with 14 additions and 14 deletions

View File

@ -136,10 +136,10 @@ def dnsping(host, server, dnsrecord, timeout, count, use_tcp=False, use_edns=Fal
if shutdown: # user pressed CTRL+C
break
try:
stime = time.time()
stime = time.perf_counter()
answers = resolver.query(host, dnsrecord, tcp=use_tcp,
raise_on_no_answer=False) # todo: response validation in future
etime = time.time()
etime = time.perf_counter()
except (dns.resolver.NoNameservers, dns.resolver.NoAnswer):
break
except dns.resolver.Timeout:

View File

@ -178,10 +178,10 @@ def main():
if shutdown:
break
try:
stime = time.time()
stime = time.perf_counter()
answers = resolver.query(hostname, dnsrecord, source_port=src_port, source=src_ip, tcp=use_tcp,
raise_on_no_answer=False)
etime = time.time()
etime = time.perf_counter()
except dns.resolver.NoNameservers as e:
if not quiet:
print("No response to dns request")
@ -207,7 +207,7 @@ def main():
response_time.append(elapsed)
if not quiet:
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))
if verbose:
print(answers.rrset)
@ -236,8 +236,8 @@ def main():
r_stddev = 0
print('\n--- %s dnsping statistics ---' % dnsserver)
print('%d requests transmitted, %d responses received, %3.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('%d requests transmitted, %d responses received, %.0f%% lost' % (r_sent, r_received, r_lost_percent))
print('min=%.3f ms, avg=%.3f ms, max=%.3f ms, stddev=%.3f ms' % (r_min, r_avg, r_max, r_stddev))
if __name__ == '__main__':

View File

@ -91,7 +91,7 @@ shutdown = False
def whoisrecord(ip):
try:
currenttime = time.time()
currenttime = time.perf_counter()
ts = currenttime
if ip in whois:
asn, ts = whois[ip]
@ -328,26 +328,26 @@ def main():
curr_host = None
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)
try: # expect ICMP response
_, curr_addr = icmp_socket.recvfrom(512)
curr_addr = curr_addr[0]
except socket.error:
etime = time.time()
etime = time.perf_counter()
pass
finally:
etime = time.time()
etime = time.perf_counter()
icmp_socket.close()
reached = thr.result()
if reached:
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)
etime = time.time()
etime = time.perf_counter()
elapsed = abs(etime - stime) * 1000 # convert to milliseconds
@ -387,7 +387,7 @@ def main():
if curr_addr == dnsserver:
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)
else:
print("%d\t *" % ttl, flush=True)