272 lines
7.1 KiB
Markdown
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
|