github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/scripts/leadershipclaimer/count-leadership.py (about) 1 #!/usr/bin/env python3 2 # Copyright 2019 Canonical Ltd. 3 # Licensed under the AGPLv3, see LICENCE file for details. 4 5 import argparse 6 import re 7 import sys 8 9 def main(args): 10 p = argparse.ArgumentParser(description="parse claim log files, reporting output") 11 p.add_argument("file", type=argparse.FileType('r'), default=sys.stdin, nargs="?", 12 help="the name of the file to parse") 13 p.add_argument("--tick", type=float, default=1.0, 14 help="seconds between printing status ticks") 15 opts = p.parse_args(args) 16 actionsRE = re.compile("\s*(?P<time>\d+\.\d\d\d)s\s+(?P<action>claimed|extended|lost|connected).*in (?P<duration>[0-9m.]+s)") 17 # We don't have minutes if we have 'ms', so match 'ms' first, we might have 'm' if we have 's', so put it before s. 18 durationRE = re.compile("((?P<milliseconds>\d+)ms)?((?P<minutes>\d+)m)?((?P<seconds>\d+(\.\d+)?)s)?") 19 totalClaims = 0 20 extendedSum = 0 21 extendedCount = 0 22 lostCount = 0 23 lastTime = 0 24 claimSum = 0 25 claimCount = 0 26 print("claims\tclaim time\textend time\tlost") 27 for line in opts.file: 28 m = actionsRE.match(line.strip()) 29 if m is None: 30 continue 31 curTime, action, duration = m.group('time', 'action', 'duration') 32 curTime = float(curTime) 33 m2 = durationRE.match(duration) 34 if m2 is None: 35 print("could not match %q" % (duration,)) 36 continue 37 m, s, ms = m2.group("minutes", "seconds", "milliseconds") 38 delta = 0 39 if m is not None: 40 delta += float(m)*60 41 if s is not None: 42 delta += float(s) 43 if ms is not None: 44 delta += float(ms) * 0.001 45 delta = round(delta, 3) 46 # print(action, duration, delta) 47 if action == "extended": 48 extendedCount += 1 49 extendedSum += delta 50 elif action == "lost": 51 totalClaims -= 1 52 lostCount += 1 53 elif action == "claimed": 54 totalClaims += 1 55 claimCount += 1 56 claimSum += delta 57 if curTime - lastTime > opts.tick: 58 lastTime = curTime 59 claimMsg = "" 60 if claimCount > 0: 61 claimAvg = claimSum / claimCount 62 claimCount = 0 63 claimSum = 0 64 claimMsg = "%9.3f" % (claimAvg,) 65 extendedMsg = " "*9 66 if extendedCount > 0: 67 extendedAvg = extendedSum / extendedCount 68 extendedSum = 0 69 extendedCount = 0 70 extendedMsg = "%9.3f" %(extendedAvg,) 71 print("%5d\t%9s\t%9s\t%d" % (totalClaims, claimMsg, extendedMsg, lostCount)) 72 73 if __name__ == "__main__": 74 main(sys.argv[1:]) 75