From 2c1336488059dfc24c34dd11865c713fec252cbc Mon Sep 17 00:00:00 2001
From: Dan McGee
Date: Thu, 30 Sep 2010 12:47:30 -0500
Subject: Mirror status improvements
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Fix sorting issues. '', 'unknown', and '∞' should now always sort after
anything else in the list.
* Add a completion percentage column; this will tell you at a glance if a
mirror is sometimes unresponsive. This should probably be incorporated
into the mirror score.
* Make a few more things dynamic in the template, like the time back the
page reflects.
* Add some additional template tags for formatting things.
Signed-off-by: Dan McGee
---
mirrors/templatetags/mirror_status.py | 25 ++++++++++++++--
mirrors/utils.py | 29 ++++++++++--------
templates/mirrors/status.html | 55 +++++++++++++++++++++++++++++------
templates/mirrors/status_table.html | 6 ++--
4 files changed, 90 insertions(+), 25 deletions(-)
diff --git a/mirrors/templatetags/mirror_status.py b/mirrors/templatetags/mirror_status.py
index 09c5b331..0031d83b 100644
--- a/mirrors/templatetags/mirror_status.py
+++ b/mirrors/templatetags/mirror_status.py
@@ -1,15 +1,36 @@
+from datetime import timedelta
from django import template
+from django.template.defaultfilters import floatformat
register = template.Library()
@register.filter
def duration(value):
- if not value:
- return u'\u221e'
+ if not value and type(value) != timedelta:
+ return u''
# does not take microseconds into account
total_secs = value.seconds + value.days * 24 * 3600
mins, secs = divmod(total_secs, 60)
hrs, mins = divmod(mins, 60)
return '%d:%02d' % (hrs, mins)
+@register.filter
+def hours(value):
+ if not value and type(value) != timedelta:
+ return u''
+ # does not take microseconds into account
+ total_secs = value.seconds + value.days * 24 * 3600
+ mins, secs = divmod(total_secs, 60)
+ hrs, mins = divmod(mins, 60)
+ if hrs == 1:
+ return '%d hour' % hrs
+ return '%d hours' % hrs
+
+@register.filter
+def percentage(value, arg=-1):
+ if not value and type(value) != float:
+ return u''
+ new_val = value * 100.0
+ return floatformat(new_val, arg) + '%'
+
# vim: set ts=4 sw=4 et:
diff --git a/mirrors/utils.py b/mirrors/utils.py
index cdb705b2..0463247a 100644
--- a/mirrors/utils.py
+++ b/mirrors/utils.py
@@ -16,7 +16,9 @@ def get_mirror_statuses(cutoff=default_cutoff):
mirror__active=True, mirror__public=True,
protocol__in=protocols,
logs__check_time__gte=cutoff_time).annotate(
- check_count=Count('logs'), last_sync=Max('logs__last_sync'),
+ check_count=Count('logs'),
+ success_count=Count('logs__duration'),
+ last_sync=Max('logs__last_sync'),
last_check=Max('logs__check_time'),
duration_avg=Avg('logs__duration'),
duration_stddev=StdDev('logs__duration')
@@ -32,17 +34,6 @@ def get_mirror_statuses(cutoff=default_cutoff):
d = log.check_time - log.last_sync
delays.setdefault(log.url_id, []).append(d)
- for url in urls:
- if url.id in delays:
- url_delays = delays[url.id]
- d = sum(url_delays, datetime.timedelta()) / len(url_delays)
- url.delay = d
- hours = d.days * 24.0 + d.seconds / 3600.0
- url.score = hours + url.duration_avg + url.duration_stddev
- else:
- url.delay = None
- url.score = None
-
if urls:
last_check = max([u.last_check for u in urls])
num_checks = max([u.check_count for u in urls])
@@ -55,7 +46,21 @@ def get_mirror_statuses(cutoff=default_cutoff):
num_checks = 0
check_frequency = None
+ for url in urls:
+ url.completion_pct = float(url.success_count) / num_checks
+ if url.id in delays:
+ url_delays = delays[url.id]
+ d = sum(url_delays, datetime.timedelta()) / len(url_delays)
+ url.delay = d
+ hours = d.days * 24.0 + d.seconds / 3600.0
+ url.score = hours + url.duration_avg + url.duration_stddev
+ else:
+ url.delay = None
+ url.score = None
+ url.completion = 0.0
+
return {
+ 'cutoff': cutoff,
'last_check': last_check,
'num_checks': num_checks,
'check_frequency': check_frequency,
diff --git a/templates/mirrors/status.html b/templates/mirrors/status.html
index 8dbecc07..1111d047 100644
--- a/templates/mirrors/status.html
+++ b/templates/mirrors/status.html
@@ -8,7 +8,7 @@
Mirror Status
This page reports the status of all known, public, and active Arch Linux
mirrors. All data on this page reflects the status of the mirrors within
- the last 24 hours. All listed times are UTC. The check script runs
+ the last {{ cutoff|hours }}. All listed times are UTC. The check script runs
on a regular basis and polls for the lastsync file in the root of
our repository layout. This file is regularly updated on the central
repository, so checking the value within allows one to see if the mirror
@@ -21,6 +21,9 @@
Mirror Status
lastsync file on the mirror. If this file could not be
retrieved or contained data we didn't recognize, this column will show
'unknown'.
+ Completion %: The number of mirror checks that have
+ successfully connected and disconnected from the given URL. If this is
+ below 100%, the mirror may be unreliable.
μ Delay: The calculated average mirroring delay; e.g. the
mean value of last check − last sync for each check of
this mirror URL. Due to the timing of mirror checks, any value under
@@ -38,7 +41,7 @@ Mirror Status
The final table on this page is an error log, which shows any errors
that occurred while contacting mirrors. This only shows errors that
- occurred within the last 24 hours.
+ occurred within the last {{ cutoff|hours }}.
The last mirror check ran at {{ last_check|date:'Y-m-d H:i' }} UTC.
- Checks have ran {{ num_checks }} times in the last 24 hours at an average
+ Checks have ran {{ num_checks }} times in the last {{ cutoff|hours }} at an average
interval of {{ check_frequency|duration }} (hh:mm).
@@ -75,7 +78,7 @@ Mirror Syncing Error Log
Country |
Error Message |
Last Occurred |
- Occurrences (last 24 hours) |
+ Occurrences (last {{ cutoff|hours }}) |
@@ -96,12 +99,46 @@ Mirror Syncing Error Log
{% load cdn %}{% jquery %}
diff --git a/templates/mirrors/status_table.html b/templates/mirrors/status_table.html
index 75157765..240a5452 100644
--- a/templates/mirrors/status_table.html
+++ b/templates/mirrors/status_table.html
@@ -6,6 +6,7 @@
Protocol |
Country |
Last Sync |
+ Completion % |
μ Delay (hh:mm) |
μ Duration (secs) |
σ Duration (secs) |
@@ -19,9 +20,10 @@
{{ m_url.protocol }} |
{{ m_url.mirror.country }} |
{{ m_url.last_sync|date:'Y-m-d H:i'|default:'unknown' }} |
+ {{ m_url.completion_pct|percentage:1 }} |
{{ m_url.delay|duration|default:'unknown' }} |
- {{ m_url.duration_avg|floatformat:2|default:'unknown' }} |
- {{ m_url.duration_stddev|floatformat:2|default:'unknown' }} |
+ {{ m_url.duration_avg|floatformat:2 }} |
+ {{ m_url.duration_stddev|floatformat:2 }} |
{{ m_url.score|floatformat:1|default:'∞' }} |
{% endfor %}
--
cgit v1.2.3-54-g00ecf