Skip to content

Commit 5350dfe

Browse files
committed
extracted log utils for duplicated logic
1 parent 2d78dde commit 5350dfe

File tree

7 files changed

+63
-111
lines changed

7 files changed

+63
-111
lines changed

apps/webapp/app/components/logs/LogDetailView.tsx

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { useEnvironment } from "~/hooks/useEnvironment";
2121
import { useOrganization } from "~/hooks/useOrganizations";
2222
import { useProject } from "~/hooks/useProject";
2323
import type { LogEntry } from "~/presenters/v3/LogsListPresenter.server";
24+
import { getLevelColor } from "~/utils/logUtils";
2425
import { v3RunSpanPath, v3RunsPath, v3BatchPath, v3RunPath, v3DeploymentVersionPath } from "~/utils/pathBuilder";
2526
import type { loader as logDetailLoader } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs.$logId";
2627
import { TaskRunStatusCombo, descriptionForTaskRunStatus } from "~/components/runs/v3/TaskRunStatus";
@@ -68,26 +69,6 @@ type LogDetailViewProps = {
6869

6970
type TabType = "details" | "run";
7071

71-
// Level badge color styles
72-
function getLevelColor(level: string): string {
73-
switch (level) {
74-
case "ERROR":
75-
return "text-error bg-error/10 border-error/20";
76-
case "WARN":
77-
return "text-warning bg-warning/10 border-warning/20";
78-
case "DEBUG":
79-
return "text-charcoal-400 bg-charcoal-700 border-charcoal-600";
80-
case "INFO":
81-
return "text-blue-400 bg-blue-500/10 border-blue-500/20";
82-
case "TRACE":
83-
return "text-charcoal-500 bg-charcoal-800 border-charcoal-700";
84-
case "CANCELLED":
85-
return "text-charcoal-400 bg-charcoal-700 border-charcoal-600";
86-
default:
87-
return "text-text-dimmed bg-charcoal-750 border-charcoal-700";
88-
}
89-
}
90-
9172
// Event kind badge color styles
9273
function getKindColor(kind: string): string {
9374
if (kind === "SPAN") {

apps/webapp/app/components/logs/LogsTable.tsx

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { useEnvironment } from "~/hooks/useEnvironment";
77
import { useOrganization } from "~/hooks/useOrganizations";
88
import { useProject } from "~/hooks/useProject";
99
import type { LogEntry, LogsListAppliedFilters } from "~/presenters/v3/LogsListPresenter.server";
10+
import { getLevelColor } from "~/utils/logUtils";
1011
import { v3RunSpanPath } from "~/utils/pathBuilder";
1112
import { DateTime } from "../primitives/DateTime";
1213
import { Paragraph } from "../primitives/Paragraph";
@@ -39,26 +40,6 @@ type LogsTableProps = {
3940
onLogSelect?: (logId: string) => void;
4041
};
4142

42-
// Level badge color styles
43-
function getLevelColor(level: LogEntry["level"]): string {
44-
switch (level) {
45-
case "ERROR":
46-
return "text-error bg-error/10 border-error/20";
47-
case "WARN":
48-
return "text-warning bg-warning/10 border-warning/20";
49-
case "DEBUG":
50-
return "text-charcoal-400 bg-charcoal-700 border-charcoal-600";
51-
case "INFO":
52-
return "text-blue-400 bg-blue-500/10 border-blue-500/20";
53-
case "TRACE":
54-
return "text-charcoal-500 bg-charcoal-800 border-charcoal-700";
55-
case "CANCELLED":
56-
return "text-charcoal-400 bg-charcoal-700 border-charcoal-600";
57-
default:
58-
return "text-text-dimmed bg-charcoal-750 border-charcoal-700";
59-
}
60-
}
61-
6243
// Left border color for error highlighting
6344
function getLevelBorderColor(level: LogEntry["level"]): string {
6445
switch (level) {

apps/webapp/app/presenters/v3/LogDetailPresenter.server.ts

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { type ClickHouse } from "@internal/clickhouse";
22
import { type PrismaClientOrTransaction } from "@trigger.dev/database";
33
import { convertClickhouseDateTime64ToJsDate } from "~/v3/eventRepository/clickhouseEventRepository.server";
4+
import { kindToLevel } from "~/utils/logUtils";
45

56
export type LogDetailOptions = {
67
environmentId: string;
@@ -14,38 +15,6 @@ export type LogDetailOptions = {
1415

1516
export type LogDetail = Awaited<ReturnType<LogDetailPresenter["call"]>>;
1617

17-
// Convert ClickHouse kind to display level
18-
type LogLevel = "TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "CANCELLED";
19-
20-
function kindToLevel(kind: string, status: string): LogLevel {
21-
// CANCELLED status takes precedence
22-
if (status === "CANCELLED") {
23-
return "CANCELLED";
24-
}
25-
26-
// ERROR can come from either kind or status
27-
if (kind === "LOG_ERROR" || status === "ERROR") {
28-
return "ERROR";
29-
}
30-
31-
switch (kind) {
32-
case "DEBUG_EVENT":
33-
case "LOG_DEBUG":
34-
return "DEBUG";
35-
case "LOG_INFO":
36-
return "INFO";
37-
case "LOG_WARN":
38-
return "WARN";
39-
case "LOG_LOG":
40-
return "INFO"; // Changed from "LOG"
41-
case "SPAN":
42-
case "ANCESTOR_OVERRIDE":
43-
case "SPAN_EVENT":
44-
default:
45-
return "TRACE";
46-
}
47-
}
48-
4918
export class LogDetailPresenter {
5019
constructor(
5120
private readonly replica: PrismaClientOrTransaction,

apps/webapp/app/presenters/v3/LogPresenter.server.ts

Whitespace-only changes.

apps/webapp/app/presenters/v3/LogsListPresenter.server.ts

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ import {
1717
convertDateToClickhouseDateTime,
1818
convertClickhouseDateTime64ToJsDate,
1919
} from "~/v3/eventRepository/clickhouseEventRepository.server";
20+
import { kindToLevel, type LogLevel } from "~/utils/logUtils";
2021

21-
export type LogLevel = "TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "CANCELLED";
22+
export type { LogLevel };
2223

2324
export type LogsListOptions = {
2425
userId?: string;
@@ -77,35 +78,6 @@ function decodeCursor(cursor: string): LogCursor | null {
7778
}
7879
}
7980

80-
// Convert ClickHouse kind to display level
81-
function kindToLevel(kind: string, status: string): LogLevel {
82-
if (status === "CANCELLED") {
83-
return "CANCELLED";
84-
}
85-
86-
// ERROR can come from either kind or status
87-
if (kind === "LOG_ERROR" || status === "ERROR") {
88-
return "ERROR";
89-
}
90-
91-
switch (kind) {
92-
case "DEBUG_EVENT":
93-
case "LOG_DEBUG":
94-
return "DEBUG";
95-
case "LOG_INFO":
96-
return "INFO";
97-
case "LOG_WARN":
98-
return "WARN";
99-
case "LOG_LOG":
100-
return "INFO"; // Changed from "LOG"
101-
case "SPAN":
102-
case "ANCESTOR_OVERRIDE":
103-
case "SPAN_EVENT":
104-
default:
105-
return "TRACE";
106-
}
107-
}
108-
10981
// Convert display level to ClickHouse kinds and statuses
11082
function levelToKindsAndStatuses(
11183
level: LogLevel

apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs/route.tsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import { EnvironmentParamSchema } from "~/utils/pathBuilder";
1212
import { findProjectBySlug } from "~/models/project.server";
1313
import { findEnvironmentBySlug } from "~/models/runtimeEnvironment.server";
1414
import { getRunFiltersFromRequest } from "~/presenters/RunFilters.server";
15-
import { LogsListPresenter, type LogLevel } from "~/presenters/v3/LogsListPresenter.server";
15+
import { LogsListPresenter } from "~/presenters/v3/LogsListPresenter.server";
16+
import type { LogLevel } from "~/utils/logUtils";
1617
import { $replica } from "~/db.server";
1718
import { clickhouseClient } from "~/services/clickhouseInstance.server";
1819
import {
@@ -153,7 +154,6 @@ export default function Page() {
153154
<LogsList
154155
list={list}
155156
rootOnlyDefault={rootOnlyDefault}
156-
filters={filters}
157157
isAdmin={isAdmin}
158158
showDebug={showDebug}
159159
/>
@@ -174,7 +174,6 @@ function LogsList({
174174
}: {
175175
list: Awaited<UseDataFunctionReturn<typeof loader>["data"]>;
176176
rootOnlyDefault: boolean;
177-
filters: TaskRunListSearchFilters;
178177
isAdmin: boolean;
179178
showDebug: boolean;
180179
}) {
@@ -213,17 +212,17 @@ function LogsList({
213212
setNextCursor(list.pagination.next);
214213
}, [list.logs, list.pagination.next]);
215214

215+
// Memoize existing IDs to avoid creating a new Set on every render
216+
const existingIds = useMemo(() => new Set(accumulatedLogs.map((log) => log.id)), [accumulatedLogs]);
217+
216218
// Append new logs when fetcher completes (with deduplication)
217219
useEffect(() => {
218220
if (fetcher.data && fetcher.state === "idle") {
219-
setAccumulatedLogs((prev) => {
220-
const existingIds = new Set(prev.map((log) => log.id));
221-
const newLogs = fetcher.data!.logs.filter((log) => !existingIds.has(log.id));
222-
return [...prev, ...newLogs];
223-
});
221+
const newLogs = fetcher.data.logs.filter((log) => !existingIds.has(log.id));
222+
setAccumulatedLogs((prev) => [...prev, ...newLogs]);
224223
setNextCursor(fetcher.data.pagination.next);
225224
}
226-
}, [fetcher.data, fetcher.state]);
225+
}, [fetcher.data, fetcher.state, existingIds]);
227226

228227
// Build resource URL for loading more
229228
const loadMoreUrl = useMemo(() => {

apps/webapp/app/utils/logUtils.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
export type LogLevel = "TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR" | "CANCELLED";
2+
3+
// Convert ClickHouse kind to display level
4+
export function kindToLevel(kind: string, status: string): LogLevel {
5+
if (status === "CANCELLED") {
6+
return "CANCELLED";
7+
}
8+
9+
// ERROR can come from either kind or status
10+
if (kind === "LOG_ERROR" || status === "ERROR") {
11+
return "ERROR";
12+
}
13+
14+
switch (kind) {
15+
case "DEBUG_EVENT":
16+
case "LOG_DEBUG":
17+
return "DEBUG";
18+
case "LOG_INFO":
19+
return "INFO";
20+
case "LOG_WARN":
21+
return "WARN";
22+
case "LOG_LOG":
23+
return "INFO"; // Changed from "LOG"
24+
case "SPAN":
25+
case "ANCESTOR_OVERRIDE":
26+
case "SPAN_EVENT":
27+
default:
28+
return "TRACE";
29+
}
30+
}
31+
32+
// Level badge color styles
33+
export function getLevelColor(level: LogLevel): string {
34+
switch (level) {
35+
case "ERROR":
36+
return "text-error bg-error/10 border-error/20";
37+
case "WARN":
38+
return "text-warning bg-warning/10 border-warning/20";
39+
case "DEBUG":
40+
return "text-charcoal-400 bg-charcoal-700 border-charcoal-600";
41+
case "INFO":
42+
return "text-blue-400 bg-blue-500/10 border-blue-500/20";
43+
case "TRACE":
44+
return "text-charcoal-500 bg-charcoal-800 border-charcoal-700";
45+
case "CANCELLED":
46+
return "text-charcoal-400 bg-charcoal-700 border-charcoal-600";
47+
default:
48+
return "text-text-dimmed bg-charcoal-750 border-charcoal-700";
49+
}
50+
}

0 commit comments

Comments
 (0)