diff --git a/src/pretix/base/metrics.py b/src/pretix/base/metrics.py index 972a18462f..476cdf9e69 100755 --- a/src/pretix/base/metrics.py +++ b/src/pretix/base/metrics.py @@ -210,5 +210,9 @@ Provided metrics """ http_view_requests = Counter("http_view_requests", "Total number of HTTP requests made.", ["status_code", "method", "url_name"]) +http_view_times = Histogram("http_view_times", "Return time of views.", + ["status_code", "method", "url_name"]) celery_task_runs = Counter("celery_task_runs", "Total calls to a celery task", ["task_name", "status"]) +celery_task_times = Histogram("celery_task_times", "Call time of a celery task", + ["task_name"]) diff --git a/src/pretix/base/services/async.py b/src/pretix/base/services/async.py index f48dbf4e6c..0331cea84b 100644 --- a/src/pretix/base/services/async.py +++ b/src/pretix/base/services/async.py @@ -15,25 +15,31 @@ import time from django.conf import settings from django.db import transaction -from pretix.base.metrics import celery_task_runs +from pretix.base.metrics import celery_task_runs, celery_task_times from pretix.celery_app import app class ProfiledTask(app.Task): def __call__(self, *args, **kwargs): + if settings.PROFILING_RATE > 0 and random.random() < settings.PROFILING_RATE / 100: profiler = cProfile.Profile() profiler.enable() - starttime = time.time() + t0 = time.perf_counter() ret = super().__call__(*args, **kwargs) + tottime = time.perf_counter() - t0 profiler.disable() - tottime = time.time() - starttime profiler.dump_stats(os.path.join(settings.PROFILE_DIR, '{time:.0f}_{tottime:.3f}_celery_{t}.pstat'.format( t=self.name, tottime=tottime, time=time.time() ))) - return ret else: - return super().__call__(*args, **kwargs) + t0 = time.perf_counter() + ret = super().__call__(*args, **kwargs) + tottime = time.perf_counter() - t0 + + if settings.METRICS_ENABLED: + celery_task_times.observe(tottime, task_name=self.name) + return ret def on_failure(self, exc, task_id, args, kwargs, einfo): if settings.METRICS_ENABLED: diff --git a/src/pretix/base/services/cart.py b/src/pretix/base/services/cart.py index 6a449fc362..7b55894631 100644 --- a/src/pretix/base/services/cart.py +++ b/src/pretix/base/services/cart.py @@ -1,7 +1,6 @@ from collections import Counter, namedtuple from datetime import timedelta from decimal import Decimal - from typing import List, Optional from celery.exceptions import MaxRetriesExceededError diff --git a/src/pretix/control/context.py b/src/pretix/control/context.py index 0a8a9014e4..d7edd15dd6 100644 --- a/src/pretix/control/context.py +++ b/src/pretix/control/context.py @@ -1,4 +1,5 @@ import sys + from django.conf import settings from django.core.urlresolvers import Resolver404, get_script_prefix, resolve diff --git a/src/pretix/helpers/metrics/middleware.py b/src/pretix/helpers/metrics/middleware.py index 09d0a7bc3e..9eb3105bef 100644 --- a/src/pretix/helpers/metrics/middleware.py +++ b/src/pretix/helpers/metrics/middleware.py @@ -1,6 +1,8 @@ +import time + from django.urls import resolve -from pretix.base.metrics import http_view_requests +from pretix.base.metrics import http_view_requests, http_view_times class MetricsMiddleware(object): @@ -23,8 +25,12 @@ class MetricsMiddleware(object): url = resolve(request.path_info) + t0 = time.perf_counter() resp = self.get_response(request) + tdiff = time.perf_counter() - t0 http_view_requests.inc(1, status_code=resp.status_code, method=request.method, url_name=url.namespace + ':' + url.url_name) + http_view_times.observe(tdiff, status_code=resp.status_code, method=request.method, + url_name=url.namespace + ':' + url.url_name) return resp diff --git a/src/pretix/helpers/profile/middleware.py b/src/pretix/helpers/profile/middleware.py index 1084773287..5ee0958aaa 100644 --- a/src/pretix/helpers/profile/middleware.py +++ b/src/pretix/helpers/profile/middleware.py @@ -26,10 +26,10 @@ class CProfileMiddleware(object): if settings.PROFILING_RATE > 0 and random.random() < settings.PROFILING_RATE / 100: profiler = cProfile.Profile() profiler.enable() - starttime = time.time() + starttime = time.perf_counter() response = self.get_response(request) profiler.disable() - tottime = time.time() - starttime + tottime = time.perf_counter() - starttime profiler.dump_stats(os.path.join(settings.PROFILE_DIR, '{time:.0f}_{tottime:.3f}_{path}.pstat'.format( path=request.path[1:].replace("/", "_"), tottime=tottime, time=time.time() ))) diff --git a/src/tests/plugins/test_sendmail.py b/src/tests/plugins/test_sendmail.py index f93c06bb1b..3467dd695c 100644 --- a/src/tests/plugins/test_sendmail.py +++ b/src/tests/plugins/test_sendmail.py @@ -1,7 +1,6 @@ import datetime import pytest - from django.core import mail as djmail from django.utils.timezone import now