diff options
| author | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-04-01 16:12:40 +0900 |
|---|---|---|
| committer | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-04-01 16:12:40 +0900 |
| commit | c3560fdd637c4f034cac4f7371aeed65d018bc91 (patch) | |
| tree | c50d3318c0c37ca634012b7113a80c0d6e356844 /services/strategy-engine/src/strategy_engine/main.py | |
| parent | ec792a3d379c911165038d8da5b339df6ca3fccd (diff) | |
feat(services): integrate structlog, healthcheck, metrics, and Telegram
Replace logging.basicConfig/getLogger with structlog setup_logging in all
four service entry points. Add HealthCheckServer, ServiceMetrics, and
TelegramNotifier initialization to each service. Update OrderExecutor to
accept a notifier parameter and send order notifications. Add
RedisBroker.ping() for health checks. Update executor tests with
notifier=AsyncMock().
Diffstat (limited to 'services/strategy-engine/src/strategy_engine/main.py')
| -rw-r--r-- | services/strategy-engine/src/strategy_engine/main.py | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/services/strategy-engine/src/strategy_engine/main.py b/services/strategy-engine/src/strategy_engine/main.py index 83bb867..2e3c4ac 100644 --- a/services/strategy-engine/src/strategy_engine/main.py +++ b/services/strategy-engine/src/strategy_engine/main.py @@ -1,23 +1,27 @@ """Strategy Engine Service entry point.""" import asyncio -import logging from pathlib import Path from shared.broker import RedisBroker +from shared.healthcheck import HealthCheckServer +from shared.logging import setup_logging +from shared.metrics import ServiceMetrics +from shared.notifier import TelegramNotifier from strategy_engine.config import StrategyConfig from strategy_engine.engine import StrategyEngine from strategy_engine.plugin_loader import load_strategies -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - # The strategies directory lives alongside the installed package STRATEGIES_DIR = Path(__file__).parent.parent.parent.parent / "strategies" async def run() -> None: config = StrategyConfig() + log = setup_logging("strategy-engine", config.log_level, config.log_format) + metrics = ServiceMetrics("strategy_engine") + notifier = TelegramNotifier(bot_token=config.telegram_bot_token, chat_id=config.telegram_chat_id) + broker = RedisBroker(config.redis_url) strategies_dir = STRATEGIES_DIR @@ -28,23 +32,35 @@ async def run() -> None: params = config.strategy_params.get(strategy.name, {}) strategy.configure(params) - logger.info( - "Loaded %d strategies: %s", - len(strategies), - [s.name for s in strategies], + log.info( + "strategies_loaded", + count=len(strategies), + names=[s.name for s in strategies], ) engine = StrategyEngine(broker=broker, strategies=strategies) + health = HealthCheckServer("strategy-engine", port=config.health_port + 1) + health.register_check("redis", broker.ping) + await health.start() + metrics.service_up.labels(service="strategy-engine").set(1) + try: for symbol in config.symbols: stream = f"candles.{symbol.replace('/', '_')}" last_id = "$" - logger.info("Starting engine loop for stream=%s", stream) + log.info("engine_loop_started", stream=stream) while True: last_id = await engine.process_once(stream, last_id) + metrics.events_processed.labels(service="strategy-engine", event_type="candle").inc() + except Exception as exc: + log.error("fatal_error", error=str(exc)) + await notifier.send_error(str(exc), "strategy-engine") + raise finally: + metrics.service_up.labels(service="strategy-engine").set(0) + await notifier.close() await broker.close() |
