[CalendarServer-changes] [1568]
CalendarServer/trunk/twistedcaldav/admin
source_changes at macosforge.org
source_changes at macosforge.org
Thu May 24 13:55:06 PDT 2007
Revision: 1568
http://trac.macosforge.org/projects/calendarserver/changeset/1568
Author: cdaboo at apple.com
Date: 2007-05-24 13:55:06 -0700 (Thu, 24 May 2007)
Log Message:
-----------
Add time-of-day analysis for requests.
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-24 16:55:04 UTC (rev 1567)
+++ CalendarServer/trunk/twistedcaldav/admin/formatters.py 2007-05-24 20:55:06 UTC (rev 1568)
@@ -119,6 +119,28 @@
values += tuple(value[f] for f in fields[1:])
self.writeLine(values)
+ def writeFrequencies(self, frequencies):
+
+ width = len(frequencies)
+ plot = [[" "] * width for ignore in range(20)]
+ plot.append(["|---"] * 24)
+ plot.append(["%02d " % d for d in range(24)])
+
+ max_count = 0
+ for freq in frequencies:
+ max_count = max(freq, max_count)
+
+ for column, freq in enumerate(frequencies):
+ if freq == 0:
+ continue
+ scaled = (20 * freq) / max_count
+ for row in range(20):
+ if row <= scaled:
+ plot[19 - row][column] = "*"
+
+ self.write("\n".join(["".join(p) for p in plot]))
+ self.write("\n")
+
def writeReport(self, report, name, fields, headings):
if self.options.has_key('fields'):
fields = self.options.get('fields', '').split(',')
@@ -169,9 +191,11 @@
self.writeReport(report, 'Statistics', fields, headings)
def report_logs(self, report):
- self.write('Log Statistics:\n')
+ self.write('Log Statistics:\n\n')
- self.write(' Bytes Out: %s\n' % (report['data']['bytesOut'],))
+ 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(' # Requests:\n')
fields = (
@@ -203,7 +227,12 @@
'maxtime': 'Max. time',
}
self.writeMap(report['data']['requestStats'], fields, headings)
+ self.write('\n')
+ self.write(' # Requests by time of day:\n')
+ self.writeFrequencies(report['data']['timeOfDayStats'])
+ self.write('\n')
+
self.write(' User Agents:\n')
for ua, count in report['data']['userAgents'].iteritems():
Modified: CalendarServer/trunk/twistedcaldav/admin/logs.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/admin/logs.py 2007-05-24 16:55:04 UTC (rev 1567)
+++ CalendarServer/trunk/twistedcaldav/admin/logs.py 2007-05-24 20:55:06 UTC (rev 1568)
@@ -28,10 +28,16 @@
from twistedcaldav.admin import util
+PLIST_VERSION = 1
+
statsTemplate = plistlib.Dict(
- bytesOut=0,
+ version=PLIST_VERSION,
+ bytesOut="0",
+ startDate="",
+ endDate="",
requestStats=plistlib.Dict(
- ),
+ ),
+ timeOfDayStats=[0] * 96,
invitations=plistlib.Dict(
day=0,
week=0,
@@ -43,18 +49,30 @@
class Stats(object):
def __init__(self, fp):
self.fp = fp
+ self._data = None
if self.fp.exists():
self._data = plistlib.readPlist(self.fp.path)
- else:
+ if self._data.version != PLIST_VERSION:
+ self._data = None
+
+ if self._data is None:
self._data = statsTemplate
self.save()
+ def addDate(self, date):
+ if not self._data.startDate:
+ self._data.startDate = date
+ self._data.endDate = date
+
+ def getDateRange(self):
+ return (self._data.startDate, self._data.endDate)
+
def getBytes(self):
- return self._data.bytesOut
+ return long(self._data.bytesOut)
def addBytes(self, bytes):
- self._data.bytesOut += bytes
+ self._data.bytesOut = str(long(self._data.bytesOut) + bytes)
def addRequestStats(self, request, status, bytes, time):
if request in self._data.requestStats:
@@ -103,6 +121,14 @@
def getRequestStats(self):
return self._data.requestStats
+ def addTimeOfDayStats(self, request, time):
+ hour, minute = time.split(":")
+ bucket = int(hour) * 4 + divmod(int(minute), 15)[0]
+ self._data.timeOfDayStats[bucket] = self._data.timeOfDayStats[bucket] + 1
+
+ def getTimeOfDayStats(self):
+ return self._data.timeOfDayStats
+
def addUserAgent(self, useragent):
if useragent in self._data.userAgents:
self._data.userAgents[useragent] += 1
@@ -171,28 +197,45 @@
def run(self):
if not self.readOnly:
- for line in self.logfile.open():
+ total_count = -1
+ for total_count, line in enumerate(self.logfile.open()):
+ pass
+ total_count += 1
+ print "Reading file: %s (%d lines)" % (self.logfile.basename(), total_count,)
+ print "|" + "--" * 48 + "|"
+ last_count = 0
+ for line_count, line in enumerate(self.logfile.open()):
if (line.startswith('Log opened') or
line.startswith('Log closed')):
continue
else:
pline = parseCLFLine(line)
+ self.stats.addDate(pline[3])
self.stats.addBytes(int(pline[6]))
self.stats.addRequestStats(pline[4].split(' ')[0], int(pline[5]), int(pline[6]), float(pline[9][:-3]))
+ self.stats.addTimeOfDayStats(pline[4].split(' ')[0], pline[3][pline[3].find(":") + 1:][:5])
if len(pline) > 7:
self.stats.addUserAgent(pline[8])
+
+ if (50 * line_count) / total_count > last_count:
+ print ".",
+ last_count = (50 * line_count) / total_count
+ print "\n\n"
+
self.stats.save()
if not self.noOutput:
report = {
'type': 'logs',
'data': {
+ 'dateRange': self.stats.getDateRange(),
'bytesOut': util.prepareByteValue(self.config,
self.stats.getBytes()),
'requestStats': self.stats.getRequestStats(),
+ 'timeOfDayStats': self.stats.getTimeOfDayStats(),
'userAgents': self.stats.getUserAgents(),
}
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20070524/d9455003/attachment.html
More information about the calendarserver-changes
mailing list