From 93de9b4497e3f71ae2b11129608dea7ddabf6f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brage=20Skj=C3=B8nborg?= Date: Sun, 18 Jan 2026 18:02:54 +0100 Subject: [PATCH] Adjustments --- apps/py-metadata/app.py | 52 +++++++++++++++++++++++++++-------------- apps/py-watcher/app.py | 34 ++++++++++++++++----------- 2 files changed, 55 insertions(+), 31 deletions(-) diff --git a/apps/py-metadata/app.py b/apps/py-metadata/app.py index 7eab11b9..bf037f70 100644 --- a/apps/py-metadata/app.py +++ b/apps/py-metadata/app.py @@ -1,60 +1,78 @@ import signal import sys +import time from threading import Thread +import uvicorn + from api.health_api import app as health_app, init_health_api from config.database_config import DatabaseConfig from db.database import Database from utils.logger import logger from worker.poller import run_worker -import uvicorn -# global flag for shutdown shutdown_flag = False -worker_heartbeat = 0 +worker_heartbeat = time.time() + def handle_shutdown(signum, frame): global shutdown_flag logger.info("🛑 Shutdown signal mottatt, avslutter worker...") shutdown_flag = True -def set_heartbeat(ts): - global worker_heartbeat - worker_heartbeat = ts -def get_heartbeat(): - return worker_heartbeat +def set_heartbeat(ts): + global worker_heartbeat + worker_heartbeat = ts -def start_health_server(): - """ Starter FastAPI health-server i egen tråd. """ + +def get_heartbeat(): + return worker_heartbeat + + +def start_health_server(): uvicorn.run(health_app, host="0.0.0.0", port=8080, log_level="warning") +def start_worker(db): + run_worker( + db=db, + shutdown_flag_ref=lambda: shutdown_flag, + heartbeat_ref=lambda ts: set_heartbeat(ts) + ) + def main(): - # registrer signal handlers for graceful shutdown signal.signal(signal.SIGINT, handle_shutdown) signal.signal(signal.SIGTERM, handle_shutdown) logger.info("🚀 Starter worker-applikasjon") + try: - config: DatabaseConfig = DatabaseConfig.from_env() - db: Database = Database(config) + config = DatabaseConfig.from_env() + db = Database(config) db.connect() - # Init health-API med DB og heartbeat-ref + # Init health API init_health_api(db, get_heartbeat) - # Start health-server i egen tråd + # Start health server i egen tråd Thread(target=start_health_server, daemon=True).start() logger.info("🌡️ Health API startet på port 8080") - - run_worker(db=db, shutdown_flag_ref=lambda: shutdown_flag, heartbeat_ref=lambda ts: set_heartbeat(ts)) + # Start worker i egen tråd + Thread(target=start_worker, args=(db,), daemon=True).start() + logger.info("🔁 Worker startet i egen tråd") + + # Hold main-tråden i live + while not shutdown_flag: + time.sleep(1) + except Exception as e: logger.error(f"❌ Kritisk feil i app: {e}") sys.exit(1) logger.info("👋 Worker avsluttet gracefully") + if __name__ == "__main__": main() diff --git a/apps/py-watcher/app.py b/apps/py-watcher/app.py index 83b44de8..7a7bbd1e 100644 --- a/apps/py-watcher/app.py +++ b/apps/py-watcher/app.py @@ -1,8 +1,8 @@ -# app.py import asyncio import signal import sys import time +from threading import Thread import uvicorn from api.health_api import create_health_app @@ -12,7 +12,6 @@ from db.repository import insert_event from worker.file_watcher import start_observer from utils.logger import logger -# global flag for shutdown shutdown_flag = False observers = [] worker_heartbeat = time.time() @@ -40,6 +39,7 @@ async def run_worker(db: Database, paths, extensions, shutdown_flag_ref): try: while not shutdown_flag_ref(): set_heartbeat(time.time()) + logger.debug("Heartbeat oppdatert") await asyncio.sleep(5) finally: logger.info("🛑 Stopper observer...") @@ -48,31 +48,26 @@ async def run_worker(db: Database, paths, extensions, shutdown_flag_ref): obs.join() logger.info("👋 Alle observers stoppet") - return observers + +def start_health_server(app): + uvicorn.run(app, host="0.0.0.0", port=8080, log_level="warning") def main(): - # registrer signal handlers for graceful shutdown signal.signal(signal.SIGINT, handle_shutdown) signal.signal(signal.SIGTERM, handle_shutdown) - logger.info("🚀 Starter worker-applikasjon") + logger.info("🚀 Starter watcher-applikasjon") try: - # DB - config: DatabaseConfig = DatabaseConfig.from_env() - db: Database = Database(config) + config = DatabaseConfig.from_env() + db = Database(config) db.connect() - # paths og extensions from config.paths_config import PathsConfig paths_config = PathsConfig.from_env() paths_config.validate() - # start worker - loop = asyncio.get_event_loop() - loop.create_task(run_worker(db, paths_config.watch_paths, paths_config.extensions, lambda: shutdown_flag)) - # health API app = create_health_app( observers_ref=lambda: observers, @@ -80,7 +75,18 @@ def main(): heartbeat_ref=get_heartbeat ) - uvicorn.run(app, host="0.0.0.0", port=8080) + # start health server i egen tråd + Thread(target=start_health_server, args=(app,), daemon=True).start() + logger.info("🌡️ Health API startet på port 8080") + + # start worker i event loop + loop = asyncio.get_event_loop() + loop.run_until_complete(run_worker( + db, + paths_config.watch_paths, + paths_config.extensions, + lambda: shutdown_flag + )) except Exception as e: logger.error(f"❌ Kritisk feil i app: {e}")