From 5108499ba5ebc4b4deca7cc444914f1236c3e305 Mon Sep 17 00:00:00 2001 From: lionick <44701697+lionick@users.noreply.github.com> Date: Thu, 26 Oct 2023 11:07:30 +0300 Subject: [PATCH 1/3] add NullPool as pool strategy (#32) * add NullPool * minor fix --- app/database.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/database.py b/app/database.py index 5e97b80..208398a 100644 --- a/app/database.py +++ b/app/database.py @@ -1,10 +1,14 @@ from app.utils import configParser +from app.logger import log from sqlalchemy import create_engine from sqlmodel import Session from sqlalchemy.exc import OperationalError +from sqlalchemy.pool import NullPool class Database: + logger = log.get_logger("database") + def __init__(self): config_file = 'config.global.py' @@ -14,7 +18,7 @@ def __init__(self): pool_size = int(db_params.get('pool_size', 25)) max_overflow = int(db_params.get('max_overflow', 5)) - self.engine = create_engine(url, pool_size=pool_size, max_overflow=max_overflow) + self.engine = create_engine(url, poolclass=NullPool) def check_database_connection(self): try: @@ -27,8 +31,15 @@ def check_database_connection(self): return False def get_session(self): - with Session(self.engine) as session: + session = Session(self.engine) + try: yield session + except Exception: + self.logger.exception("Session rollback because of exception") + session.rollback() + raise + finally: + session.close() def create_session(self): return Session(self.engine) From 05ee05904e745efec0cd0db1e2d661f92c6d8b57 Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos <3846025+ioigoume@users.noreply.github.com> Date: Thu, 26 Oct 2023 14:47:15 +0300 Subject: [PATCH 2/3] add locust support (#33) * add locust support * add requirements dev file * update readme --- README.md | 2 +- app/tests/locust.py | 17 +++++++++++++++++ docker-compose.yml | 11 +++++++++++ requirements_dev.txt | 28 ++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100755 app/tests/locust.py create mode 100644 requirements_dev.txt diff --git a/README.md b/README.md index 40e538f..c50ab76 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ docker-compose pull ### Install python dependencies docker-compose run --rm --no-deps web pip install --upgrade pip -docker-compose run --rm --no-deps web pip3 install --no-cache-dir -r requirements.txt +docker-compose run --rm --no-deps web pip3 install --no-cache-dir -r requirements_dev.txt ### Install nodejs dependencies docker-compose run --rm --no-deps api npm install --prefer-online diff --git a/app/tests/locust.py b/app/tests/locust.py new file mode 100755 index 0000000..11f02ab --- /dev/null +++ b/app/tests/locust.py @@ -0,0 +1,17 @@ +from locust import HttpUser, task, between + + +class WebsiteUser(HttpUser): + # wait_time can be overridden for individual TaskSets + wait_time = between(10, 300) + + # Host for locust interface: https://metrics-dev.rciam.grnet.gr + @task + def metrics_egi_devel_tenenv(self): + headers = { + 'accept': 'application/json', + 'x-tenant': 'egi', + 'x-environment': 'devel' + } + + self.client.get("/api/v1/tenenv/egi/devel", headers=headers) diff --git a/docker-compose.yml b/docker-compose.yml index a67e721..fdd546c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -50,6 +50,17 @@ services: # - ./javascript/node_modules tty: true + locust: + image: metricsrciam:latest + container_name: metrics.rciam.locust + command: locust -f app/tests/locust.py + ports: + - "8089:8089" + - "3100:3100" + volumes: + - .:/app + tty: true + volumes: pgdata: diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..c0e6c03 --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,28 @@ +alembic==1.10.2 +asgiref==3.5.2 +asyncpg==0.28.0 +click==8.1.3 +fastapi==0.100.0 +geoip2 +h11==0.13.0 +importlib-resources==5.7.1 +Mako==1.2.0 +MarkupSafe==2.1.1 +psycopg2-binary==2.9.7 +pydantic==1.10.7 +PyGreSQL==5.2.5 +SQLAlchemy==1.4.41 +sqlalchemy2-stubs==0.0.2a32 +sqlmodel==0.0.8 +typer==0.4.1 +typing_extensions==4.5.0 +uvicorn==0.21.1 +zipp==3.8.0 +cachetools==5.3.0 +Authlib==1.2.0 +itsdangerous==2.1.2 +httpx==0.23.3 +pyjwt==2.7.0 +geoip2==4.7.0 +gunicorn==21.2.0 +locust==2.17.0 \ No newline at end of file From 3ac745d4aa4b9de827c360d90036e830e66f9deb Mon Sep 17 00:00:00 2001 From: lionick <44701697+lionick@users.noreply.github.com> Date: Wed, 1 Nov 2023 10:58:41 +0200 Subject: [PATCH 3/3] revert pool_size and max_overflow (#34) --- app/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/database.py b/app/database.py index 208398a..68f5f31 100644 --- a/app/database.py +++ b/app/database.py @@ -18,7 +18,7 @@ def __init__(self): pool_size = int(db_params.get('pool_size', 25)) max_overflow = int(db_params.get('max_overflow', 5)) - self.engine = create_engine(url, poolclass=NullPool) + self.engine = create_engine(url, pool_size=pool_size, max_overflow=max_overflow) def check_database_connection(self): try: