diff --git a/searx/metrics/__init__.py b/searx/metrics/__init__.py index c2dcfaae..2ef73149 100644 --- a/searx/metrics/__init__.py +++ b/searx/metrics/__init__.py @@ -156,57 +156,76 @@ def get_reliabilities(engline_name_list, checker_results): return reliabilities -def round_or_none(number, digits): - return round(number, digits) if number else number - - def get_engines_stats(engine_name_list): assert counter_storage is not None assert histogram_storage is not None list_time = [] + max_time_total = max_result_count = None - max_time_total = max_result_count = None # noqa for engine_name in engine_name_list: + sent_count = counter('engine', engine_name, 'search', 'count', 'sent') if sent_count == 0: continue - successful_count = counter('engine', engine_name, 'search', 'count', 'successful') - - 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 = histogram('engine', engine_name, 'result', 'count').percentage(50) result_count_sum = histogram('engine', engine_name, 'result', 'count').sum - if successful_count and result_count_sum: - score = counter('engine', engine_name, 'score') # noqa - score_per_result = score / float(result_count_sum) - else: - score = score_per_result = 0.0 + successful_count = counter('engine', engine_name, 'search', 'count', 'successful') + time_total = histogram('engine', engine_name, 'time', 'total').percentage(50) max_time_total = max(time_total or 0, max_time_total or 0) max_result_count = max(result_count or 0, max_result_count or 0) - list_time.append({ + stats = { 'name': engine_name, - 'total': round_or_none(time_total, 1), - 'total_p80': round_or_none(time_total_p80, 1), - 'total_p95': round_or_none(time_total_p95, 1), - 'http': round_or_none(time_http, 1), - 'http_p80': round_or_none(time_http_p80, 1), - 'http_p95': round_or_none(time_http_p95, 1), - 'processing': round(time_total - time_http, 1) if time_total else None, - 'processing_p80': round(time_total_p80 - time_http_p80, 1) if time_total else None, - 'processing_p95': round(time_total_p95 - time_http_p95, 1) if time_total else None, - 'score': score, - 'score_per_result': score_per_result, + 'total': None, + 'total_p80': None, + 'total_p95': None, + 'http': None, + 'http_p80': None, + 'http_p95': None, + 'processing': None, + 'processing_p80': None, + 'processing_p95': None, + 'score': 0, + 'score_per_result': 0, 'result_count': result_count, - }) + } + + if successful_count and result_count_sum: + score = counter('engine', engine_name, 'score') + + stats['score'] = score + stats['score_per_result'] = score / float(result_count_sum) + + time_http = histogram('engine', engine_name, 'time', 'http').percentage(50) + time_http_p80 = time_http_p95 = 0 + + if time_http is not None: + + time_http_p80 = histogram('engine', engine_name, 'time', 'http').percentage(80) + time_http_p95 = histogram('engine', engine_name, 'time', 'http').percentage(95) + + stats['http'] = round(time_http, 1) + stats['http_p80'] = round(time_http_p80, 1) + stats['http_p95'] = round(time_http_p95, 1) + + if time_total is not None: + + time_total_p80 = histogram('engine', engine_name, 'time', 'total').percentage(80) + time_total_p95 = histogram('engine', engine_name, 'time', 'total').percentage(95) + + stats['total'] = round(time_total, 1) + stats['total_p80'] = round(time_total_p80, 1) + stats['total_p95'] = round(time_total_p95, 1) + + stats['processing'] = round(time_total - (time_http or 0), 1) + stats['processing_p80'] = round(time_total_p80 - time_http_p80, 1) + stats['processing_p95'] = round(time_total_p95 - time_http_p95, 1) + + list_time.append(stats) + return { 'time': list_time, 'max_time': math.ceil(max_time_total or 0), diff --git a/searx/network/__init__.py b/searx/network/__init__.py index 981b2261..58719814 100644 --- a/searx/network/__init__.py +++ b/searx/network/__init__.py @@ -44,7 +44,8 @@ def reset_time_for_thread(): def get_time_for_thread(): - return THREADLOCAL.total_time + """returns thread's total time or None""" + return THREADLOCAL.__dict__.get('total_time') def set_timeout_for_thread(timeout, start_time=None): @@ -57,10 +58,11 @@ def set_context_network_name(network_name): def get_context_network(): - try: - return THREADLOCAL.network - except AttributeError: - return get_network() + """If set return thread's network. + + If unset, return value from :py:obj:`get_network`. + """ + return THREADLOCAL.__dict__.get('network') or get_network() def request(method, url, **kwargs): diff --git a/searx/results.py b/searx/results.py index a1c1d852..d0cb4df3 100644 --- a/searx/results.py +++ b/searx/results.py @@ -371,11 +371,12 @@ class ResultContainer: self.unresponsive_engines.add((engine_name, error_type, error_message, suspended)) def add_timing(self, engine_name, engine_time, page_load_time): - self.timings.append({ + timing = { 'engine': engines[engine_name].shortcut, 'total': engine_time, - 'load': page_load_time - }) + 'load': page_load_time, + } + self.timings.append(timing) def get_timings(self): return self.timings diff --git a/searx/templates/oscar/preferences.html b/searx/templates/oscar/preferences.html index 33fb4106..352b90ee 100644 --- a/searx/templates/oscar/preferences.html +++ b/searx/templates/oscar/preferences.html @@ -25,11 +25,13 @@ {{- "" -}} {%- if stats[engine_name].time != None -%} {{- stats[engine_name].time -}}{{- "" -}} -