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 09c5b33..0031d83 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 cdb705b..0463247 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 8dbecc0..1111d04 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 @@ 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 @@

    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 @@ Country Error Message Last Occurred - Occurrences (last 24 hours) + Occurrences (last {{ cutoff|hours }}) @@ -96,12 +99,46 @@ {% load cdn %}{% jquery %} diff --git a/templates/mirrors/status_table.html b/templates/mirrors/status_table.html index 7515776..240a545 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-24-g4f1b