fix(CI5): konverter DatetimeWithNanoseconds til str før _parse_ts

This commit is contained in:
chrischristiansen-glitch 2026-06-10 06:11:11 +02:00
parent 29a03c4342
commit 54dd25a90e

View File

@ -47,30 +47,27 @@ def _list_builds_rest(project_id: str, region: str, trigger_id: str, page_size:
return json.loads(resp.read())
def _parse_ts(ts: str):
"""Parser RFC3339-tidsstempel robust, returnerer datetime eller None."""
def _parse_ts(ts):
"""Parser tidsstempel robust — aksepterer str, DatetimeWithNanoseconds eller datetime."""
from datetime import datetime, timezone
if not ts:
if ts is None:
return None
# Hvis det allerede er et datetime-objekt (inkl. DatetimeWithNanoseconds)
if hasattr(ts, 'year'):
if getattr(ts, 'tzinfo', None) is None:
return ts.replace(tzinfo=timezone.utc)
return ts
# Konverter til string og parse RFC3339
ts = str(ts).rstrip("Z")
try:
clean_ts = ts[:19] # YYYY-MM-DDTHH:MM:SS
if "." in ts:
frac = ts[20:26].split("+")[0].split("-")[0] if len(ts) > 20 else "000000"
clean_ts = ts[:19] + "." + frac.ljust(6, "0")[:6]
return datetime.strptime(clean_ts, "%Y-%m-%dT%H:%M:%S.%f").replace(tzinfo=timezone.utc)
return datetime.strptime(clean_ts, "%Y-%m-%dT%H:%M:%S").replace(tzinfo=timezone.utc)
except Exception:
return None
ts = ts.rstrip("Z")
# Fjern eventuell timezone-offset (+00:00) og mikrosekunder
for fmt in (
"%Y-%m-%dT%H:%M:%S.%f",
"%Y-%m-%dT%H:%M:%S",
):
try:
# Klipp bort offset-del før parsing
clean = ts.split("+")[0].split("-")[:3]
# Rekonstruer uten offset
clean_ts = ts[:19] # YYYY-MM-DDTHH:MM:SS
if "." in ts:
frac = ts[20:26].split("+")[0].split("-")[0] if len(ts) > 20 else "000000"
clean_ts = ts[:19] + "." + frac.ljust(6, "0")[:6]
return datetime.strptime(clean_ts, "%Y-%m-%dT%H:%M:%S.%f").replace(tzinfo=timezone.utc)
return datetime.strptime(clean_ts, "%Y-%m-%dT%H:%M:%S").replace(tzinfo=timezone.utc)
except Exception:
continue
return None
class PushStaticRequest(BaseModel):
@ -197,7 +194,8 @@ async def get_logs(lines: int = 50, severity: str = "DEFAULT", _: bool = Depends
for entry in entries:
payload = entry.payload
text = payload.get("message", str(payload)) if isinstance(payload, dict) else str(payload)
log_lines.append({"timestamp": str(entry.timestamp), "severity": str(entry.severity), "text": text[:400]})
ts = _parse_ts(entry.timestamp)
log_lines.append({"timestamp": ts.isoformat() if ts else str(entry.timestamp), "severity": str(entry.severity), "text": text[:400]})
return {"service": CLOUD_RUN_SERVICE, "count": len(log_lines), "logs": log_lines}
except Exception as e:
logger.error(f"[get_logs] {e}", exc_info=True)