fix: hide pending region and improve rcon freshness
This commit is contained in:
@@ -73,7 +73,7 @@ def run_periodic_historical_refresh(
|
||||
page_size=page_size,
|
||||
run_number=completed_runs,
|
||||
)
|
||||
print(json.dumps({"run": completed_runs, **payload}, indent=2))
|
||||
print(json.dumps({"run": completed_runs, **payload}, indent=2), flush=True)
|
||||
|
||||
if max_runs is not None and completed_runs >= max_runs:
|
||||
break
|
||||
@@ -276,6 +276,10 @@ def _rcon_capture_has_new_useful_data(rcon_capture_result: dict[str, Any]) -> bo
|
||||
totals = rcon_capture_result.get("totals")
|
||||
if isinstance(totals, dict) and int(totals.get("samples_inserted") or 0) > 0:
|
||||
return True
|
||||
if isinstance(totals, dict) and int(totals.get("admin_log_events_inserted") or 0) > 0:
|
||||
return True
|
||||
if isinstance(totals, dict) and int(totals.get("materialized_matches_inserted") or 0) > 0:
|
||||
return True
|
||||
targets = rcon_capture_result.get("targets")
|
||||
if not isinstance(targets, list):
|
||||
return False
|
||||
|
||||
@@ -126,6 +126,7 @@ def materialize_rcon_admin_log(*, db_path: Path | None = None) -> dict[str, obje
|
||||
except sqlite3.Error as error:
|
||||
errors.append(str(error))
|
||||
|
||||
freshness = summarize_rcon_materialization_status(db_path=resolved_path)
|
||||
return {
|
||||
"matches_seen": matches_seen,
|
||||
"matches_materialized": matches_materialized,
|
||||
@@ -134,6 +135,8 @@ def materialize_rcon_admin_log(*, db_path: Path | None = None) -> dict[str, obje
|
||||
"player_stats_materialized": player_stats_materialized,
|
||||
"player_stats_updated": player_stats_updated,
|
||||
"errors": errors,
|
||||
"latest_materialized_matches": freshness["latest_materialized_matches"],
|
||||
"latest_admin_log_match_end_events": freshness["latest_admin_log_match_end_events"],
|
||||
}
|
||||
|
||||
|
||||
@@ -275,11 +278,56 @@ def summarize_rcon_materialization_status(*, db_path: Path | None = None) -> dic
|
||||
ORDER BY target_key ASC, event_count DESC
|
||||
"""
|
||||
).fetchall()
|
||||
latest_matches = connection.execute(
|
||||
"""
|
||||
SELECT
|
||||
target_key,
|
||||
external_server_id,
|
||||
match_key,
|
||||
map_pretty_name,
|
||||
COALESCE(ended_at, started_at) AS closed_at,
|
||||
ended_at,
|
||||
ended_server_time,
|
||||
source_basis,
|
||||
updated_at
|
||||
FROM (
|
||||
SELECT
|
||||
*,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY target_key
|
||||
ORDER BY COALESCE(ended_at, started_at) DESC,
|
||||
COALESCE(ended_server_time, started_server_time) DESC,
|
||||
updated_at DESC
|
||||
) AS row_number
|
||||
FROM rcon_materialized_matches
|
||||
WHERE source_basis = ?
|
||||
)
|
||||
WHERE row_number = 1
|
||||
ORDER BY target_key ASC
|
||||
""",
|
||||
(MATCH_RESULT_SOURCE,),
|
||||
).fetchall()
|
||||
latest_match_end_events = connection.execute(
|
||||
"""
|
||||
SELECT
|
||||
target_key,
|
||||
external_server_id,
|
||||
MAX(event_timestamp) AS latest_event_timestamp,
|
||||
MAX(server_time) AS latest_server_time,
|
||||
COUNT(*) AS match_end_events
|
||||
FROM rcon_admin_log_events
|
||||
WHERE event_type = 'match_end'
|
||||
GROUP BY target_key, external_server_id
|
||||
ORDER BY target_key ASC
|
||||
"""
|
||||
).fetchall()
|
||||
return {
|
||||
"materialized_matches": int(match_count or 0),
|
||||
"matches_with_player_stats": int(stats_match_count or 0),
|
||||
"server_time_ranges": [dict(row) for row in ranges],
|
||||
"event_counts": [dict(row) for row in event_counts],
|
||||
"latest_materialized_matches": [dict(row) for row in latest_matches],
|
||||
"latest_admin_log_match_end_events": [dict(row) for row in latest_match_end_events],
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ from .config import (
|
||||
get_rcon_request_timeout_seconds,
|
||||
)
|
||||
from .rcon_admin_log_ingestion import ingest_rcon_admin_logs
|
||||
from .rcon_admin_log_materialization import materialize_rcon_admin_log
|
||||
from .rcon_client import (
|
||||
RconQueryError,
|
||||
build_rcon_target_key,
|
||||
@@ -44,6 +45,8 @@ class RconHistoricalCaptureStats:
|
||||
admin_log_events_inserted: int = 0
|
||||
admin_log_duplicate_events: int = 0
|
||||
admin_log_failed_targets: int = 0
|
||||
materialized_matches_inserted: int = 0
|
||||
materialized_matches_updated: int = 0
|
||||
|
||||
|
||||
def run_rcon_historical_capture(
|
||||
@@ -66,6 +69,7 @@ def run_rcon_historical_capture_unlocked(
|
||||
"""Capture one prospective RCON sample assuming the shared writer lock is already held."""
|
||||
initialize_rcon_historical_storage()
|
||||
selected_targets = _select_targets(target_key)
|
||||
selected_target_keys = {build_rcon_target_key(target) for target in selected_targets}
|
||||
admin_log_lookback_minutes = get_rcon_admin_log_lookback_minutes()
|
||||
captured_at = utc_now().isoformat().replace("+00:00", "Z")
|
||||
target_scope = target_key or "all-configured-rcon-targets"
|
||||
@@ -127,6 +131,14 @@ def run_rcon_historical_capture_unlocked(
|
||||
result=admin_log_result,
|
||||
)
|
||||
|
||||
materialization_result = materialize_rcon_admin_log()
|
||||
stats.materialized_matches_inserted = int(
|
||||
materialization_result.get("matches_materialized") or 0
|
||||
)
|
||||
stats.materialized_matches_updated = int(
|
||||
materialization_result.get("matches_updated") or 0
|
||||
)
|
||||
|
||||
status = "success" if not errors else ("partial" if items else "failed")
|
||||
finalize_rcon_historical_capture_run(
|
||||
run_id,
|
||||
@@ -158,7 +170,12 @@ def run_rcon_historical_capture_unlocked(
|
||||
"targets": items,
|
||||
"errors": errors,
|
||||
"admin_log_errors": admin_log_errors,
|
||||
"storage_status": list_rcon_historical_target_statuses(),
|
||||
"materialization_result": materialization_result,
|
||||
"storage_status": [
|
||||
status
|
||||
for status in list_rcon_historical_target_statuses()
|
||||
if status.get("target_key") in selected_target_keys
|
||||
],
|
||||
"totals": {
|
||||
"targets_seen": stats.targets_seen,
|
||||
"samples_inserted": stats.samples_inserted,
|
||||
@@ -168,6 +185,8 @@ def run_rcon_historical_capture_unlocked(
|
||||
"admin_log_events_inserted": stats.admin_log_events_inserted,
|
||||
"admin_log_duplicate_events": stats.admin_log_duplicate_events,
|
||||
"admin_log_failed_targets": stats.admin_log_failed_targets,
|
||||
"materialized_matches_inserted": stats.materialized_matches_inserted,
|
||||
"materialized_matches_updated": stats.materialized_matches_updated,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -204,7 +223,7 @@ def run_periodic_rcon_historical_capture(
|
||||
retry_delay_seconds=retry_delay_seconds,
|
||||
target_key=target_key,
|
||||
)
|
||||
print(json.dumps({"run": completed_runs, **payload}, indent=2))
|
||||
print(json.dumps({"run": completed_runs, **payload}, indent=2), flush=True)
|
||||
if max_runs is not None and completed_runs >= max_runs:
|
||||
break
|
||||
time.sleep(interval_seconds)
|
||||
|
||||
Reference in New Issue
Block a user