def doAuthenticatedGet(self, user): self.response.headers['Content-Type'] = 'text/html' filters = getFilters(self.request) page = int(self.request.get('page', 0)) errors, instances = getErrors(filters, limit = 51, offset = page * 50) if errors is not None: hasMore = len(errors) == 51 errors = errors[:50] else: hasMore = len(instances) == 51 instances = instances[:50] context = { 'title': NAME, 'extraScripts': ['list'], 'user': user, 'filters': filters.items(), 'errors': errors, 'instances': instances, 'hasMore': hasMore, 'nextPage': page + 1 } self.response.out.write(template.render(getTemplatePath('list.html'), context))
def doAuthenticatedGet(self, user): self.response.headers['Content-Type'] = 'text/html' filters = getFilters(self.request) page = int(self.request.get('page', 0)) errors, instances = getErrors(filters, limit=51, offset=page * 50) if errors is not None: hasMore = len(errors) == 51 errors = errors[:50] else: hasMore = len(instances) == 51 instances = instances[:50] context = { 'title': NAME, 'extraScripts': ['list'], 'user': user, 'filters': filters.items(), 'errors': errors, 'instances': instances, 'hasMore': hasMore, 'nextPage': page + 1 } self.response.out.write( template.render(getTemplatePath('list.html'), context))
def get(self, viewLength): """Handles a new error report via POST.""" if viewLength != 'day': # TODO(robbyw): For viewLength == week or viewLength == month, aggregate the aggregates. viewLength = 'day' data = AggregatedStats.all().order('-date').get() data = json.loads(data.json)[:25] for _, row in data: logging.info(row) row['servers'] = sorted(row['servers'].items(), key=lambda x: x[1], reverse=True) row['environments'] = sorted(row['environments'].items(), key=lambda x: x[1], reverse=True) keys, values = zip(*data) errors = LoggedError.get([db.Key(key) for key in keys]) context = { 'title': 'Top 25 exceptions over the last %s' % viewLength, 'errors': zip(errors, values), 'total': len(data) } self.response.out.write( template.render(getTemplatePath('aggregation.html'), context))
def doAuthenticatedGet(self, user, *args): key, = args self.response.headers['Content-Type'] = 'text/html' error = LoggedError.get(key) filters = getFilters(self.request) context = { 'title': '%s - %s' % (error.lastMessage, NAME), 'extraScripts': ['view'], 'user': user, 'error': error, 'filters': filters.items(), 'instances': getInstances(filters, parent=error)[:100] } self.response.out.write(template.render(getTemplatePath('view.html'), context))
def doAuthenticatedGet(self, user, *args): key, = args self.response.headers['Content-Type'] = 'text/html' error = LoggedError.get(key) filters = getFilters(self.request) context = { 'title': '%s - %s' % (error.lastMessage, NAME), 'extraScripts': ['view'], 'user': user, 'error': error, 'filters': filters.items(), 'instances': getInstances(filters, parent=error)[:100] } self.response.out.write( template.render(getTemplatePath('view.html'), context))
def get(self, viewLength): """Handles a new error report via POST.""" if viewLength != 'day': # TODO(robbyw): For viewLength == week or viewLength == month, aggregate the aggregates. viewLength = 'day' data = AggregatedStats.all().order('-date').get() data = json.loads(data.json)[:25] for _, row in data: logging.info(row) row['servers'] = sorted(row['servers'].items(), key = lambda x: x[1], reverse=True) row['environments'] = sorted(row['environments'].items(), key = lambda x: x[1], reverse=True) keys, values = zip(*data) errors = LoggedError.get([db.Key(key) for key in keys]) context = { 'title': 'Top 25 exceptions over the last %s' % viewLength, 'errors': zip(errors, values), 'total': len(data) } self.response.out.write(template.render(getTemplatePath('aggregation.html'), context))
def main(): """Runs the aggregation.""" toEmail = config.get('toEmail') fromEmail = config.get('fromEmail') if toEmail and fromEmail: logging.info('running the email cron') errorQuery = (LoggedError.all().filter('active =', True) .filter('firstOccurrence >', datetime.now() - timedelta(hours = 24)) .order('-firstOccurrence')) errors = errorQuery.fetch(500, 0) errors.sort(key = lambda x: x.count, reverse=True) projects = collections.defaultdict(list) for error in errors: projects[error.project.key().name()].append(error) context = {'projects': sorted(projects.items()), 'errorCount': len(errors), 'baseUrl': config.get('baseUrl')} body = template.render(getTemplatePath('dailymail.html'), context).strip() mail.send_mail( sender=fromEmail, to=toEmail, subject='Latest GEC reports', body='Only available in HTML', html=body)