plog95/plog95.py
Matthieu Herrb 32a1cd3cbc Simplify intervals skips and fix throughput computation per second
Don't use Excel dates, do all the tests in python datetime class
Aslo, we need to divide by the actual duration of the interval to
get a viable throughput per second for when some data are missing
2023-02-18 20:20:23 +01:00

103 lines
2.8 KiB
Python
Executable file

#! /usr/bin/env python3
# Laurent GUERBY 20150728
# parse log-netdev-20120629.txt compute 95th centile 5mn
# python plog95.py b 0 eth0.2301 log-netdev-201506*.txt
import datetime
import sys
import re
import gzip
import lzma
def to_date(s):
dt=datetime.datetime.strptime(s,"%a %b %d %H:%M:%S %Z %Y")
return dt
b_or_p=sys.argv[1] # "b" or "p"
txrx=int(sys.argv[2]) # 0 for RX 1 for TX
iface95_l = sys.argv[3].split(':')
#=== Thu Jun 28 22:00:08 UTC 2012 ===
#Inter-| Receive | Transmit
# face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
# lo:2746879057 24561707 0 0 0 0 0 0 2746879057 24561707 0 0 0 0 0 0
# d[time][inter][byte/packet][rx/tx]
d={}
t_l=[]
for fname in sys.argv[4:]:
f=None
if fname.endswith(".xz"):
f=lzma.open(fname, 'rt', encoding='utf-8')
elif fname.endswith(".gz"):
f=gzip.open(fname, 'rt', encoding='utf-8')
else:
f=open(fname, 'r', encoding='utf-8')
line_i=0
for l in f:
line_i+=1
# l = l.decode('ascii');
if l.startswith("=== ") and l.endswith(" ===\n"):
t_s=to_date(l[4:-5])
d[t_s]={}
t_l.append(t_s)
elif l.startswith("Inter"):
pass
elif l.startswith(" face"):
pass
else:
try:
header,data=l[:-1].split(":")
except:
print(l)
print(fname)
print(line_i)
#raise
iface=header.strip(" ")
if not iface in iface95_l: continue
bytes=[int(x) for x in re.findall(r'\w+', data)]
d[t_s][iface]={"b":[bytes[0],bytes[8]],"p":[bytes[1],bytes[9]]}
#print(len(t_l))
iface_d={}
for t in t_l:
for i in d[t].keys():
iface_d[i]=None
iface_l=iface_d.keys()
prev={}
t0=t_l[0]
for i in iface_l:
prev[i]=d[t0][i][b_or_p][txrx]
tn0=t_l[0]
mb_l=[]
for t in t_l:
# print(t, " ", tn0, " ", tn0 + datetime.timedelta(minutes=5))
if (t < tn0 + datetime.timedelta(minutes=5)): continue
delta = (t - tn0).seconds
# if (delta > 450): print("xxxx ", tn0, " ", t, " ", delta)
tn0=t
tot_mbit_s = 0.0;
for i in iface_l:
y=0
x=None
if i in d[t]:
x=d[t][i][b_or_p][txrx]
if prev[i]!=None and x!=None:
y=x-prev[i]
if y<0.0: y=0
mbit_s=float(y)*8.0/(delta*1e6)
# if mbit_s>600.0: print(i, " ", t, " ", mbit_s)
if mbit_s>10000.0: mbit_s=0.0
tot_mbit_s += mbit_s;
prev[i]=x
mb_l.append(tot_mbit_s)
mb_l.sort()
mb_n=len(mb_l)
print("nb",mb_n,"avg",sum(mb_l)/mb_n,"median",mb_l[int(mb_n/2)],"90eme",mb_l[int(0.90*mb_n)],"95eme",mb_l[int(0.95*mb_n)],"max",mb_l[mb_n-1])