rename Metric Classes and change Folder Structure

This commit is contained in:
2026-04-04 22:14:14 +02:00
parent a38a600bdc
commit 043d7654f9
7 changed files with 52 additions and 36 deletions
+2 -2
View File
@@ -1,9 +1,9 @@
from server.metrics.MetricsManager import MetricsManager
from server.metrics.backends.Template import StoreTemplate
import time
class MetricsCollector:
def __init__(self, metrics_manager:MetricsManager, game_state_local_cache:bool, metrics_backend:str, game_state_backend:str, stale_game_timeout_sec:int, game_last_seen_unix:dict, game_move_counts:dict):
def __init__(self, metrics_manager:StoreTemplate, game_state_local_cache:bool, metrics_backend:str, game_state_backend:str, stale_game_timeout_sec:int, game_last_seen_unix:dict, game_move_counts:dict):
self._manager = metrics_manager
self._stale_game_timeout_sec = stale_game_timeout_sec
self._game_last_seen_unix = game_last_seen_unix
+7 -3
View File
@@ -1,9 +1,13 @@
from server.metrics.MemoryMetricsStore import MemoryMetricsStore
from server.metrics.RedisMetricsStore import RedisMetricsStore
from .backends.Template import StoreTemplate
from .backends.Memory import MemoryMetricsStore
from .backends.Redis import RedisMetricsStore
from .MetricsCollector import MetricsCollector
class MetricsStoreBuilder:
@classmethod
def build(self, backend:str="memory", **kwargs) -> MemoryMetricsStore|RedisMetricsStore:
def build(self, backend:str="memory", **kwargs) -> StoreTemplate:
selected = (backend or "memory").strip().lower()
if selected == "redis":
return RedisMetricsStore(**kwargs)
@@ -1,5 +1,8 @@
class MemoryMetricsStore:
from server.metrics.backends.Template import StoreTemplate
class MemoryMetricsStore(StoreTemplate):
def __init__(self, **kwargs):
super().__init__(backend="memory", **kwargs)
self._snapshots:dict[str, dict] = {}
async def publish(self, worker_id:str, snapshot:dict) -> None:
@@ -11,7 +14,7 @@ class MemoryMetricsStore:
async def clear_all(self) -> None:
self._snapshots.clear()
async def acquire_startup_cleanup_lock(self, lock_key:str, ttl_seconds:int=300) -> bool:
async def _acquire_startup_cleanup_lock(self, lock_key:str, ttl_seconds:int=300) -> bool:
return True
async def close(self) -> None:
@@ -1,8 +1,10 @@
import inspect
import json
from server.metrics.backends.Template import StoreTemplate
class RedisMetricsStore:
import inspect, json
class RedisMetricsStore(StoreTemplate):
def __init__(self, redis_url:str="redis://localhost:6379/0", key_prefix:str="snake:metrics:worker", ttl_seconds:int|None=None, **kwargs):
super().__init__(backend="redis", key_prefix=key_prefix, **kwargs)
self.redis_url = redis_url
self.key_prefix = key_prefix
self.ttl_seconds = ttl_seconds
@@ -47,7 +49,7 @@ class RedisMetricsStore:
if keys:
await redis.delete(*keys)
async def acquire_startup_cleanup_lock(self, lock_key:str, ttl_seconds:int=300) -> bool:
async def _acquire_startup_cleanup_lock(self, lock_key:str, ttl_seconds:int=300) -> bool:
redis = await self._get_redis()
locked = await redis.set(lock_key, '1', ex=max(1, int(ttl_seconds)), nx=True)
return bool(locked)
@@ -1,19 +1,12 @@
from server.metrics import MetricsStoreBuilder
from typing import Any, Awaitable, cast
import time, os, inspect
import inspect, os
class MetricsManager:
def __init__(self, backend:str="memory", redis_url:str="redis://localhost:6379/0", ttl_seconds:int|None=90, key_prefix:str="snake:metrics:worker", worker_id:str|None=None):
class StoreTemplate:
def __init__(self, backend:str="memory", key_prefix:str="snake:metrics:worker", worker_id:str|None=None, **kwargs):
self.backend = (backend or "memory").strip().lower()
self.key_prefix = key_prefix
self.worker_id = worker_id or f"{os.getpid()}-{int(time.time() * 1000)}"
self.store = MetricsStoreBuilder.build(
backend=self.backend,
redis_url=redis_url,
ttl_seconds=ttl_seconds,
key_prefix=key_prefix,
)
self.worker_id = worker_id or f"{os.getpid()}"
self.store = self
async def publish_only(self, snapshot:dict) -> None:
await self.store.publish(self.worker_id, snapshot)
@@ -30,7 +23,14 @@ class MetricsManager:
return self._merge_snapshots(snapshots)
async def close(self) -> None:
await self.store.close()
if self.store is self:
return
close_store = getattr(self.store, "close", None)
if not callable(close_store):
return
maybe_result = close_store()
if inspect.isawaitable(maybe_result):
await cast(Awaitable[Any], maybe_result)
async def clear_all_workers(self) -> None:
clear_all = getattr(self.store, "clear_all", None)
@@ -43,9 +43,11 @@ class MetricsManager:
if self.backend != "redis":
return True
acquire_lock = getattr(self.store, "acquire_startup_cleanup_lock", None)
acquire_lock = getattr(self.store, "_acquire_startup_cleanup_lock", None)
if not callable(acquire_lock):
return True
acquire_lock = getattr(self.store, "acquire_startup_cleanup_lock", None)
if not callable(acquire_lock):
return True
lock_key = f"{self.key_prefix}:startup_cleanup_lock"
maybe_result = acquire_lock(lock_key, ttl_seconds)