Analyse Test Script Logs

From PeformIQ Upgrade
Jump to navigation Jump to search

calculate Mean and SD

This script takes the output of another script which produces test summary logs and calculates Mean and SD for query execution times. See [ODBC Test Script].

#!/usr/bin/env python
#
#  Purpose:
#
#  $Id:$
#
#-------------------------------------------------------------------------------

"""
  Analyse SLAPD logs

  ...
"""
#-------------------------------------------------------------------------------

import os
import re
import sys
import math
import getopt
import logging

#-------------------------------------------------------------------------------

from datetime import datetime

#-------------------------------------------------------------------------------

__version__   = "1.0.0"
__id__        = "@(#)  analyse.py  [%s]  01/05/2008"

verbose_flg   = False

debug_level   = 0

LOGFILE       = "xxx.log"
PIDFILE       = "analyse.pid"

tables        = []

log           = None
pid           = None
file_name     = None

#===============================================================================

def INFO(msg):
   if log: log.info(' ' + msg)
   if verbose_flg: print "[analyse]  %s" % msg

#-------------------------------------------------------------------------------

def ERROR(msg):
   if log: log.error(msg)
   sys.stderr.write('[analyse]  %s\n' % msg)

#-------------------------------------------------------------------------------

def WARNING(msg):
   if log: log.warning('*****' + msg + '*****')
   if verbose_flg: print "[analyse]  %s" % msg

#===============================================================================

def analyse(fname):
   try:
      f = open(fname, 'r')
   except IOError, e:
      sys.stderr.write('[analyse]  Open failed: ' + str(e) + '\n')
      sys.exit(1)

   s_Started = 'Started'
   p_Started = re.compile(s_Started)

   s_time   = r'.*\[([^\]]*)\]'
   p_time   = re.compile(s_time)

   times =  []

   cnt = 0

   sum_time  = 0.0
   sum_time2 = 0.0

   while True:
      line = f.readline()

      if not line: break

      line = line.strip()

      m = p_Started.search(line)

      if m:
          continue

      m = p_time.search(line)

      if m:
         time    = float(m.group(1))

         times.append(time)

         cnt += 1

         sum_time    += time
         t_squared    = time * time
         sum_time2   += t_squared

         if verbose_flg: print "%s  %3d  %s" % time

   mean = sum_time / cnt

   sum_sqr = 0.0

   for t in times:
       delta    = (t - mean)
       sqr      = delta * delta
       sum_sqr += sqr

   sigma = math.sqrt(sum_sqr / cnt)

   sd   = math.sqrt((sum_time2 - (cnt * (mean * mean)))/cnt)

   print "Mean = %7.3f [%d]  sigma  %.2f  SD %.2f" % (mean, cnt, sigma, sd)

   f.close()

   if debug_level > 5: INFO("Processed %d lines" % (len(Data), ))

#===============================================================================

def init():
   global log
   global pid

   pid = os.getpid()

   log  = logging.getLogger('xxx')
   hdlr = logging.FileHandler(LOGFILE)
   fmtr = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

   hdlr.setFormatter(fmtr)
   log.addHandler(hdlr)
   log.setLevel(logging.INFO)

   INFO("Started processing")

   if (not verbose_flg):
      INFO("PID is %d" % pid)

#===============================================================================

def main():
   global verbose_flg
   global debug_level
   global file_name

   try:
      opts, args = getopt.getopt(sys.argv[1:], "df:D:vVw?")
   except getopt.error, msg:
      print __doc__
      return 1

   for o, a in opts:
      if o == '-d':
         debug_level   += 1
      elif o == '-D':
         debug_level    = int(a)
      elif o == '-f':
         file_name      = a
      elif o == '-v':
         verbose_flg    = True
      elif o == '-V':
         print "[analyse]  Version: %s" % __version__
         return 1
      elif o == '-?':
         print __doc__
         return 1

   print "[analyse]  Working directory is %s" % os.getcwd()

   if (debug_level > 0): print "Debugging level set to %d" % debug_level

   if args:
      for arg in args:
         print arg

   init()

   analyse('lastnight.log')

   return 0

#-------------------------------------------------------------------------------

if __name__ == '__main__' or __name__ == sys.argv[0]:
   try:
      sys.exit(main())
   except KeyboardInterrupt, e:
      print "[analyse]  Interrupted!"

#-------------------------------------------------------------------------------

"""
Revision History:

     Date     Who   Description
   --------   ---   ------------------------------------------------------------
   20080501   plh   Initial implementation

Problems to fix:

To Do:

Issues:

"""

#-------------------------------------------------------------------------------

Input File

2008-05-02 13:03:58,328 INFO  ===== Started processing ==================================
2008-05-02 13:04:00,125 INFO  01 ManifestNo EA004454072AU  [1.735] sec    7 rows returned
2008-05-02 13:04:01,546 INFO  02 ManifestNo EE007797760BD  [1.421] sec    4 rows returned
2008-05-02 13:04:02,640 INFO  03 ManifestNo EA004393078AU  [1.094] sec    5 rows returned
2008-05-02 13:04:03,625 INFO  04 ManifestNo EA003698436AU  [0.985] sec    3 rows returned
2008-05-02 13:04:05,328 INFO  05 ManifestNo EA004065228AU  [1.703] sec    8 rows returned
2008-05-02 13:04:06,750 INFO  06 ManifestNo EE017124361BR  [1.422] sec    6 rows returned
2008-05-02 13:04:08,203 INFO  07 ManifestNo EM710190113KR  [1.453] sec    5 rows returned
2008-05-02 13:04:09,655 INFO  08 ManifestNo EM640327308KR  [1.453] sec    6 rows returned
2008-05-02 13:04:11,125 INFO  09 ManifestNo EE000212495VU  [1.453] sec    6 rows returned
2008-05-02 13:04:12,078 INFO  10 ManifestNo EH609611995CN  [0.953] sec    1 rows returned

Output

Looks like:

Mean =   3.762 [5542]  sigma  1.53  SD 1.53