Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Unified Diff: appengine/findit/handlers/crash/fracas_dashboard.py

Issue 2043973002: [Findit] Fracas crash triage dashboard (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: appengine/findit/handlers/crash/fracas_dashboard.py
diff --git a/appengine/findit/handlers/crash/fracas_dashboard.py b/appengine/findit/handlers/crash/fracas_dashboard.py
new file mode 100644
index 0000000000000000000000000000000000000000..66b8a099342be484ac3ff563f538c29f18bb2fd4
--- /dev/null
+++ b/appengine/findit/handlers/crash/fracas_dashboard.py
@@ -0,0 +1,119 @@
+# Copyright 2016 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 base64
+from datetime import datetime
+from datetime import time
+from datetime import timedelta
+import json
+
+from google.appengine.ext import ndb
+
+from common import time_util
+from common.base_handler import BaseHandler
+from common.base_handler import Permission
+from model.crash.fracas_crash_analysis import FracasCrashAnalysis
+from model import triage_status
+
+
+_EQUAL_FILTER_TO_CONVERTER = {
+ 'found_suspects': lambda x: bool(int(x)),
+ 'has_regression_range': lambda x: bool(int(x)),
+ 'suspected_cls_triage_status': lambda x: x,
+ 'regression_range_triage_status': lambda x: x,
+}
+
+_DEFAULT_DISPLAY_COUNT = 500
+
+
+class FracasDashBoard(BaseHandler):
+ PERMISSION_LEVEL = Permission.ANYONE
+
+ def HandleGet(self):
+ """Shows a list of Findit try job results and statuses in an HTML page."""
stgao 2016/06/08 17:53:45 This is not updated. This one is for crash, not fo
Sharu Jiang 2016/06/09 06:13:28 Oops, changed it.
+ midnight_today = datetime.combine(datetime.utcnow(), time.min)
+ midnight_yesterday = midnight_today - timedelta(days=1)
+ midnight_tomorrow = midnight_today + timedelta(days=1)
+
+ start = self.request.get('start_date')
+ end = self.request.get('end_date')
+ start_date = (datetime.strptime(start, '%Y-%m-%d') if start else
+ midnight_yesterday)
+ end_date = (datetime.strptime(end, '%Y-%m-%d') if end else
+ midnight_tomorrow)
+
+ if start or not end: # pragma: no branch
+ # If a start date is specified, get everything since then.
+ filters = [
+ FracasCrashAnalysis.requested_time >= start_date,
+ FracasCrashAnalysis.requested_time < end_date
+ ]
+ else: # pragma: no cover
+ # If no start date specified, then get everything up until end_date.
+ start_date = None
+ filters = [
+ FracasCrashAnalysis.requested_time < end_date
+ ]
+
+ for equal_filter, converter in _EQUAL_FILTER_TO_CONVERTER.iteritems():
+ if self.request.get(equal_filter, None) is None:
+ continue
+
+ value = converter(self.request.get(equal_filter))
+ if value == triage_status.TRIAGED:
+ filters.append(ndb.OR(
+ getattr(FracasCrashAnalysis, equal_filter) ==
+ triage_status.TRIAGED,
+ getattr(FracasCrashAnalysis, equal_filter) ==
+ triage_status.TRIAGED_CORRECT,
+ getattr(FracasCrashAnalysis, equal_filter) ==
+ triage_status.TRIAGED_INCORRECT))
+ else:
+ filters.append(
+ getattr(FracasCrashAnalysis, equal_filter) ==
+ converter(self.request.get(equal_filter)))
+
+ if self.request.get('count'):
+ count = int(self.request.get('count'))
+ else:
+ count = _DEFAULT_DISPLAY_COUNT
+
+ # TODO(katesonia): Add pagination here.
+ fracas_crash_list = FracasCrashAnalysis.query(ndb.AND(*filters)).order(
+ FracasCrashAnalysis.requested_time).fetch(count)
+ fracas_crashes = []
+
+ for crash in fracas_crash_list:
+ display_data = {
+ 'signature': crash.signature,
+ 'version': crash.crashed_version,
+ 'channel': crash.channel,
+ 'platform': crash.platform,
+ 'regression_range': ('' if not crash.has_regression_range else
+ crash.result['regression_range']),
+ 'suspected_cls':crash.result['suspected_cls'],
+ 'suspected_project': crash.result['suspected_project'],
+ 'suspected_components': crash.result['suspected_components'],
+ 'stack_trace': crash.stack_trace,
+ 'historical_metadata': json.dumps(crash.historical_metadata),
+ 'crash_identifiers': base64.b64encode(
stgao 2016/06/08 17:53:45 Why we need this? For identifying the crash? If t
Sharu Jiang 2016/06/09 06:13:28 Done.
+ json.dumps(crash.crash_identifiers))
+ }
+ fracas_crashes.append(display_data)
+
+ data = {
+ 'start_date': time_util.FormatDatetime(start_date),
+ 'end_date': time_util.FormatDatetime(end_date),
+ 'found_suspects': self.request.get('found_suspects', '-1'),
+ 'has_regression_range': self.request.get('has_regression_range', '-1'),
+ 'suspected_cls_triage_status': self.request.get(
+ 'suspected_cls_triage_status', '-1'),
+ 'regression_range_triage_status': self.request.get(
+ 'regression_range_triage_status', '-1'),
+ 'fracas_crashes': fracas_crashes
+ }
+
+ return {
+ 'template': 'crash/fracas_dashboard.html',
+ 'data': data
+ }

Powered by Google App Engine
This is Rietveld 408576698