Add queues.webkit.org/active-bots page to make it easy to see which bots are down
authoreric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Aug 2011 20:58:17 +0000 (20:58 +0000)
committereric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Aug 2011 20:58:17 +0000 (20:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=67314

Reviewed by Adam Barth.

Very simple page.  Just lists all the bots, what queue they belong to and what we last heard from them.
If we haven't heard from a bot in the last 500 messages (last day or so), then it won't show up here.
This makes it very easy for me to see which of my cr-jail bots might be down at any one time.

I also moved a bunch of code into dashboard.css which belonged there.

* QueueStatusServer/handlers/activebots.py: Added.
* QueueStatusServer/main.py:
* QueueStatusServer/stylesheets/dashboard.css:
(.queue_bubble):
(.queue_name):
(.last_heard_from):
(.status_text):
(.alive):
(.behind):
(.dead):
* QueueStatusServer/templates/activebots.html: Added.
* QueueStatusServer/templates/dashboard.html:
* QueueStatusServer/templates/recentstatus.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@94228 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/QueueStatusServer/handlers/activebots.py [new file with mode: 0644]
Tools/QueueStatusServer/main.py
Tools/QueueStatusServer/stylesheets/dashboard.css
Tools/QueueStatusServer/templates/activebots.html [new file with mode: 0644]
Tools/QueueStatusServer/templates/dashboard.html
Tools/QueueStatusServer/templates/recentstatus.html

index b199392..600118f 100644 (file)
@@ -1,3 +1,30 @@
+2011-08-31  Eric Seidel  <eric@webkit.org>
+
+        Add queues.webkit.org/active-bots page to make it easy to see which bots are down
+        https://bugs.webkit.org/show_bug.cgi?id=67314
+
+        Reviewed by Adam Barth.
+
+        Very simple page.  Just lists all the bots, what queue they belong to and what we last heard from them.
+        If we haven't heard from a bot in the last 500 messages (last day or so), then it won't show up here.
+        This makes it very easy for me to see which of my cr-jail bots might be down at any one time.
+
+        I also moved a bunch of code into dashboard.css which belonged there.
+
+        * QueueStatusServer/handlers/activebots.py: Added.
+        * QueueStatusServer/main.py:
+        * QueueStatusServer/stylesheets/dashboard.css:
+        (.queue_bubble):
+        (.queue_name):
+        (.last_heard_from):
+        (.status_text):
+        (.alive):
+        (.behind):
+        (.dead):
+        * QueueStatusServer/templates/activebots.html: Added.
+        * QueueStatusServer/templates/dashboard.html:
+        * QueueStatusServer/templates/recentstatus.html:
+
 2011-08-31  Oliver Hunt  <oliver@apple.com>
 
         Move CheckedArithmeticOperations.cpp to the intended location
diff --git a/Tools/QueueStatusServer/handlers/activebots.py b/Tools/QueueStatusServer/handlers/activebots.py
new file mode 100644 (file)
index 0000000..3d0b5cf
--- /dev/null
@@ -0,0 +1,56 @@
+# Copyright (C) 2010 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import datetime
+import itertools
+import operator
+
+from google.appengine.ext import webapp
+from google.appengine.ext.webapp import template
+
+from model.queues import Queue
+from model import queuestatus
+
+
+class ActiveBots(webapp.RequestHandler):
+    def get(self):
+        # 2000 is the GAE record fetch limit.
+        recent_statuses = queuestatus.QueueStatus.all().order("-date").fetch(500)
+        queue_name_to_last_status = {}
+        for status in recent_statuses:
+            last_status = queue_name_to_last_status.get(status.bot_id)
+            if not last_status or status.date > last_status.date:
+                queue_name_to_last_status[status.bot_id] = status
+
+        sorted_by_bot_id = sorted(queue_name_to_last_status.values(), key=operator.attrgetter('bot_id'))
+        # Sorted is stable, so this will be sorted by bot_id, groupped by sorted queue_name.
+        sorted_by_queue_name = sorted(sorted_by_bot_id, key=operator.attrgetter('queue_name'))
+        template_values = {
+            "last_statuses": sorted_by_queue_name,
+        }
+        self.response.out.write(template.render("templates/activebots.html", template_values))
index 446f36b..465646e 100644 (file)
@@ -33,6 +33,7 @@ use_library('django', '1.1')
 from google.appengine.ext import webapp
 from google.appengine.ext.webapp.util import run_wsgi_app
 
+from handlers.activebots import ActiveBots
 from handlers.dashboard import Dashboard
 from handlers.gc import GC
 from handlers.nextpatch import NextPatch
@@ -69,6 +70,7 @@ routes = [
     ('/update-status', UpdateStatus),
     ('/update-work-items', UpdateWorkItems),
     ('/update-svn-revision', UpdateSVNRevision),
+    ('/active-bots', ActiveBots),
 ]
 
 application = webapp.WSGIApplication(routes, debug=True)
index 7b4f857..12cf28b 100644 (file)
@@ -101,3 +101,27 @@ tr:hover, li:hover {
   cursor: pointer;
   /* border: 1px solid #ACA0B3; */
 }
+.queue_bubble {
+    border: 1px solid black;
+    margin-bottom: 10px;
+    border-radius: 10px;
+    padding: 5px;
+}
+.queue_name {
+    float:left;
+}
+.last_heard_from {
+    float: right;
+}
+.status_text {
+    clear: both;
+}
+.alive {
+    background-color: #8FDF5F;
+}
+.behind {
+    background-color: #FFFC6C;
+}
+.dead {
+    background-color: #E98080;
+}
\ No newline at end of file
diff --git a/Tools/QueueStatusServer/templates/activebots.html b/Tools/QueueStatusServer/templates/activebots.html
new file mode 100644 (file)
index 0000000..d47f45d
--- /dev/null
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>WebKit Queue Status</title>
+<link type="text/css" rel="stylesheet" href="/stylesheets/dashboard.css" />
+<style>
+/* Override the generic table styles from dashboard.css */
+td {
+  text-align: left;
+}
+</style>
+</head>
+<body>
+<h1>WebKit Queue Status</h1>
+<table>
+    <thead>
+        <tr>
+            <th>Bot</th><th>Queue</th><th>Last Message</th><th>Time</th>
+        </tr>
+    </thead>
+    <tbody>
+        {% for status in last_statuses %}
+        <tr>
+            <td><a href="/queue-status/{{status.queue_name}}/bots/{{status.bot_id}}">{{ status.bot_id }}</a></td>
+            <td><a href="/queue-status/{{status.queue_name}}">{{ status.queue_name }}</a></td>
+            <td>{{ status.message|force_escape|urlize|webkit_linkify|safe }}</td>
+            <td>{{ status.date|timesince }} ago</td>
+        </tr>
+        {% endfor %}
+    </tbody>
+</table>
+</body>
+</html>
index f88a5ea..3a4df49 100644 (file)
@@ -13,7 +13,7 @@ function statusDetail(patch_id) {
 <body>
 <h1>WebKit Bot Status</h1>
 <table>
-  <theader>
+  <thead>
     <tr>
       <th>Bug</th>
       <th>Attachment</th>
index 808d8d7..2c72223 100644 (file)
@@ -3,32 +3,6 @@
 <head>
 <title>WebKit Queue Status</title>
 <link type="text/css" rel="stylesheet" href="/stylesheets/dashboard.css" />
-<style>
-.queue_bubble {
-    border: 1px solid black;
-    margin-bottom: 10px;
-    border-radius: 10px;
-    padding: 5px;
-}
-.queue_name {
-    float:left;
-}
-.last_heard_from {
-    float: right;
-}
-.status_text {
-    clear: both;
-}
-.alive {
-    background-color: #8FDF5F;
-}
-.behind {
-    background-color: #FFFC6C;
-}
-.dead {
-    background-color: #E98080;
-}
-</style>
 </head>
 <body>
 <h1>WebKit Queue Status</h1>
@@ -50,5 +24,6 @@
     </div>
 </div>
 {% endfor %}
+<a href='/active-bots'>List of all active bots</a>
 </body>
 </html>