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