diff --git a/agents/mcp_server/server.py b/agents/mcp_server/server.py index 81876fa..71011ca 100644 --- a/agents/mcp_server/server.py +++ b/agents/mcp_server/server.py @@ -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)