예제 #1
0
  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))
예제 #2
0
    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))
예제 #3
0
    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))
예제 #4
0
 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))
예제 #5
0
 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))
예제 #6
0
  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)