From 75b81f2173a4a694a66af8fe5b0e6171491bea6f Mon Sep 17 00:00:00 2001 From: Meni Yakove Date: Wed, 7 May 2025 12:41:19 +0300 Subject: [PATCH 1/2] Return respomse to Github in time, run our process as BackgroundTasks --- webhook_server/app.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/webhook_server/app.py b/webhook_server/app.py index 18d71959..6b49e713 100644 --- a/webhook_server/app.py +++ b/webhook_server/app.py @@ -8,6 +8,7 @@ import requests import urllib3 from fastapi import ( + BackgroundTasks, Depends, FastAPI, HTTPException, @@ -120,7 +121,7 @@ def healthcheck() -> dict[str, Any]: @FASTAPI_APP.post(APP_URL_ROOT_PATH, dependencies=[Depends(gate_by_allowlist_ips)]) -async def process_webhook(request: Request) -> dict[str, Any]: +async def process_webhook(request: Request, background_tasks: BackgroundTasks) -> dict[str, Any]: logger_name: str = "main" logger = get_logger_with_params(name=logger_name) @@ -149,7 +150,7 @@ async def process_webhook(request: Request) -> dict[str, Any]: try: api: ProcessGithubWehook = ProcessGithubWehook(hook_data=hook_data, headers=request.headers, logger=logger) - await api.process() + background_tasks.add_task(api.process) return {"status": requests.codes.ok, "message": "process success", "log_prefix": delivery_headers} except RepositoryNotFoundError as e: From e99d6d0685b00a402266e95252a93c1434df9bdf Mon Sep 17 00:00:00 2001 From: Meni Yakove Date: Wed, 7 May 2025 12:49:42 +0300 Subject: [PATCH 2/2] handles exceptions in the background task --- webhook_server/app.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/webhook_server/app.py b/webhook_server/app.py index 6b49e713..dd95ded4 100644 --- a/webhook_server/app.py +++ b/webhook_server/app.py @@ -150,7 +150,14 @@ async def process_webhook(request: Request, background_tasks: BackgroundTasks) - try: api: ProcessGithubWehook = ProcessGithubWehook(hook_data=hook_data, headers=request.headers, logger=logger) - background_tasks.add_task(api.process) + + async def process_with_error_handling() -> None: + try: + await api.process() + except Exception as e: + logger.exception(f"{log_context} Error in background task: {e}") + + background_tasks.add_task(process_with_error_handling) return {"status": requests.codes.ok, "message": "process success", "log_prefix": delivery_headers} except RepositoryNotFoundError as e: