Merge pull request #687 from alphagov/add-failure-rate-to-jobs

Highlight failing jobs on the dashboard
This commit is contained in:
Chris Hill-Scott
2016-06-16 09:13:33 +01:00
committed by GitHub
5 changed files with 46 additions and 6 deletions

View File

@@ -19,7 +19,7 @@ from app import (
service_api_client, service_api_client,
template_statistics_client template_statistics_client
) )
from app.statistics_utils import sum_of_statistics, add_rates_to from app.statistics_utils import sum_of_statistics, add_rates_to, add_rate_to_jobs
from app.utils import user_has_permissions from app.utils import user_has_permissions
@@ -169,5 +169,5 @@ def get_dashboard_statistics_for_service(service_id):
'sms_allowance_remaining': max(0, (sms_free_allowance - sms_sent)), 'sms_allowance_remaining': max(0, (sms_free_allowance - sms_sent)),
'sms_chargeable': max(0, sms_sent - sms_free_allowance), 'sms_chargeable': max(0, sms_sent - sms_free_allowance),
'sms_rate': sms_rate, 'sms_rate': sms_rate,
'jobs': job_api_client.get_job(service_id, limit_days=7)['data'] 'jobs': add_rate_to_jobs(job_api_client.get_job(service_id, limit_days=7)['data'])
} }

View File

@@ -69,3 +69,21 @@ def statistics_by_state(statistics):
'failed': statistics['emails_failed'] 'failed': statistics['emails_failed']
} }
} }
def get_failure_rate_for_job(job):
if not job.get('notifications_delivered'):
if job.get('notifications_failed'):
return 1
return 0
return (
job.get('notifications_failed', 0) /
(job.get('notifications_failed', 0) + job.get('notifications_delivered', 0))
)
def add_rate_to_jobs(jobs):
return [dict(
**job,
failure_rate=(get_failure_rate_for_job(job)) * 100
) for job in jobs]

View File

@@ -19,7 +19,7 @@
<div class="file-list"> <div class="file-list">
<a class="file-list-filename" href="{{ url_for('.view_job', service_id=current_service.id, job_id=item.id) }}">{{ item.original_file_name }}</a> <a class="file-list-filename" href="{{ url_for('.view_job', service_id=current_service.id, job_id=item.id) }}">{{ item.original_file_name }}</a>
<span class="file-list-hint">Uploaded {{ item.created_at|format_datetime_short }}</span> <span class="file-list-hint">Uploaded {{ item.created_at|format_datetime_short }}</span>
</div </div>
{% endcall %} {% endcall %}
{% call field() %} {% call field() %}
{{ big_number( {{ big_number(
@@ -30,7 +30,7 @@
{% call field() %} {% call field() %}
{{ big_number(item.get('notifications_delivered', 0), smallest=True) }} {{ big_number(item.get('notifications_delivered', 0), smallest=True) }}
{% endcall %} {% endcall %}
{% call field(status='error' if 0 else '') %} {% call field(status='error' if item.get('failure_rate', 0) > 3 else '') %}
{{ big_number(item.get('notifications_failed', 0), smallest=True) }} {{ big_number(item.get('notifications_failed', 0), smallest=True) }}
{% endcall %} {% endcall %}
{% endcall %} {% endcall %}

View File

@@ -1,6 +1,6 @@
import pytest import pytest
from app.statistics_utils import sum_of_statistics, add_rates_to, statistics_by_state from app.statistics_utils import sum_of_statistics, add_rates_to, add_rate_to_jobs, statistics_by_state
@pytest.mark.parametrize('delivery_statistics', [ @pytest.mark.parametrize('delivery_statistics', [
@@ -113,3 +113,25 @@ def test_service_statistics_by_state():
assert resp[message_type]['sending'] == 1 assert resp[message_type]['sending'] == 1
assert resp[message_type]['delivered'] == 1 assert resp[message_type]['delivered'] == 1
assert resp[message_type]['failed'] == 1 assert resp[message_type]['failed'] == 1
@pytest.mark.parametrize('failed, delivered, expected_failure_rate', [
(0, 0, 0),
(0, 1, 0),
(1, 0, 100),
(1, 4, 20)
])
def test_add_rate_to_jobs(failed, delivered, expected_failure_rate):
resp = add_rate_to_jobs([
{
'notifications_failed': failed,
'notifications_delivered': delivered
},
{
'notifications_failed': 1,
'notifications_delivered': 1
}
])
assert resp[0]['failure_rate'] == expected_failure_rate
assert resp[1]['failure_rate'] == 50