| Index: appengine_apps/trooper_o_matic/appengine_module/trooper_o_matic/alerts.py
|
| diff --git a/appengine_apps/trooper_o_matic/appengine_module/trooper_o_matic/alerts.py b/appengine_apps/trooper_o_matic/appengine_module/trooper_o_matic/alerts.py
|
| deleted file mode 100644
|
| index 0a8d4d05331f5ef7464be4f194704e2ab9d8ed86..0000000000000000000000000000000000000000
|
| --- a/appengine_apps/trooper_o_matic/appengine_module/trooper_o_matic/alerts.py
|
| +++ /dev/null
|
| @@ -1,115 +0,0 @@
|
| -# Copyright (c) 2014 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -import jinja2
|
| -import json
|
| -import os
|
| -import webapp2
|
| -
|
| -from google.appengine.ext import ndb
|
| -
|
| -from appengine_module.trooper_o_matic import models
|
| -
|
| -
|
| -JINJA_ENVIRONMENT = jinja2.Environment(
|
| - loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__),
|
| - 'templates')),
|
| - extensions=['jinja2.ext.autoescape'],
|
| - autoescape=True)
|
| -
|
| -
|
| -def GetTreeStatusDict(project): # pragma: no cover
|
| - stat = models.TreeOpenStat.query(
|
| - models.TreeOpenStat.num_days == 7, ancestor=project).order(
|
| - -models.TreeOpenStat.timestamp).get()
|
| - if not stat:
|
| - return {}
|
| - return {
|
| - 'should_alert': stat.percent_open < 80.0,
|
| - 'percent_open': stat.percent_open,
|
| - 'details': ('Tree %.2f%% open over last 7 days (must be > 80.0)' %
|
| - stat.percent_open),
|
| - 'url': ('https://trooper-o-matic.appspot.com/tree-status/%s' %
|
| - project.id()),
|
| - }
|
| -
|
| -def GetCqLatencyDict(project): # pragma: no cover
|
| - stat = models.CqStat.query(ancestor=project).order(
|
| - -models.CqStat.timestamp).get()
|
| - if not stat:
|
| - return {}
|
| - if not stat.p50:
|
| - return {
|
| - 'should_alert': False,
|
| - 'p50': None,
|
| - 'p90': None,
|
| - 'length': stat.length,
|
| - 'details': 'No CQ jobs in last hour',
|
| - 'url': 'https://trooper-o-matic.appspot.com/cq/%s' % project.id(),
|
| - }
|
| - return {
|
| - 'should_alert': stat.p50 > 60 or stat.p90 > 180,
|
| - 'p50': stat.p50,
|
| - 'p90': stat.p90,
|
| - 'length': stat.length,
|
| - 'details': ('CQ latency is median %dm and 90th %dm '
|
| - '(must be less than median 60m and 90th 180m' % (
|
| - stat.p50, stat.p90)),
|
| - 'url': 'https://trooper-o-matic.appspot.com/cq/%s' % project.id(),
|
| - }
|
| -
|
| -def _GetPercent(numerator, denominator): # pragma: no cover
|
| - if denominator == 0:
|
| - return "0%"
|
| - else:
|
| - return "%.2f%%" % (float(numerator) / float(denominator) * 100)
|
| -
|
| -def GetCycleTimeDict(tree): # pragma: no cover
|
| - stat = models.BuildTimeStat.query(ancestor=tree).order(
|
| - -models.BuildTimeStat.timestamp).get()
|
| - if not stat:
|
| - return {}
|
| - # TODO(sullivan): Make this account for clobber time.
|
| - return {
|
| - 'should_alert': (stat.num_over_max_slo > 0 or
|
| - stat.num_over_median_slo > (stat.num_builds / 2)),
|
| - 'num_builds': stat.num_builds,
|
| - 'num_over_median_slo': stat.num_over_median_slo,
|
| - 'percent_over_median_slo': _GetPercent(stat.num_over_median_slo,
|
| - stat.num_builds),
|
| - 'num_over_max_slo': stat.num_over_max_slo,
|
| - 'percent_over_max_slo': _GetPercent(stat.num_over_max_slo,
|
| - stat.num_builds),
|
| - 'details': ('%d builds over their max, %d builds over their median' % (
|
| - stat.num_over_max_slo, stat.num_over_median_slo)),
|
| - 'url': 'https://trooper-o-matic.appspot.com/tree/%s' % tree.id()
|
| - }
|
| -
|
| -def UpdateJsonForProject(name, status_dict): # pragma: no cover
|
| - project = ndb.Key(models.Project, name)
|
| - tree = ndb.Key(models.Tree, name)
|
| - status_dict.setdefault('tree_status', {})[name] = GetTreeStatusDict(project)
|
| - status_dict.setdefault('cq_latency', {})[name] = GetCqLatencyDict(project)
|
| - status_dict.setdefault('cycle_time', {})[name] = GetCycleTimeDict(tree)
|
| -
|
| -
|
| -class AlertsHandler(webapp2.RequestHandler): # pragma: no cover
|
| -
|
| - def get(self):
|
| - status_dict = {}
|
| - UpdateJsonForProject('blink', status_dict)
|
| - UpdateJsonForProject('chromium', status_dict)
|
| - self.response.headers.add_header('Access-Control-Allow-Origin', '*')
|
| - self.response.write(json.dumps(status_dict))
|
| -
|
| -
|
| -class OverviewHandler(webapp2.RequestHandler): # pragma: no cover
|
| -
|
| - def get(self):
|
| - status_dict = {}
|
| - UpdateJsonForProject('blink', status_dict)
|
| - UpdateJsonForProject('chromium', status_dict)
|
| -
|
| - template = JINJA_ENVIRONMENT.get_template('overview.html')
|
| - self.response.write(template.render(status_dict))
|
|
|