{% extends "layout.html" %} {% set title = "Usage stats" %} {% block header %} {% endblock %} {% set sample_time = '1H' %} {% set sample_last = 24 %} {% block container %}

Past week

{{ stats('1D', 7) }}

Past 24 hours

{{ stats('1h', 24) }}
{% endblock %} {% macro stats(sample_time, sample_last) %} {% set access_log_trimmed = access_log[pd.Timestamp.now() - pd.Timedelta(sample_time) * sample_last:pd.Timestamp.now()] %} {% set submission_log_trimmed = submission_log[pd.Timestamp.now() - pd.Timedelta(sample_time) * sample_last:pd.Timestamp.now()] %}

Page hits

{{ barplot(access_log['browser_hash'].resample(sample_time).count().tail(sample_last)[::-1], color='primary') }}

Estimated unique visitors

{{ barplot(access_log['browser_hash'].resample(sample_time).nunique().tail(sample_last)[::-1]) }}

Unique page visits

{{ barplot(access_log_trimmed.groupby('endpoint_name')['browser_hash'].nunique()) }}

Total submissions

{{ barplot(submission_log['num_inputs'].resample(sample_time).count().tail(sample_last)[::-1], color='primary', key_width=5) }}

Total sequences

{{ barplot(submission_log['num_inputs'].resample(sample_time).sum().tail(sample_last)[::-1], color='primary', key_width=5) }}

Unique submissions

{{ barplot(submission_log['input_hash'].resample(sample_time).nunique().tail(sample_last)[::-1], key_width=5) }}

Unique submissions by page

{{ barplot(submission_log_trimmed.groupby('endpoint_name')['browser_hash'].nunique()) }}

Avg task duration

{{ barplot(task_log['running_seconds'].resample(sample_time).mean().tail(sample_last)[::-1], color='warning', fmt='{:.1f} seconds') }}

Max task duration

{{ barplot(task_log['running_seconds'].resample(sample_time).max().tail(sample_last)[::-1], color='warning', fmt='{:.1f} seconds') }}

Request errors

{{ barplot(access_log['exception'].dropna().resample(sample_time).count().tail(sample_last)[::-1], color='danger', key_width=5) }}

Last request errors

{% for i, row in access_log[access_log['exception'].isna() == False][::-1].head().iterrows() %}
{{ row.name | naturaltime }}: {{ row['exception'][:50] + ('...' if (row['exception'] | length) > 50 else '') }}
{% endfor %}

Common request errors

{{ barplot(access_log['exception'].str.slice(0, 50).value_counts(), key_width=10, color='danger') }}

Task errors

{{ barplot(task_log['exception'].dropna().resample(sample_time).count().tail(sample_last)[::-1], color='danger', key_width=5) }}

Last task errors

{% for i, row in task_log[task_log['exception'].isna() == False][::-1].head().iterrows() %}
{{ row.name | naturaltime }}: {{ row['exception'][:50] + ('...' if (row['exception'] | length) > 50 else '') }}
{% endfor %}

Common task errors

{{ barplot(task_log['exception'].str.slice(0, 50).value_counts(), key_width=10, color='danger') }}
{% endmacro %} {% macro barplot(series, key_width=4, color='success', fmt='{}') %}
{% for key, value in series.items() %}
{{ fmt.format(value) }}
{{ key | naturaltime }}
{% endfor %}
{% endmacro %}