fix(CI5): konverter DatetimeWithNanoseconds til str før _parse_ts
This commit is contained in:
parent
29a03c4342
commit
54dd25a90e
|
|
@ -47,21 +47,19 @@ def _list_builds_rest(project_id: str, region: str, trigger_id: str, page_size:
|
||||||
return json.loads(resp.read())
|
return json.loads(resp.read())
|
||||||
|
|
||||||
|
|
||||||
def _parse_ts(ts: str):
|
def _parse_ts(ts):
|
||||||
"""Parser RFC3339-tidsstempel robust, returnerer datetime eller None."""
|
"""Parser tidsstempel robust — aksepterer str, DatetimeWithNanoseconds eller datetime."""
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
if not ts:
|
if ts is None:
|
||||||
return None
|
return None
|
||||||
ts = ts.rstrip("Z")
|
# Hvis det allerede er et datetime-objekt (inkl. DatetimeWithNanoseconds)
|
||||||
# Fjern eventuell timezone-offset (+00:00) og mikrosekunder
|
if hasattr(ts, 'year'):
|
||||||
for fmt in (
|
if getattr(ts, 'tzinfo', None) is None:
|
||||||
"%Y-%m-%dT%H:%M:%S.%f",
|
return ts.replace(tzinfo=timezone.utc)
|
||||||
"%Y-%m-%dT%H:%M:%S",
|
return ts
|
||||||
):
|
# Konverter til string og parse RFC3339
|
||||||
|
ts = str(ts).rstrip("Z")
|
||||||
try:
|
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
|
clean_ts = ts[:19] # YYYY-MM-DDTHH:MM:SS
|
||||||
if "." in ts:
|
if "." in ts:
|
||||||
frac = ts[20:26].split("+")[0].split("-")[0] if len(ts) > 20 else "000000"
|
frac = ts[20:26].split("+")[0].split("-")[0] if len(ts) > 20 else "000000"
|
||||||
|
|
@ -69,7 +67,6 @@ def _parse_ts(ts: str):
|
||||||
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.%f").replace(tzinfo=timezone.utc)
|
||||||
return datetime.strptime(clean_ts, "%Y-%m-%dT%H:%M:%S").replace(tzinfo=timezone.utc)
|
return datetime.strptime(clean_ts, "%Y-%m-%dT%H:%M:%S").replace(tzinfo=timezone.utc)
|
||||||
except Exception:
|
except Exception:
|
||||||
continue
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -197,7 +194,8 @@ async def get_logs(lines: int = 50, severity: str = "DEFAULT", _: bool = Depends
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
payload = entry.payload
|
payload = entry.payload
|
||||||
text = payload.get("message", str(payload)) if isinstance(payload, dict) else str(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}
|
return {"service": CLOUD_RUN_SERVICE, "count": len(log_lines), "logs": log_lines}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"[get_logs] {e}", exc_info=True)
|
logger.error(f"[get_logs] {e}", exc_info=True)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user