Revision: 1566 http://trac.macosforge.org/projects/calendarserver/changeset/1566 Author: cdaboo@apple.com Date: 2007-05-24 09:39:24 -0700 (Thu, 24 May 2007) Log Message: ----------- Generate a more detailed break down of request statistics on a per method basis. 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-05-23 21:55:30 UTC (rev 1565) +++ CalendarServer/trunk/twistedcaldav/admin/formatters.py 2007-05-24 16:39:24 UTC (rev 1566) @@ -91,8 +91,14 @@ spacing = self.options.get('spacing', 16) for f in fields: - self.write(str(f)) - self.write(' '*(int(spacing) - len(str(f)))) + if isinstance(f, float): + p = "% 9.2f" % (f,) + elif isinstance(f, int): + p = "% 9d" % (f,) + else: + p = str(f) + self.write(p) + self.write(' '*(int(spacing) - len(p))) self.write('\n') @@ -105,6 +111,14 @@ for record in report['records']: self.writeLine((record[f] for f in fields)) + def writeMap(self, reportmap, fields, headings): + self.writeLine((headings[f] for f in fields)) + + for key, value in reportmap.iteritems(): + values = (key,) + values += tuple(value[f] for f in fields[1:]) + self.writeLine(values) + def writeReport(self, report, name, fields, headings): if self.options.has_key('fields'): fields = self.options.get('fields', '').split(',') @@ -160,8 +174,27 @@ self.write(' Bytes Out: %s\n' % (report['data']['bytesOut'],)) self.write(' # Requests:\n') - for req, count in report['data']['requestCounts'].iteritems(): - self.write(' %s: %s\n' % (req, count)) + fields = ( + 'method', + 'num', + 'minbytes', + 'avbytes', + 'maxbytes', + 'mintime', + 'avtime', + 'maxtime', + ) + headings = { + 'method': 'Method ', + 'num': '# Requests ', + 'minbytes': 'Min. bytes', + 'avbytes': ' Av. bytes', + 'maxbytes': 'Max. bytes', + 'mintime': 'Min. time', + 'avtime': ' Av. time', + 'maxtime': 'Max. time', + } + self.writeMap(report['data']['requestStats'], fields, headings) self.write(' User Agents:\n') Modified: CalendarServer/trunk/twistedcaldav/admin/logs.py =================================================================== --- CalendarServer/trunk/twistedcaldav/admin/logs.py 2007-05-23 21:55:30 UTC (rev 1565) +++ CalendarServer/trunk/twistedcaldav/admin/logs.py 2007-05-24 16:39:24 UTC (rev 1566) @@ -30,7 +30,7 @@ statsTemplate = plistlib.Dict( bytesOut=0, - requestCounts=plistlib.Dict( + requestStats=plistlib.Dict( ), invitations=plistlib.Dict( day=0, @@ -56,14 +56,32 @@ def addBytes(self, bytes): self._data.bytesOut += bytes - def addRequest(self, request): - if request in self._data.requestCounts: - self._data.requestCounts[request] += 1 + def addRequestStats(self, request, bytes, time): + if request in self._data.requestStats: + old_num = self._data.requestStats[request]['num'] + self._data.requestStats[request]['num'] = old_num + 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) else: - self._data.requestCounts[request] = 1 + self._data.requestStats[request] = {} + self._data.requestStats[request]['num'] = 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 - def getRequests(self): - return self._data.requestCounts + def getRequestStats(self): + return self._data.requestStats def addUserAgent(self, useragent): if useragent in self._data.userAgents: @@ -141,7 +159,7 @@ pline = parseCLFLine(line) self.stats.addBytes(int(pline[6])) - self.stats.addRequest(pline[4].split(' ')[0]) + self.stats.addRequestStats(pline[4].split(' ')[0], int(pline[6]), float(pline[9][:-3])) if len(pline) > 7: self.stats.addUserAgent(pline[8]) @@ -154,7 +172,7 @@ 'data': { 'bytesOut': util.prepareByteValue(self.config, self.stats.getBytes()), - 'requestCounts': self.stats.getRequests(), + 'requestStats': self.stats.getRequestStats(), 'userAgents': self.stats.getUserAgents(), } }