Files
comunidadhll/docs/rcon-historical-ingestion-design.md
devRaGonSa 0da8338ba8 Fix
2026-06-05 16:57:25 +02:00

272 lines
7.1 KiB
Markdown

# RCON Historical Ingestion Design
## Validation Date
- 2026-03-25
## Scope
Definir si la repo puede soportar historico por RCON con la implementacion
actual y, si no puede hacerlo de forma retroactiva, dejar una arquitectura
minima y defendible para una primera captura prospectiva.
Este documento se limita a la evidencia local de la repo. No asume comandos
RCON no integrados ni capacidades externas no demostradas aqui.
## Evidence Reviewed
- `backend/app/data_sources.py`
- `backend/app/providers/rcon_provider.py`
- `backend/app/rcon_client.py`
- `backend/app/historical_ingestion.py`
- `backend/app/historical_storage.py`
- `backend/app/player_event_worker.py`
- `backend/app/player_event_storage.py`
- `backend/README.md`
- `docs/rcon-data-capability-audit.md`
- `docs/crcon-advanced-metrics-origin-audit.md`
## Current State In Code
La separacion entre live e historico ya existe en la seleccion de proveedores:
- `get_live_data_source()` puede resolver `rcon`
- `get_historical_data_source()` puede resolver `rcon`, pero hoy devuelve un
placeholder que falla
La implementacion RCON real disponible en la repo es minima y esta concentrada
en `backend/app/rcon_client.py`.
Comandos soportados hoy en codigo:
- `ServerConnect`
- `Login`
- `GetServerInformation`
No hay evidencia local de otros comandos ya integrados para:
- scoreboards por jugador
- detalle de partida cerrada
- eventos kill por kill
- logs tacticos
- historico retroactivo de matches cerrados
## Payload Available Today
La salida efectiva que la repo consume desde RCON hoy es la normalizada por
`query_live_server_state()`:
- `external_server_id`
- `server_name`
- `status`
- `players`
- `max_players`
- `current_map`
- `region`
- `source_name`
- `snapshot_origin`
- `source_ref`
Inferencia basada en `rcon_client.py`:
- el payload remoto de `GetServerInformation` contiene como minimo
`serverName`, `playerCount`, `maxPlayerCount` y `mapId` o `mapName`
- la repo no persiste hoy el payload crudo ni deriva entidades historicas de
match o jugador a partir de RCON
## Operational Frequency Assessment
Inferencia basada en la implementacion actual:
- cada pasada por target abre una conexion TCP
- realiza handshake `ServerConnect`
- autentica con `Login`
- ejecuta una consulta `GetServerInformation`
Con este alcance, una frecuencia inicial razonable para captura prospectiva es:
- cada `60` a `300` segundos para operativa normal
- `30` segundos solo como validacion o monitoreo puntual
No hay evidencia en la repo para defender un polling mas agresivo de forma
sostenida ni para asegurar que aportaria historico competitivo util.
## Viability Decision
Conclusion principal:
- no viable hoy para historico real retroactivo de partidas cerradas con el
cliente actual
- viable solo para captura prospectiva
Motivos:
- el cliente actual solo consulta estado live puntual
- no existe base local para reconstruir partidas ya cerradas
- no existe feed raw de eventos ni logs persistidos
- `RconHistoricalDataSource` sigue siendo un placeholder y no puede sustituir a
`public-scoreboard`
Conclusion secundaria:
- una capa historica parcial por RCON si es defendible, pero solo si se define
como captura prospectiva de muestras live y no como backfill de matches ya
perdidos
## Recommended Minimal Architecture
### Storage
Separar completamente la persistencia prospectiva RCON del historico actual
`historical_*`.
Tablas minimas recomendadas:
- `rcon_historical_targets`
- identidad estable del target configurado
- ultimo estado conocido de configuracion
- `rcon_historical_capture_runs`
- una fila por ejecucion del worker
- estado, inicio, fin, errores y target scope
- `rcon_historical_samples`
- una fila por muestra y target
- `captured_at`
- identidad de target
- payload normalizado
- payload crudo opcional de `GetServerInformation`
Si se quiere checkpoint explicito desde la primera version:
- `rcon_historical_checkpoints`
- `target_key`
- `last_successful_capture_at`
- `last_sample_at`
- `last_error`
### Workers
Worker dedicado fuera del request path HTTP:
- `python -m app.rcon_historical_worker capture`
- `python -m app.rcon_historical_worker loop --interval 120`
Responsabilidades:
- cargar `HLL_BACKEND_RCON_TARGETS`
- consultar cada target con el cliente RCON actual
- persistir run tracking
- persistir muestras idempotentes por target y timestamp
- actualizar checkpoints
### Checkpoints
Como no existe backfill retroactivo real, el checkpoint no debe modelarse como
pagina o offset de archivo historico. Debe modelarse como tiempo de captura.
Checkpoint minimo defendible:
- ultimo `captured_at` exitoso por target
- ultimo error por target
- ultimo run exitoso global
### Compatibility With `public-scoreboard`
Politica recomendada:
- `public-scoreboard` sigue siendo la fuente historica principal para:
- leaderboards semanales y mensuales
- MVP V1 y V2
- recent matches cerrados
- player events derivados de la capa publica actual
- RCON prospectivo convive en una linea paralela para:
- cobertura temporal hacia delante
- disponibilidad del servidor
- actividad reciente
- trazabilidad de frescura por target
## Recommended Degradation Policy
Si en una fase posterior se habilita `HLL_BACKEND_HISTORICAL_DATA_SOURCE=rcon`,
la degradacion minima correcta es esta:
- solo exponer endpoints o bloques claramente soportados por la persistencia
prospectiva RCON
- no simular leaderboards completos cuando no existan
- devolver metadata de cobertura y frescura antes que rankings vacios
Contratos defendibles en una primera lectura minima:
- resumen de cobertura por servidor
- actividad reciente por servidor
- estado de frescura
- rango temporal disponible
Contratos que deben seguir dependiendo de `public-scoreboard` hasta nueva
evidencia:
- weekly leaderboards completos
- monthly leaderboards completos
- monthly MVP V1
- monthly MVP V2
- player profiles competitivos
- equivalencia completa con `historico.html`
## Recommended Phases
### Phase 1: Prospective Capture
Objetivo:
- empezar a guardar muestras live RCON hacia delante
Incluye:
- storage separado
- worker dedicado
- run tracking
- checkpoints temporales
- ejecucion manual y en loop
No incluye:
- backfill retroactivo
- paridad con `public-scoreboard`
- endpoints competitivos nuevos
### Phase 2: Minimal Operational Read Model
Objetivo:
- leer la persistencia prospectiva RCON sin consultar RCON on-demand en HTTP
Incluye:
- resumen por servidor
- ultima muestra
- cobertura disponible
- actividad reciente
### Phase 3: Competitive Metrics Only If Signal Improves
Objetivo:
- evaluar si aparecen comandos, eventos o logs suficientes para enriquecer la
capa historica RCON
Solo deberia abrirse si existe evidencia real de:
- eventos reutilizables
- scoreboards historificables
- granularidad por jugador o por encounter
## Final Recommendation
La decision tecnica correcta para esta repo es:
- mantener `public-scoreboard` como fuente historica por defecto
- tratar RCON historico como una linea prospectiva separada
- no prometer reconstruccion retroactiva con el cliente actual
- abrir implementacion incremental en dos tasks:
- captura prospectiva persistida
- lectura minima sobre persistencia local