fix: for crush
ci-front / build (push) Has been cancelled

This commit is contained in:
2026-04-04 20:05:25 +03:00
parent c6a9907822
commit 400ceab47c
2 changed files with 62 additions and 24 deletions
@@ -45,20 +45,17 @@ class AgentApiService {
} }
async searchLogs(filters?: LogFilters): Promise<LogEntry[]> { async searchLogs(filters?: LogFilters): Promise<LogEntry[]> {
const response = await apiClient.get<LogEntry[]>( const response = await apiClient.get<LogEntry[]>(this.logsBasePath, {
`${this.logsBasePath}/mock`, params: {
{ level: filters?.level,
params: { service: filters?.service,
level: filters?.level, agent: filters?.agent,
service: filters?.service, date_from: filters?.date_from,
agent: filters?.agent, date_to: filters?.date_to,
date_from: filters?.date_from, limit: filters?.limit ?? 100,
date_to: filters?.date_to, offset: filters?.offset ?? 0,
limit: filters?.limit ?? 100,
offset: filters?.offset ?? 0,
},
}, },
); });
return response.data; return response.data;
} }
+52 -11
View File
@@ -63,12 +63,20 @@ export const LogsPage: React.FC = () => {
try { try {
const filters = getFilters(); const filters = getFilters();
const data = await agentApiService.searchLogs(filters); const data = await agentApiService.searchLogs(filters);
if (!Array.isArray(data)) {
console.error("[Logs] Expected array, got:", typeof data);
setLogs([]);
setTotalLogs(0);
return;
}
setLogs(data); setLogs(data);
setTotalLogs(data.length); setTotalLogs(data.length);
} catch (err) { } catch (err) {
setError( setError(
err instanceof Error ? err.message : "Ошибка при загрузке логов", err instanceof Error ? err.message : "Ошибка при загрузке логов",
); );
setLogs([]);
setTotalLogs(0);
} finally { } finally {
setIsLoading(false); setIsLoading(false);
} }
@@ -76,14 +84,44 @@ export const LogsPage: React.FC = () => {
const fetchDistinctData = useCallback(async () => { const fetchDistinctData = useCallback(async () => {
try { try {
const [services, agents] = await Promise.all([ const [servicesResult, agentsResult] = await Promise.allSettled([
agentApiService.getDistinctServices(), agentApiService.getDistinctServices(),
agentApiService.getDistinctAgents(), agentApiService.getDistinctAgents(),
]); ]);
setAvailableServices(services);
setAvailableAgents(agents); if (
servicesResult.status === "fulfilled" &&
Array.isArray(servicesResult.value)
) {
setAvailableServices(servicesResult.value);
} else {
console.error(
"[Logs] Failed to fetch services:",
servicesResult.status === "rejected"
? servicesResult.reason
: "non-array response",
);
setAvailableServices([]);
}
if (
agentsResult.status === "fulfilled" &&
Array.isArray(agentsResult.value)
) {
setAvailableAgents(agentsResult.value);
} else {
console.error(
"[Logs] Failed to fetch agents:",
agentsResult.status === "rejected"
? agentsResult.reason
: "non-array response",
);
setAvailableAgents([]);
}
} catch (err) { } catch (err) {
console.error("Failed to fetch distinct data:", err); console.error("[Logs] Failed to fetch distinct data:", err);
setAvailableServices([]);
setAvailableAgents([]);
} }
}, []); }, []);
@@ -108,8 +146,10 @@ export const LogsPage: React.FC = () => {
setOffset(Math.max(0, offset - limit)); setOffset(Math.max(0, offset - limit));
}; };
const formatTimestamp = (timestamp: string) => { const formatTimestamp = (timestamp: string | undefined | null) => {
if (!timestamp) return "—";
const date = new Date(timestamp); const date = new Date(timestamp);
if (isNaN(date.getTime())) return "—";
return date.toLocaleString("ru-RU", { return date.toLocaleString("ru-RU", {
year: "numeric", year: "numeric",
month: "2-digit", month: "2-digit",
@@ -266,8 +306,9 @@ export const LogsPage: React.FC = () => {
</thead> </thead>
<tbody> <tbody>
{logs.map((log, index) => { {logs.map((log, index) => {
const level = log.level || "INFO";
const colors = const colors =
logLevelColors[log.level] || logLevelColors.INFO; logLevelColors[level] || logLevelColors.INFO;
return ( return (
<tr <tr
key={index} key={index}
@@ -295,27 +336,27 @@ export const LogsPage: React.FC = () => {
borderColor: colors.border, borderColor: colors.border,
}} }}
> >
{logLevelIcons[log.level]} {logLevelIcons[level]}
{log.level} {level}
</span> </span>
</td> </td>
<td <td
className="px-4 py-3 text-sm" className="px-4 py-3 text-sm"
style={{ color: "var(--text-primary)" }} style={{ color: "var(--text-primary)" }}
> >
{log.service} {log.service || "—"}
</td> </td>
<td <td
className="px-4 py-3 text-sm font-mono" className="px-4 py-3 text-sm font-mono"
style={{ color: "var(--text-primary)" }} style={{ color: "var(--text-primary)" }}
> >
{log.agent} {log.agent || "—"}
</td> </td>
<td <td
className="px-4 py-3 text-sm" className="px-4 py-3 text-sm"
style={{ color: "var(--text-primary)" }} style={{ color: "var(--text-primary)" }}
> >
{log.message} {log.message || "—"}
</td> </td>
</tr> </tr>
); );