diff --git a/searx/metrics/__init__.py b/searx/metrics/__init__.py index bae62c915..063554f1a 100644 --- a/searx/metrics/__init__.py +++ b/searx/metrics/__init__.py @@ -135,27 +135,13 @@ def to_percentage(stats, maxvalue): def get_engines_stats(engine_list): - global counter_storage, histogram_storage - assert counter_storage is not None assert histogram_storage is not None list_time = [] - list_time_http = [] - list_time_total = [] - list_result_count = [] - list_error_count = [] - list_scores = [] - list_scores_per_result = [] - max_error_count = max_http_time = max_time_total = max_result_count = max_score = None # noqa + max_time_total = max_result_count = None # noqa for engine_name in engine_list: - error_count = counter('engine', engine_name, 'search', 'count', 'error') - - if counter('engine', engine_name, 'search', 'count', 'sent') > 0: - list_error_count.append({'avg': error_count, 'name': engine_name}) - max_error_count = max(error_count, max_error_count or 0) - successful_count = counter('engine', engine_name, 'search', 'count', 'successful') if successful_count == 0: continue @@ -163,6 +149,10 @@ def get_engines_stats(engine_list): result_count_sum = histogram('engine', engine_name, 'result', 'count').sum time_total = histogram('engine', engine_name, 'time', 'total').percentage(50) time_http = histogram('engine', engine_name, 'time', 'http').percentage(50) + time_total_p80 = histogram('engine', engine_name, 'time', 'total').percentage(80) + time_http_p80 = histogram('engine', engine_name, 'time', 'http').percentage(80) + time_total_p95 = histogram('engine', engine_name, 'time', 'total').percentage(95) + time_http_p95 = histogram('engine', engine_name, 'time', 'http').percentage(95) result_count = result_count_sum / float(successful_count) if result_count: @@ -172,35 +162,25 @@ def get_engines_stats(engine_list): score = score_per_result = 0.0 max_time_total = max(time_total, max_time_total or 0) - max_http_time = max(time_http, max_http_time or 0) max_result_count = max(result_count, max_result_count or 0) - max_score = max(score, max_score or 0) list_time.append({'total': round(time_total, 1), + 'total_p80': round(time_total_p80, 1), + 'total_p95': round(time_total_p95, 1), 'http': round(time_http, 1), + 'http_p80': round(time_http_p80, 1), + 'http_p95': round(time_http_p95, 1), 'name': engine_name, - 'processing': round(time_total - time_http, 1)}) - list_time_total.append({'avg': time_total, 'name': engine_name}) - list_time_http.append({'avg': time_http, 'name': engine_name}) - list_result_count.append({'avg': result_count, 'name': engine_name}) - list_scores.append({'avg': score, 'name': engine_name}) - list_scores_per_result.append({'avg': score_per_result, 'name': engine_name}) - - list_time = sorted(list_time, key=itemgetter('total')) - list_time_total = sorted(to_percentage(list_time_total, max_time_total), key=itemgetter('avg')) - list_time_http = sorted(to_percentage(list_time_http, max_http_time), key=itemgetter('avg')) - list_result_count = sorted(to_percentage(list_result_count, max_result_count), key=itemgetter('avg'), reverse=True) - list_scores = sorted(list_scores, key=itemgetter('avg'), reverse=True) - list_scores_per_result = sorted(list_scores_per_result, key=itemgetter('avg'), reverse=True) - list_error_count = sorted(to_percentage(list_error_count, max_error_count), key=itemgetter('avg'), reverse=True) + 'processing': round(time_total - time_http, 1), + 'processing_p80': round(time_total_p80 - time_http_p80, 1), + 'processing_p95': round(time_total_p95 - time_http_p95, 1), + 'score': score, + 'score_per_result': score_per_result, + 'result_count': result_count, + }) return { 'time': list_time, 'max_time': math.ceil(max_time_total or 0), - 'time_total': list_time_total, - 'time_http': list_time_http, - 'result_count': list_result_count, - 'scores': list_scores, - 'scores_per_result': list_scores_per_result, - 'error_count': list_error_count, + 'max_result_count': math.ceil(max_result_count or 0), } diff --git a/searx/static/themes/oscar/css/logicodev-dark.css b/searx/static/themes/oscar/css/logicodev-dark.css index 618de9327..f9cdc41f6 100644 --- a/searx/static/themes/oscar/css/logicodev-dark.css +++ b/searx/static/themes/oscar/css/logicodev-dark.css @@ -998,3 +998,21 @@ th:hover .engine-tooltip, padding: 0.4rem 0; width: 1px; } +.stacked-bar-chart-serie1 { + display: flex; + flex-shrink: 0; + flex-grow: 0; + flex-basis: unset; + background: #5bc0de; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + padding: 0.4rem 0; +} +.stacked-bar-chart-serie2 { + display: flex; + flex-shrink: 0; + flex-grow: 0; + flex-basis: unset; + background: #deb15b; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + padding: 0.4rem 0; +} diff --git a/searx/static/themes/oscar/css/logicodev-dark.min.css b/searx/static/themes/oscar/css/logicodev-dark.min.css index 09aed0298..e34b34480 100644 Binary files a/searx/static/themes/oscar/css/logicodev-dark.min.css and b/searx/static/themes/oscar/css/logicodev-dark.min.css differ diff --git a/searx/static/themes/oscar/css/logicodev-dark.min.css.map b/searx/static/themes/oscar/css/logicodev-dark.min.css.map index 71062db2e..fdaf8d8f4 100644 Binary files a/searx/static/themes/oscar/css/logicodev-dark.min.css.map and b/searx/static/themes/oscar/css/logicodev-dark.min.css.map differ diff --git a/searx/static/themes/oscar/css/logicodev.css b/searx/static/themes/oscar/css/logicodev.css index 4f6b36b11..40256101a 100644 --- a/searx/static/themes/oscar/css/logicodev.css +++ b/searx/static/themes/oscar/css/logicodev.css @@ -971,6 +971,24 @@ th:hover .engine-tooltip, padding: 0.4rem 0; width: 1px; } +.stacked-bar-chart-serie1 { + display: flex; + flex-shrink: 0; + flex-grow: 0; + flex-basis: unset; + background: #5bc0de; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + padding: 0.4rem 0; +} +.stacked-bar-chart-serie2 { + display: flex; + flex-shrink: 0; + flex-grow: 0; + flex-basis: unset; + background: #deb15b; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + padding: 0.4rem 0; +} /*Global*/ body { background: #1d1f21 none !important; diff --git a/searx/static/themes/oscar/css/logicodev.min.css b/searx/static/themes/oscar/css/logicodev.min.css index db035aa75..3daa9595d 100644 Binary files a/searx/static/themes/oscar/css/logicodev.min.css and b/searx/static/themes/oscar/css/logicodev.min.css differ diff --git a/searx/static/themes/oscar/css/logicodev.min.css.map b/searx/static/themes/oscar/css/logicodev.min.css.map index 50598d2ef..bc97c8bc8 100644 Binary files a/searx/static/themes/oscar/css/logicodev.min.css.map and b/searx/static/themes/oscar/css/logicodev.min.css.map differ diff --git a/searx/static/themes/oscar/js/searx.min.js b/searx/static/themes/oscar/js/searx.min.js index b31aad6f0..ad36c8e06 100644 Binary files a/searx/static/themes/oscar/js/searx.min.js and b/searx/static/themes/oscar/js/searx.min.js differ diff --git a/searx/static/themes/oscar/src/less/logicodev/preferences.less b/searx/static/themes/oscar/src/less/logicodev/preferences.less index 32e230413..790ed10b7 100644 --- a/searx/static/themes/oscar/src/less/logicodev/preferences.less +++ b/searx/static/themes/oscar/src/less/logicodev/preferences.less @@ -89,3 +89,17 @@ td:hover .engine-tooltip, th:hover .engine-tooltip, .engine-tooltip:hover { padding: 0.4rem 0; width: 1px; } + +.stacked-bar-chart-serie1 { + .stacked-bar-chart-base(); + background: #5bc0de; + box-shadow: inset 0 -1px 0 rgba(0,0,0,.15); + padding: 0.4rem 0; +} + +.stacked-bar-chart-serie2 { + .stacked-bar-chart-base(); + background: #deb15b; + box-shadow: inset 0 -1px 0 rgba(0,0,0,.15); + padding: 0.4rem 0; +} diff --git a/searx/templates/oscar/stats.html b/searx/templates/oscar/stats.html index 0573bf65f..0851343ce 100644 --- a/searx/templates/oscar/stats.html +++ b/searx/templates/oscar/stats.html @@ -16,30 +16,76 @@

{{ _('Engine stats') }}

- {% for stat_name,stat_category in stats %} -
-

{{ stat_name }}

-
- {% for engine in stat_category %} -
-
{{ engine.name }}
-
-
-
- {{ '%.02f'|format(engine.avg) }} -
-
+
+
+ {% if not engine_stats.get('time') %} +
+ {% include 'oscar/messages/no_data_available.html' %}
-
- {% endfor %} - {% if not stat_category %} -
- {% include 'oscar/messages/no_data_available.html' %} -
+ {% else %} + + + + + + + + {% for engine_stat in engine_stats.get('time', []) %} + + + + + + + {% endfor %} +
{{ _("Engine name") }}{{ _('Scores') }}{{ _('Number of results') }}{{ _('Response time') }}
{{ engine_stat.name }} + {{ engine_stat.score|round(1) }} + + + {{- engine_stat.result_count | int -}}{{- "" -}} + {{- "" -}} + + {{- engine_stat.total | round(1) -}}{{- "" -}} + {{- "" -}} + +
{% endif %}
- {% endfor %}
{% endblock %} diff --git a/searx/webapp.py b/searx/webapp.py index d02e142fc..d2a1ad5f5 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -1077,12 +1077,7 @@ def stats(): engine_stats = get_engines_stats(filtered_engines) return render( 'stats.html', - stats=[(gettext('Engine time (sec)'), engine_stats['time_total']), - (gettext('Page loads (sec)'), engine_stats['time_http']), - (gettext('Number of results'), engine_stats['result_count']), - (gettext('Scores'), engine_stats['scores']), - (gettext('Scores per result'), engine_stats['scores_per_result']), - (gettext('Errors'), engine_stats['error_count'])] + engine_stats=engine_stats )