From f5d7190a51a28c62b824a3982a53f9ef14736b3b Mon Sep 17 00:00:00 2001 From: jacquesfize Date: Wed, 27 Mar 2024 10:34:52 +0100 Subject: [PATCH] feat(eval-perf,sql log): now include endpoint --- .github/workflows/eval.yml | 6 +++--- backend/geonature/tests/benchmarks/utils.py | 14 +++++++++----- backend/geonature/tests/conftest.py | 2 ++ backend/geonature/tests/fixtures.py | 6 +++++- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/eval.yml b/.github/workflows/eval.yml index a4a34dff0b..0089b4061d 100644 --- a/.github/workflows/eval.yml +++ b/.github/workflows/eval.yml @@ -4,7 +4,7 @@ on: jobs: build: - runs-on: self-hosted + runs-on: ubuntu-latest strategy: fail-fast: false @@ -12,11 +12,11 @@ jobs: debian-version: ["11", "12"] include: - debian-version: "11" - # python-version: "3.9" + python-version: "3.9" postgres-version: "13" postgis-version: "3.2" - debian-version: "12" - # python-version: "3.11" + python-version: "3.11" postgres-version: "15" postgis-version: "3.3" diff --git a/backend/geonature/tests/benchmarks/utils.py b/backend/geonature/tests/benchmarks/utils.py index fe33ccdafb..eeb049b54e 100644 --- a/backend/geonature/tests/benchmarks/utils.py +++ b/backend/geonature/tests/benchmarks/utils.py @@ -9,14 +9,16 @@ from geonature.utils.env import db from .benchmark_generator import CLater, BenchmarkTest from geonature.tests.test_synthese import blur_sensitive_observations +import traceback +from geonature.tests.fixtures import app logging.basicConfig() logger = logging.getLogger("logger-name") logger.setLevel(logging.DEBUG) -@pytest.fixture(scope="session") -def activate_profiling_sql(sqllogfilename: pytest.FixtureDef): +@pytest.fixture(scope="function") +def activate_profiling_sql(sqllogfilename: pytest.FixtureDef, app: pytest.FixtureDef): """ Fixture to activate profiling for SQL queries and store query's statements and execution times in a CSV file. @@ -29,6 +31,7 @@ def activate_profiling_sql(sqllogfilename: pytest.FixtureDef): The path to the CSV file where the query statements and execution times will be stored. """ + columns = ["Endpoint", "Query", "Total Time [s.]"] if not sqllogfilename: logger.debug("No SQL Log file provided. SQL Profiling will not be activated.") @@ -38,8 +41,9 @@ def activate_profiling_sql(sqllogfilename: pytest.FixtureDef): if directory and not os.path.exists(directory): raise FileNotFoundError(f"Directory {directory} does not exists ! ") - df = pandas.DataFrame([], columns=["Query", "Total Time [s.]"]) - df.to_csv(sqllogfilename, header=True, index=None, sep=";") + if not os.path.exists(sqllogfilename): + df = pandas.DataFrame([], columns=columns) + df.to_csv(sqllogfilename, header=True, index=None, sep=";") def before_cursor_execute(conn, cursor, statement, parameters, context, executemany): conn.info.setdefault("query_start_time", []).append(time.time()) @@ -51,7 +55,7 @@ def after_cursor_execute(conn, cursor, statement, parameters, context, executema logger.debug("Query Complete!") logger.debug("Total Time: %f" % total) if statement.startswith("SELECT"): - df = pandas.DataFrame([[statement, total]], columns=["Query", "Total Time"]) + df = pandas.DataFrame([[pytest.endpoint, statement, total]], columns=columns) df.to_csv(sqllogfilename, mode="a", header=False, index=None, sep=";") event.listen(db.engine, "before_cursor_execute", before_cursor_execute) diff --git a/backend/geonature/tests/conftest.py b/backend/geonature/tests/conftest.py index da33a4ab5c..1b05115836 100644 --- a/backend/geonature/tests/conftest.py +++ b/backend/geonature/tests/conftest.py @@ -3,6 +3,8 @@ from pypnusershub.tests.fixtures import teardown_logout_user import pytest +pytest.endpoint = "" + def pytest_addoption(parser): parser.addoption("--sql-log-filename", action="store", default=None) diff --git a/backend/geonature/tests/fixtures.py b/backend/geonature/tests/fixtures.py index 569b708732..bffb671cc4 100644 --- a/backend/geonature/tests/fixtures.py +++ b/backend/geonature/tests/fixtures.py @@ -7,7 +7,7 @@ import pytest import sqlalchemy as sa -from flask import current_app, testing, url_for +from flask import current_app, testing, url_for, request from geoalchemy2.shape import from_shape from PIL import Image from shapely.geometry import Point @@ -97,6 +97,10 @@ def app(): app.test_client_class = GeoNatureClient app.config["SERVER_NAME"] = "test.geonature.fr" # required by url_for + @app.before_request + def get_endpoint(): + pytest.endpoint = request.endpoint + with app.app_context(): """ Note: This may seem redundant with 'temporary_transaction' fixture.