Revision: 1601 http://trac.macosforge.org/projects/calendarserver/changeset/1601 Author: cdaboo@apple.com Date: 2007-06-08 11:31:09 -0700 (Fri, 08 Jun 2007) Log Message: ----------- plists cannot cope with longs, so use strings instead. Also tweak the formatting for better output. Modified Paths: -------------- CalendarServer/trunk/twistedcaldav/admin/formatters.py CalendarServer/trunk/twistedcaldav/admin/logs.py Modified: CalendarServer/trunk/twistedcaldav/admin/formatters.py =================================================================== --- CalendarServer/trunk/twistedcaldav/admin/formatters.py 2007-06-08 17:07:39 UTC (rev 1600) +++ CalendarServer/trunk/twistedcaldav/admin/formatters.py 2007-06-08 18:31:09 UTC (rev 1601) @@ -92,9 +92,9 @@ for f in fields: if isinstance(f, float): - p = "% 9.2f" % (f,) - elif isinstance(f, int): - p = "% 9d" % (f,) + p = ("% " + str(spacing - 1) + ".2f") % (f,) + elif isinstance(f, int) or isinstance(f, long): + p = ("% " + str(spacing - 1) + "d") % (f,) else: p = str(f) self.write(p) @@ -111,12 +111,15 @@ for record in report['records']: self.writeLine((record[f] for f in fields)) - def writeMap(self, reportmap, fields, headings): + def writeMap(self, reportmap, fields, types, headings): self.writeLine((headings[f] for f in fields)) + spacing = self.options.get('spacing', 16) + self.write(('-' * (spacing - 1) + ' ') * len(fields) + '\n') for key, value in reportmap.iteritems(): values = (key,) values += tuple(value[f] for f in fields[1:]) + values = [types[i](value) for i, value in enumerate(values)] self.writeLine(values) def writeFrequencies(self, frequencies): @@ -193,11 +196,13 @@ def report_logs(self, report): self.write('Log Statistics:\n\n') - self.write(' Start Date: %s\n End Date :%s\n\n' % report['data']['dateRange']) + self.write(' Start Date: %s\n End Date : %s\n\n' % report['data']['dateRange']) - self.write(' Bytes Out: %s\n\n' % (report['data']['bytesOut'],)) + self.write(' Bytes Out: %s (%.2f GB)\n\n' % (report['data']['bytesOut'], report['data']['bytesOut'] / (1024.0 * 1024 * 1024))) self.write(' # Requests:\n') + title_spacing = self.options.get('spacing', 16) - 1 + fields = ( 'method', 'num', @@ -212,21 +217,35 @@ 'avtime', 'maxtime', ) + types = ( + str, + long, + long, + long, + long, + long, + long, + long, + long, + float, + float, + float, + ) headings = { 'method': 'Method', - 'num': '# Requests', - 'numOK': ' # OK', - 'numBAD': ' # BAD', - 'numISE': ' # Failed', - 'numOther': ' # Other', - 'minbytes': 'Min. bytes', - 'avbytes': ' Av. bytes', - 'maxbytes': 'Max. bytes', - 'mintime': 'Min. time', - 'avtime': ' Av. time', - 'maxtime': 'Max. time', + 'num': '# Requests'.rjust(title_spacing), + 'numOK': '# OK'.rjust(title_spacing), + 'numBAD': '# BAD'.rjust(title_spacing), + 'numISE': '# Failed'.rjust(title_spacing), + 'numOther': '# Other'.rjust(title_spacing), + 'minbytes': 'Min. bytes'.rjust(title_spacing), + 'avbytes': 'Av. bytes'.rjust(title_spacing), + 'maxbytes': 'Max. bytes'.rjust(title_spacing), + 'mintime': 'Min. time (ms)'.rjust(title_spacing), + 'avtime': 'Av. time (ms)'.rjust(title_spacing), + 'maxtime': 'Max. time (ms)'.rjust(title_spacing), } - self.writeMap(report['data']['requestStats'], fields, headings) + self.writeMap(report['data']['requestStats'], fields, types, headings) self.write('\n') self.write(' # Requests by time of day:\n') Modified: CalendarServer/trunk/twistedcaldav/admin/logs.py =================================================================== --- CalendarServer/trunk/twistedcaldav/admin/logs.py 2007-06-08 17:07:39 UTC (rev 1600) +++ CalendarServer/trunk/twistedcaldav/admin/logs.py 2007-06-08 18:31:09 UTC (rev 1601) @@ -25,10 +25,12 @@ """ import plistlib +import sys +import time from twistedcaldav.admin import util -PLIST_VERSION = 1 +PLIST_VERSION = 2 statsTemplate = plistlib.Dict( version=PLIST_VERSION, @@ -46,6 +48,9 @@ userAgents=plistlib.Dict(), ) +def _strAdd(value, add): + return str(long(value) + add) + class Stats(object): def __init__(self, fp): self.fp = fp @@ -72,51 +77,53 @@ return long(self._data.bytesOut) def addBytes(self, bytes): - self._data.bytesOut = str(long(self._data.bytesOut) + bytes) + self._data.bytesOut = _strAdd(self._data.bytesOut, bytes) def addRequestStats(self, request, status, bytes, time): if request in self._data.requestStats: - old_num = self._data.requestStats[request]['num'] - self._data.requestStats[request]['num'] = old_num + 1 + request_stat = self._data.requestStats[request] + old_num = long(request_stat['num']) + request_stat['num'] = _strAdd(request_stat['num'], 1) if status >= 200 and status < 300: - self._data.requestStats[request]['numOK'] = self._data.requestStats[request]['numOK'] + 1 + request_stat['numOK'] = _strAdd(request_stat['numOK'], 1) elif status == 500: - self._data.requestStats[request]['numISE'] = self._data.requestStats[request]['numISE'] + 1 + request_stat['numISE'] = _strAdd(request_stat['numISE'], 1) elif status >= 400 and status < 600: - self._data.requestStats[request]['numBAD'] = self._data.requestStats[request]['numBAD'] + 1 + request_stat['numBAD'] = _strAdd(request_stat['numBAD'], 1) else: - self._data.requestStats[request]['numOther'] = self._data.requestStats[request]['numOther'] + 1 - if bytes < self._data.requestStats[request]['minbytes']: - self._data.requestStats[request]['minbytes'] = bytes - if bytes > self._data.requestStats[request]['maxbytes']: - self._data.requestStats[request]['maxbytes'] = bytes - self._data.requestStats[request]['avbytes'] = (self._data.requestStats[request]['avbytes'] * old_num + bytes) / (old_num + 1) - if time < self._data.requestStats[request]['mintime']: - self._data.requestStats[request]['mintime'] = time - if time > self._data.requestStats[request]['maxtime']: - self._data.requestStats[request]['maxtime'] = time - self._data.requestStats[request]['avtime'] = (self._data.requestStats[request]['avtime'] * old_num + time) / (old_num + 1) + request_stat['numOther'] = _strAdd(request_stat['numOther'], 1) + if bytes < request_stat['minbytes']: + request_stat['minbytes'] = str(bytes) + if bytes > request_stat['maxbytes']: + request_stat['maxbytes'] = str(bytes) + request_stat['avbytes'] = str((long(request_stat['avbytes']) * old_num + bytes) / (old_num + 1)) + if time < request_stat['mintime']: + request_stat['mintime'] = time + if time > request_stat['maxtime']: + request_stat['maxtime'] = time + request_stat['avtime'] = (request_stat['avtime'] * old_num + time) / (old_num + 1) else: self._data.requestStats[request] = {} - self._data.requestStats[request]['num'] = 1 - self._data.requestStats[request]['numOK'] = 0 - self._data.requestStats[request]['numBAD'] = 0 - self._data.requestStats[request]['numISE'] = 0 - self._data.requestStats[request]['numOther'] = 0 + request_stat = self._data.requestStats[request] + request_stat['num'] = "1" + request_stat['numOK'] = "0" + request_stat['numBAD'] = "0" + request_stat['numISE'] = "0" + request_stat['numOther'] = "0" if status >= 200 and status < 300: - self._data.requestStats[request]['numOK'] = 1 + request_stat['numOK'] = "1" elif status == 500: - self._data.requestStats[request]['numISE'] = 1 + request_stat['numISE'] = "1" elif status >= 400 and status < 600: - self._data.requestStats[request]['numBAD'] = 1 + request_stat['numBAD'] = "1" else: - self._data.requestStats[request]['numOther'] = 1 - self._data.requestStats[request]['minbytes'] = bytes - self._data.requestStats[request]['maxbytes'] = bytes - self._data.requestStats[request]['avbytes'] = bytes - self._data.requestStats[request]['mintime'] = time - self._data.requestStats[request]['maxtime'] = time - self._data.requestStats[request]['avtime'] = time + request_stat['numOther'] = "1" + request_stat['minbytes'] = str(bytes) + request_stat['maxbytes'] = str(bytes) + request_stat['avbytes'] = str(bytes) + request_stat['mintime'] = time + request_stat['maxtime'] = time + request_stat['avtime'] = time def getRequestStats(self): return self._data.requestStats @@ -202,8 +209,9 @@ pass total_count += 1 print "Reading file: %s (%d lines)" % (self.logfile.basename(), total_count,) - print "|" + "--" * 48 + "|" + print "|" + "----|" * 10 + "\n.", last_count = 0 + start_time = time.time() for line_count, line in enumerate(self.logfile.open()): if (line.startswith('Log opened') or line.startswith('Log closed')): @@ -220,10 +228,11 @@ self.stats.addUserAgent(pline[8]) if (50 * line_count) / total_count > last_count: - print ".", + sys.stdout.write(".") + sys.stdout.flush() last_count = (50 * line_count) / total_count - print "\n\n" + print ".\nTime taken: %.1f secs\n" % (time.time() - start_time) self.stats.save()
participants (1)
-
source_changes@macosforge.org