Explorar o código

fix: less strict zod schema validation

Soham Parekh %!s(int64=3) %!d(string=hai) anos
pai
achega
21e54d5956

+ 5 - 0
dashboard/package-lock.json

@@ -11610,6 +11610,11 @@
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
       "dev": true
+    },
+    "zod": {
+      "version": "3.20.2",
+      "resolved": "https://registry.npmjs.org/zod/-/zod-3.20.2.tgz",
+      "integrity": "sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ=="
     }
   }
 }

+ 2 - 1
dashboard/package.json

@@ -65,7 +65,8 @@
     "stacktrace-js": "^2.0.2",
     "styled-components": "^5.2.0",
     "traverse": "^0.6.7",
-    "valtio": "^1.2.4"
+    "valtio": "^1.2.4",
+    "zod": "^3.20.2"
   },
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",

+ 1 - 1
dashboard/src/main/home/cluster-dashboard/expanded-chart/logs-section/LogsSection.tsx

@@ -231,7 +231,7 @@ const LogsSection: React.FC<Props> = ({
         <Log key={[log.lineNumber, i].join(".")}>
           <span className="line-number">{log.lineNumber}.</span>
           <span className="line-timestamp">
-            {dayjs(log.timestamp).format("MMM D, YYYY HH:mm:ss")}
+            {log.timestamp ? dayjs(log.timestamp).format("MMM D, YYYY HH:mm:ss") : "-"}
           </span>
           <LogOuter key={[log.lineNumber, i].join(".")}>
             {log.line?.map((ansi, j) => {

+ 35 - 19
dashboard/src/main/home/cluster-dashboard/expanded-chart/logs-section/useAgentLogs.ts

@@ -1,6 +1,7 @@
 import Anser, { AnserJsonEntry } from "anser";
 import dayjs from "dayjs";
 import _ from "lodash";
+import { z } from "zod";
 import { useContext, useEffect, useRef, useState } from "react";
 import api from "shared/api";
 import { Context } from "shared/Context";
@@ -20,33 +21,48 @@ export enum Direction {
 export interface Log {
   line: AnserJsonEntry[];
   lineNumber: number;
-  timestamp: string;
+  timestamp?: string;
 }
 
-interface LogLine {
-  log: string;
-  stream: string;
-  time: string;
-}
+const LogSchema = z.object({
+  log: z.string(),
+  stream: z.string(),
+  time: z.string(),
+});
+
+type LogLine = z.infer<typeof LogSchema>;
 
 export const parseLogs = (logs: string[] = []): Log[] => {
-  return logs
-    .filter(Boolean)
-    .filter(isJSON)
-    .map((logLine: string, idx) => {
-      try {
-        const parsedLine: LogLine = JSON.parse(logLine);
-        // TODO Move log parsing to the render method
-        const ansiLog = Anser.ansiToJson(parsedLine.log);
+  return logs.filter(Boolean).map((logLine: string, idx) => {
+    try {
+      if (!isJSON(logLine)) {
         return {
-          line: ansiLog,
+          line: Anser.ansiToJson(logLine),
           lineNumber: idx + 1,
-          timestamp: parsedLine.time,
+          timestamp: undefined,
         };
-      } catch (err) {
-        console.error(err, logLine);
       }
-    });
+
+      const parsedLine: LogLine = JSON.parse(logLine);
+
+      LogSchema.parse(parsedLine);
+
+      // TODO Move log parsing to the render method
+      const ansiLog = Anser.ansiToJson(parsedLine.log);
+      return {
+        line: ansiLog,
+        lineNumber: idx + 1,
+        timestamp: parsedLine.time,
+      };
+    } catch (err) {
+      console.error(err, logLine);
+      return {
+        line: Anser.ansiToJson(logLine),
+        lineNumber: idx + 1,
+        timestamp: undefined,
+      };
+    }
+  });
 };
 
 interface PaginationInfo {