[CalendarServer-changes] [6283] CalendarServer/trunk/contrib/tools/request_monitor.py

source_changes at macosforge.org source_changes at macosforge.org
Mon Sep 13 12:03:45 PDT 2010


Revision: 6283
          http://trac.macosforge.org/projects/calendarserver/changeset/6283
Author:   cdaboo at apple.com
Date:     2010-09-13 12:03:44 -0700 (Mon, 13 Sep 2010)
Log Message:
-----------
Better handle line parsing errors. Add a --debug option to print out tracebacks when exceptions occur. Count
number of /ischedule requests during the analysis window.

Modified Paths:
--------------
    CalendarServer/trunk/contrib/tools/request_monitor.py

Modified: CalendarServer/trunk/contrib/tools/request_monitor.py
===================================================================
--- CalendarServer/trunk/contrib/tools/request_monitor.py	2010-09-13 18:49:44 UTC (rev 6282)
+++ CalendarServer/trunk/contrib/tools/request_monitor.py	2010-09-13 19:03:44 UTC (rev 6283)
@@ -22,6 +22,7 @@
 import os
 import sys
 import time
+import traceback
 
 sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) 
 
@@ -148,23 +149,50 @@
 
 
 def usage():
+    print "request_monitor [OPTIONS] [FILENAME]"
+    print ""
+    print "FILENAME   optional path of access log to monitor [/var/log/caldavd/access.log]"
+    print ""
+    print "OPTIONS"
     print "-h         print help and exit"
+    print "--debug    print tracebacks and error details"
     print "--lines N  specifies how many lines to tail from access.log (default: 10000)"
     print "--procs N  specifies how many python processes are expected in the log file (default: 80)"
 
 numLines = 10000
 numProcs = 80
-options, args = getopt.getopt(sys.argv[1:], "h", ["lines=", "procs=",])
+debug = False
+options, args = getopt.getopt(sys.argv[1:], "h", ["debug", "lines=", "procs=",])
 for option, value in options:
     if option == "-h":
         usage()
         sys.exit(0)
+    elif option == "--debug":
+        debug = True
     elif option == "--lines":
         numLines = int(value)
     elif option == "--procs":
         numProcs = int(value)
 
+if len(args):
+    filename = os.path.expanduser(args[0])
 
+if not os.path.isfile(filename):
+    print "Path %s does not exist" % (filename,)
+    print
+    usage()
+    sys.exit(1)
+
+if not os.access(filename, os.R_OK):
+    print "Path %s does not exist" % (filename,)
+    print
+    usage()
+    sys.exit(1)
+
+if debug:
+    print "Starting: access log file: %s" % (filename,)
+    print
+
 while True:
 
     samples = []
@@ -175,6 +203,7 @@
     rawCounts = {}
     timesSpent = {}
     numRequests = 0
+    numServerToServer = 0
     totalRespTime = 0.0
     maxRespTime = 0.0
     under10ms = 0
@@ -189,6 +218,7 @@
     startTime = None
     endTime = None
     errorCount = 0
+    parseErrors = 0
 
     try: 
         for line in tail(filename, numLines):
@@ -197,7 +227,19 @@
 
             numRequests += 1
 
-            userId, logTime, method, uri, status, bytes, _ignore_referer, client, extended = parseLine(line)
+            try:
+                userId, logTime, method, uri, status, bytes, _ignore_referer, client, extended = parseLine(line)
+            except Exception, e:
+                parseErrors += 1
+                
+                if debug:
+                    print "Access log line parse failure", e
+                    print traceback.print_exc()
+                    print "---"
+                    print line
+                    print "---"
+                    
+                continue
 
             logTime = dateparse(logTime, fuzzy=True)
             times.append(logTime)
@@ -205,6 +247,9 @@
             if status >= 500:
                 errorCount += 1
 
+            if uri == "/ischedule":
+                numServerToServer += 1
+
             outstanding = int(extended['or'])
             logId = int(extended['i'])
             raw = rawCounts.get(logId, 0) + 1
@@ -299,7 +344,10 @@
 
         if avg:
             print avg, "|",
-        print "%d requests between %s and %s" % (numLines, startTime.strftime("%H:%M:%S"), endTime.strftime("%H:%M:%S"))
+        print "%d requests between %s and %s" % (numRequests, startTime.strftime("%H:%M:%S"), endTime.strftime("%H:%M:%S")),
+        if numServerToServer:
+            print "| %d server-to-server" % (numServerToServer,),
+        print
         
         lqlatency = (lqssl / avgRequests, lqnon / avgRequests,) if avgRequests else (0.0, 0.0,)
         print "Response time: average %.1f ms, max %.1f ms, listenq latency (ssl+non): %.1f s %.1f s" % (
@@ -312,6 +360,9 @@
         print
         if errorCount:
             print "Number of 500 errors: %d" % (errorCount,)
+        if parseErrors:
+            print "Number of access log parsing errors: %d" % (parseErrors,)
+        if errorCount or parseErrors:
             print
 
         print "Proc:   Peak outstanding:        Seconds of processing (number of requests):"
@@ -342,7 +393,7 @@
             print
 
         print
-        print "Top 10 longest (in most recent %d requests):" % (numLines,)
+        print "Top 10 longest (in most recent %d requests):" % (numRequests,)
         requests.sort()
         requests.reverse()
         for i in xrange(10):
@@ -364,7 +415,7 @@
             
 
         print
-        print "Top 5 busiest users (in most recent %d requests):" % (numLines,)
+        print "Top 5 busiest users (in most recent %d requests):" % (numRequests,)
         userlist = []
         for user, userStat in users.iteritems():
             userlist.append((userStat['count'], user, userStat))
@@ -391,4 +442,5 @@
 
     except Exception, e:
         print "Script failure", e
-
+        if debug:
+            print traceback.print_exc()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100913/103edd7d/attachment-0001.html>


More information about the calendarserver-changes mailing list