add safety checks and debug logging to period time calculations

This commit adds logging infrastructure and safety checks to prevent time
adjustment overflows in get_period_totals(). Includes early return for empty
results and detailed debug logging for troubleshooting period calculations.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
buenosairesam
2025-10-13 18:24:51 -03:00
parent a854f6c21d
commit 5007f241dd

View File

@@ -1,10 +1,15 @@
from collections import Counter, defaultdict from collections import Counter, defaultdict
from datetime import datetime, timedelta from datetime import datetime, timedelta
from pprint import pprint from pprint import pprint
import logging
from pymongo import MongoClient from pymongo import MongoClient
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
# Setup logging for debugging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
timezone = ZoneInfo("America/Argentina/Buenos_Aires") timezone = ZoneInfo("America/Argentina/Buenos_Aires")
utctz = ZoneInfo("UTC") utctz = ZoneInfo("UTC")
@@ -266,6 +271,10 @@ def get_period_totals(start, end, task=None):
aux_results = list(switches.aggregate(pipeline_before_after)) aux_results = list(switches.aggregate(pipeline_before_after))
# Safety check: if aux_results is empty, return early with no data
if not aux_results:
return [{"ws": "No Data", "total": ""}]
bfirst = aux_results[0]["before_first"] bfirst = aux_results[0]["before_first"]
if bfirst: if bfirst:
@@ -279,14 +288,30 @@ def get_period_totals(start, end, task=None):
rows = [] rows = []
active_vs_idle = {"Active": 0, "Idle": 0} active_vs_idle = {"Active": 0, "Idle": 0}
# Debug logging
logger.debug(f"Processing results for period {start} to {end}")
logger.debug(f"bfirst workspace: {bfirst['workspace'] if bfirst else 'None'}")
logger.debug(f"ldoc workspace: {ldoc['workspace']}")
for result in results: for result in results:
original_total = result["total"]
if bfirst: if bfirst:
if result["_id"] == bfirst["workspace"]: if result["_id"] == bfirst["workspace"]:
result["total"] -= start_delta # Safety: ensure start_delta doesn't exceed total
adjustment = min(start_delta, result["total"])
result["total"] -= adjustment
logger.debug(f"{result['_id']}: adjusted start by -{adjustment}s (was {original_total}s, now {result['total']}s)")
if end < now(): if end < now():
if result["_id"] == ldoc["workspace"]: if result["_id"] == ldoc["workspace"]:
result["total"] -= ldoc["delta"] - end_delta # Safety: ensure we don't subtract more than the total
adjustment = ldoc["delta"] - end_delta
safe_adjustment = min(adjustment, result["total"])
result["total"] -= safe_adjustment
logger.debug(f"{result['_id']}: adjusted end by -{safe_adjustment}s (was {original_total}s, now {result['total']}s)")
logger.debug(f"{result['_id']}: final total = {result['total']}s ({convert_seconds(result['total'])})")
for result in results: for result in results:
if result["total"] > 0: if result["total"] > 0: