summaryrefslogtreecommitdiffstats
path: root/Tools/QueueStatusServer
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-06-02 12:07:03 +0100
committerBen Murdoch <benm@google.com>2011-06-10 10:47:21 +0100
commit2daae5fd11344eaa88a0d92b0f6d65f8d2255c00 (patch)
treee4964fbd1cb70599f7718ff03e50ea1dab33890b /Tools/QueueStatusServer
parent87bdf0060a247bfbe668342b87e0874182e0ffa9 (diff)
downloadexternal_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.zip
external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.gz
external_webkit-2daae5fd11344eaa88a0d92b0f6d65f8d2255c00.tar.bz2
Merge WebKit at r84325: Initial merge by git.
Change-Id: Ic1a909300ecc0a13ddc6b4e784371d2ac6e3d59b
Diffstat (limited to 'Tools/QueueStatusServer')
-rw-r--r--Tools/QueueStatusServer/handlers/queuestatus.py25
-rw-r--r--Tools/QueueStatusServer/index.yaml21
-rw-r--r--Tools/QueueStatusServer/model/activeworkitems.py8
-rw-r--r--Tools/QueueStatusServer/model/activeworkitems_unittest.py (renamed from Tools/QueueStatusServer/model/activeworkitems_unitest.py)24
-rw-r--r--Tools/QueueStatusServer/model/queues.py6
-rw-r--r--Tools/QueueStatusServer/model/workitems.py8
-rw-r--r--Tools/QueueStatusServer/templates/queuestatus.html16
7 files changed, 97 insertions, 11 deletions
diff --git a/Tools/QueueStatusServer/handlers/queuestatus.py b/Tools/QueueStatusServer/handlers/queuestatus.py
index e5dc95f..9eaef6f 100644
--- a/Tools/QueueStatusServer/handlers/queuestatus.py
+++ b/Tools/QueueStatusServer/handlers/queuestatus.py
@@ -26,6 +26,7 @@
# (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
from google.appengine.ext import webapp
@@ -58,11 +59,29 @@ class QueueStatus(webapp.RequestHandler):
def _fetch_statuses(self, queue, bot_id):
statuses = queuestatus.QueueStatus.all()
- statuses = statuses.filter("queue_name =", queue.name())
+ statuses.filter("queue_name =", queue.name())
if bot_id:
statuses.filter("bot_id =", bot_id)
return statuses.order("-date").fetch(15)
+ def _fetch_last_message_matching(self, queue, bot_id, message):
+ statuses = queuestatus.QueueStatus.all()
+ statuses.filter("queue_name =", queue.name())
+ if bot_id:
+ statuses.filter("bot_id =", bot_id)
+ statuses.filter("message =", message)
+ return statuses.order("-date").get()
+
+ def _fetch_trailing_days_pass_count(self, queue, bot_id, days):
+ statuses = queuestatus.QueueStatus.all()
+ statuses.filter("queue_name =", queue.name())
+ days_ago = datetime.datetime.now() - datetime.timedelta(days=days)
+ statuses.filter("date >", days_ago)
+ if bot_id:
+ statuses.filter("bot_id =", bot_id)
+ statuses.filter("message =", "Pass")
+ return statuses.count()
+
def _page_title(self, queue, bot_id):
title = "%s Messages" % queue.display_name()
if bot_id:
@@ -82,5 +101,9 @@ class QueueStatus(webapp.RequestHandler):
"work_item_rows": self._rows_for_work_items(queue),
"status_groups": self._build_status_groups(statuses),
"bot_id": bot_id,
+ "last_pass": self._fetch_last_message_matching(queue, bot_id, "Pass"),
+ "last_boot": self._fetch_last_message_matching(queue, bot_id, "Starting Queue"),
+ "trailing_month_pass_count": self._fetch_trailing_days_pass_count(queue, bot_id, 30),
+ "trailing_week_pass_count": self._fetch_trailing_days_pass_count(queue, bot_id, 7),
}
self.response.out.write(template.render("templates/queuestatus.html", template_values))
diff --git a/Tools/QueueStatusServer/index.yaml b/Tools/QueueStatusServer/index.yaml
index 9724760..34eb72e 100644
--- a/Tools/QueueStatusServer/index.yaml
+++ b/Tools/QueueStatusServer/index.yaml
@@ -26,6 +26,27 @@ indexes:
- kind: QueueStatus
properties:
- name: bot_id
+ - name: message
+ - name: queue_name
+ - name: date
+ direction: desc
+
+- kind: QueueStatus
+ properties:
+ - name: bot_id
+ - name: queue_name
+ - name: date
+ direction: desc
+
+- kind: QueueStatus
+ properties:
+ - name: message
+ - name: queue_name
+ - name: date
+
+- kind: QueueStatus
+ properties:
+ - name: message
- name: queue_name
- name: date
direction: desc
diff --git a/Tools/QueueStatusServer/model/activeworkitems.py b/Tools/QueueStatusServer/model/activeworkitems.py
index ab5d7a6..023258a 100644
--- a/Tools/QueueStatusServer/model/activeworkitems.py
+++ b/Tools/QueueStatusServer/model/activeworkitems.py
@@ -61,6 +61,14 @@ class ActiveWorkItems(db.Model, QueuePropertyMixin):
nonexpired_pairs = [pair for pair in self._item_time_pairs() if pair[0] != item_id]
self._set_item_time_pairs(nonexpired_pairs)
+ @classmethod
+ def key_for_queue(cls, queue_name):
+ return "active-work-items-%s" % (queue_name)
+
+ @classmethod
+ def lookup_by_queue(cls, queue_name):
+ return cls.get_or_insert(key_name=cls.key_for_queue(queue_name), queue_name=queue_name)
+
@staticmethod
def _expire_item(key, item_id):
active_work_items = db.get(key)
diff --git a/Tools/QueueStatusServer/model/activeworkitems_unitest.py b/Tools/QueueStatusServer/model/activeworkitems_unittest.py
index 6d915a1..b8c620a 100644
--- a/Tools/QueueStatusServer/model/activeworkitems_unitest.py
+++ b/Tools/QueueStatusServer/model/activeworkitems_unittest.py
@@ -28,15 +28,27 @@
import unittest
from datetime import datetime
+from google.appengine.ext import testbed
from model.activeworkitems import ActiveWorkItems
class ActiveWorkItemsTest(unittest.TestCase):
+
+ def setUp(self):
+ self.testbed = testbed.Testbed()
+ self.testbed.activate()
+ self.testbed.init_datastore_v3_stub()
+ self.testbed.init_memcache_stub()
+
+ def tearDown(self):
+ self.testbed.deactivate()
+
def test_basic(self):
- items = ActiveWorkItems()
+ items = ActiveWorkItems.lookup_by_queue("test-queue")
queued_items = [1, 2]
- time = datetime.now()
+ # db.Model only stores dates to second resolution, so we use an explicit datetime without milliseconds.
+ time = datetime(2011, 4, 18, 18, 50, 44)
self.assertEqual(items.next_item(queued_items, time), 1)
self.assertEqual(items.next_item([1], time), None)
self.assertEqual(items.next_item([], time), None)
@@ -45,8 +57,8 @@ class ActiveWorkItemsTest(unittest.TestCase):
self.assertEqual(items.time_for_item(2), None)
items.expire_item(1)
+ # expire_item uses a transaction so it doesn't take effect on the current object.
+ self.assertEqual(items.time_for_item(1), time)
+ # If we look up the saved object, we see it's been updated.
+ items = ActiveWorkItems.lookup_by_queue("test-queue")
self.assertEqual(items.time_for_item(1), None)
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/Tools/QueueStatusServer/model/queues.py b/Tools/QueueStatusServer/model/queues.py
index 1d46f89..bd5e7ed 100644
--- a/Tools/QueueStatusServer/model/queues.py
+++ b/Tools/QueueStatusServer/model/queues.py
@@ -70,13 +70,11 @@ class Queue(object):
return self._name
def work_items(self):
- key_name = "work-items-%s" % (self._name)
- return WorkItems.get_or_insert(key_name=key_name, queue_name=self._name)
+ return WorkItems.lookup_by_queue(self._name)
# FIXME: active_work_items is a bad name for this lock-table.
def active_work_items(self):
- key_name = "active-work-items-%s" % (self._name)
- return ActiveWorkItems.get_or_insert(key_name=key_name, queue_name=self._name)
+ return ActiveWorkItems.lookup_by_queue(self._name)
def _caplitalize_after_dash(self, string):
return "-".join([word[0].upper() + word[1:] for word in string.split("-")])
diff --git a/Tools/QueueStatusServer/model/workitems.py b/Tools/QueueStatusServer/model/workitems.py
index 772fc39..b74f5f5 100644
--- a/Tools/QueueStatusServer/model/workitems.py
+++ b/Tools/QueueStatusServer/model/workitems.py
@@ -36,6 +36,14 @@ class WorkItems(db.Model, QueuePropertyMixin):
item_ids = db.ListProperty(int)
date = db.DateTimeProperty(auto_now_add=True)
+ @classmethod
+ def key_for_queue(cls, queue_name):
+ return "work-items-%s" % (queue_name)
+
+ @classmethod
+ def lookup_by_queue(cls, queue_name):
+ return cls.get_or_insert(key_name=cls.key_for_queue(queue_name), queue_name=queue_name)
+
def display_position_for_attachment(self, attachment_id):
"""Returns a 1-based index corresponding to the position
of the attachment_id in the queue. If the attachment is
diff --git a/Tools/QueueStatusServer/templates/queuestatus.html b/Tools/QueueStatusServer/templates/queuestatus.html
index c68abf1..f5b4523 100644
--- a/Tools/QueueStatusServer/templates/queuestatus.html
+++ b/Tools/QueueStatusServer/templates/queuestatus.html
@@ -7,6 +7,22 @@
<body>
<h1>{{ page_title }}</h1>
+<h3>Summary</h3>
+<div>
+Last Pass: {{ last_pass.date|timesince }} ago
+{% if not bot_id and last_pass.bot_id %}
+by <a href="/queue-status/{{last_pass.queue_name}}/bots/{{last_pass.bot_id}}">{{ last_pass.bot_id }}</a>
+{% endif %}
+</div>
+<div>
+Last Boot: {{ last_boot.date|timesince }} ago
+{% if not bot_id and last_boot.bot_id %}
+by <a href="/queue-status/{{last_boot.queue_name}}/bots/{{last_boot.bot_id}}">{{ last_boot.bot_id }}</a>
+{% endif %}
+</div>
+<div>7-day "Pass" count: {{ trailing_week_pass_count }}</div>
+<div>30-day "Pass" count: {{ trailing_month_pass_count }}</div>
+
<h3>Recent Status</h3>
<div class="status-details">