107 lines
2.9 KiB
Python
Executable file
107 lines
2.9 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):
|
|
try:
|
|
dt=datetime.datetime.strptime(s,"%a %b %d %H:%M:%S %Z %Y")
|
|
except:
|
|
dt=datetime.datetime.strptime(s,"%a %d %b %Y %I:%M:%S %p %Z")
|
|
|
|
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])
|