From fdb4cc98e8166b7faa835f97377b3f54cf233611 Mon Sep 17 00:00:00 2001 From: emmatveev Date: Sun, 24 Nov 2024 23:10:05 +0300 Subject: [PATCH 1/4] fix --- app/routers/experiments.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/routers/experiments.py b/app/routers/experiments.py index a531114..4dcd35b 100644 --- a/app/routers/experiments.py +++ b/app/routers/experiments.py @@ -1,3 +1,4 @@ +import bson import fastapi import pydantic @@ -37,14 +38,14 @@ async def post(body: RequestPostBody): @router.put('/api/v1/experiments', status_code=fastapi.status.HTTP_202_ACCEPTED, responses={404: {'description': 'Not found'}}) async def put(body: RequestPutBody): - changed = await experiments.update(id=body.id, enabled=body.enabled, condition=body.condition) + changed = await experiments.update(id=bson.ObjectId(body.id), enabled=body.enabled, condition=body.condition) if not changed: raise fastapi.HTTPException(404) @router.delete('/api/v1/experiments', status_code=fastapi.status.HTTP_202_ACCEPTED, responses={404: {'description': 'Not found'}}) async def delete(body: RequestDeleteBody): - changed = await experiments.delete(id=body.id) + changed = await experiments.delete(id=bson.ObjectId(body.id)) if not changed: raise fastapi.HTTPException(404) -- 2.45.2 From 64ef3ff7760534394e12105c45826da8589d467e Mon Sep 17 00:00:00 2001 From: Egor Matveev Date: Mon, 16 Jun 2025 16:27:07 +0300 Subject: [PATCH 2/4] fix --- .deploy/deploy-dev.yaml | 3 +++ .deploy/deploy-prod.yaml | 3 +++ app/middlewares/__init__.py | 0 app/middlewares/metrics.py | 14 ++++++++++++++ app/utils/monitoring.py | 24 ++++++++++++++++++++++++ 5 files changed, 44 insertions(+) create mode 100644 app/middlewares/__init__.py create mode 100644 app/middlewares/metrics.py create mode 100644 app/utils/monitoring.py diff --git a/.deploy/deploy-dev.yaml b/.deploy/deploy-dev.yaml index f1816fd..54064d7 100644 --- a/.deploy/deploy-dev.yaml +++ b/.deploy/deploy-dev.yaml @@ -6,6 +6,7 @@ services: image: mathwave/sprint-repo:configurator networks: - configurator-development + - monitoring environment: MONGO_HOST: "mongo.develop.sprinthub.ru" MONGO_PASSWORD: $MONGO_PASSWORD_DEV @@ -20,3 +21,5 @@ services: networks: configurator-development: external: true + monitoring: + external: true diff --git a/.deploy/deploy-prod.yaml b/.deploy/deploy-prod.yaml index 84153e5..dcfffc0 100644 --- a/.deploy/deploy-prod.yaml +++ b/.deploy/deploy-prod.yaml @@ -6,6 +6,7 @@ services: image: mathwave/sprint-repo:configurator networks: - configurator + - monitoring environment: MONGO_HOST: "mongo.sprinthub.ru" MONGO_PASSWORD: $MONGO_PASSWORD_PROD @@ -20,3 +21,5 @@ services: networks: configurator: external: true + monitoring: + external: true diff --git a/app/middlewares/__init__.py b/app/middlewares/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/middlewares/metrics.py b/app/middlewares/metrics.py new file mode 100644 index 0000000..b1b1b5d --- /dev/null +++ b/app/middlewares/metrics.py @@ -0,0 +1,14 @@ +import datetime +import zoneinfo +from fastapi import Request, Response +from starlette.middleware.base import BaseHTTPMiddleware + +from app.utils.monitoring import monitoring + +class MetricsMiddleware(BaseHTTPMiddleware): + async def dispatch(self, request: Request, call_next): + start = datetime.datetime.now(zoneinfo.ZoneInfo("Europe/Moscow")) + response: Response = await call_next(request) + end = datetime.datetime.now(zoneinfo.ZoneInfo("Europe/Moscow")) + monitoring.send_metric(start, end, request.url.path, response.status_code, request.method) + return response \ No newline at end of file diff --git a/app/utils/monitoring.py b/app/utils/monitoring.py new file mode 100644 index 0000000..0eb52d5 --- /dev/null +++ b/app/utils/monitoring.py @@ -0,0 +1,24 @@ +from concurrent.futures import ThreadPoolExecutor +import datetime +import requests + + +class Monitroing: + def __init__(self): + self.executor = ThreadPoolExecutor(max_workers=1) + + def send_metric(self, start: datetime.datetime, end: datetime.datetime, endpoint: str, status_code: int, method: str): + def send(): + requests.post(f'http://monitoring:1237/api/v1/metrics/endpoint', json={ + 'timestamp': start.strftime("%Y-%m-%dT%H:%M:%S") + "Z", + 'service': 'configurator', + 'endpoint': endpoint, + 'status_code': status_code, + 'response_time': (end - start).microseconds // 1000, + 'method': method, + }) + + self.executor.submit(send) + + +monitoring = Monitroing() -- 2.45.2 From 786f44a29c53b225f57d385dba8537314d0fb416 Mon Sep 17 00:00:00 2001 From: Egor Matveev Date: Mon, 16 Jun 2025 16:29:48 +0300 Subject: [PATCH 3/4] fix --- main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.py b/main.py index 2c2603e..e58a5b2 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,7 @@ import fastapi import uvicorn +from app.middlewares.metrics import MetricsMiddleware from app.routers import experiments from app.routers import configs from app.routers import staff @@ -10,6 +11,7 @@ from app.storage import mongo app = fastapi.FastAPI() +app.add_middleware(MetricsMiddleware) app.include_router(experiments.router) app.include_router(configs.router) -- 2.45.2 From 3dd862b287dbfed029c90e617570f506d46cef8c Mon Sep 17 00:00:00 2001 From: Egor Matveev Date: Mon, 16 Jun 2025 16:33:23 +0300 Subject: [PATCH 4/4] fix --- requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/requirements.txt b/requirements.txt index 325371f..fdde3ac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,8 @@ annotated-types==0.7.0 anyio==4.6.2.post1 APScheduler==3.10.4 +certifi==2025.6.15 +charset-normalizer==3.4.2 click==8.1.7 dnspython==2.7.0 fastapi==0.115.4 @@ -12,9 +14,11 @@ pydantic_core==2.23.4 pymongo==4.9.2 pytz==2024.2 redis==5.2.0 +requests==2.32.4 six==1.16.0 sniffio==1.3.1 starlette==0.41.2 typing_extensions==4.12.2 tzlocal==5.2 +urllib3==2.4.0 uvicorn==0.32.0 -- 2.45.2