From cfe410998f4d1d537b51c8f86947120fc014efb1 Mon Sep 17 00:00:00 2001 From: Brent Bovenzi Date: Thu, 6 Mar 2025 16:13:24 -0500 Subject: [PATCH 1/2] Change style for task logger and allow filtering by logger --- airflow/ui/src/constants/searchParams.ts | 1 + .../ui/src/pages/TaskInstance/Logs/Logs.tsx | 3 + .../pages/TaskInstance/Logs/TaskLogHeader.tsx | 64 +++++++++++++++++-- airflow/ui/src/queries/useLogs.tsx | 54 ++++++++++++---- 4 files changed, 106 insertions(+), 16 deletions(-) diff --git a/airflow/ui/src/constants/searchParams.ts b/airflow/ui/src/constants/searchParams.ts index 821fb6d474460..cf8a9e873638f 100644 --- a/airflow/ui/src/constants/searchParams.ts +++ b/airflow/ui/src/constants/searchParams.ts @@ -22,6 +22,7 @@ export enum SearchParamsKeys { LAST_DAG_RUN_STATE = "last_dag_run_state", LIMIT = "limit", LOG_LEVEL = "log_level", + LOGGER = "logger", NAME_PATTERN = "name_pattern", OFFSET = "offset", PAUSED = "paused", diff --git a/airflow/ui/src/pages/TaskInstance/Logs/Logs.tsx b/airflow/ui/src/pages/TaskInstance/Logs/Logs.tsx index 5c7306381270e..a61b2d7330e5c 100644 --- a/airflow/ui/src/pages/TaskInstance/Logs/Logs.tsx +++ b/airflow/ui/src/pages/TaskInstance/Logs/Logs.tsx @@ -35,6 +35,7 @@ export const Logs = () => { const tryNumberParam = searchParams.get(SearchParamsKeys.TRY_NUMBER); const logLevelFilters = searchParams.getAll(SearchParamsKeys.LOG_LEVEL); + const loggerFilters = searchParams.getAll(SearchParamsKeys.LOGGER); const { data: taskInstance, @@ -76,6 +77,7 @@ export const Logs = () => { isLoading: isLoadingLogs, } = useLogs({ dagId, + loggerFilters, logLevelFilters, taskInstance, tryNumber: tryNumber === 0 ? 1 : tryNumber, @@ -84,6 +86,7 @@ export const Logs = () => { return ( ; readonly onSelectTryNumber: (tryNumber: number) => void; readonly taskInstance?: TaskInstanceResponse; readonly toggleFullscreen: () => void; @@ -39,6 +47,7 @@ type Props = { export const TaskLogHeader = ({ isFullscreen = false, + loggerOptions, onSelectTryNumber, taskInstance, toggleFullscreen, @@ -47,11 +56,21 @@ export const TaskLogHeader = ({ wrap, }: Props) => { const [searchParams, setSearchParams] = useSearchParams(); - + const loggers = searchParams.getAll(SearchParamsKeys.LOGGER); const logLevels = searchParams.getAll(SearchParamsKeys.LOG_LEVEL); const hasLogLevels = logLevels.length > 0; - const handleStateChange = useCallback( + const loggerOptionList = createListCollection<{ + label: string; + value: string; + }>({ + items: [ + { label: "All Loggers", value: "all" }, + ...(loggerOptions ?? []).map((logger) => ({ label: logger, value: logger })), + ], + }); + + const handleLevelChange = useCallback( ({ value }: SelectValueChangeDetails) => { const [val, ...rest] = value; @@ -68,6 +87,23 @@ export const TaskLogHeader = ({ [searchParams, setSearchParams], ); + const handleLoggerChange = useCallback( + ({ value }: SelectValueChangeDetails) => { + const [val, ...rest] = value; + + if ((val === undefined || val === "all") && rest.length === 0) { + searchParams.delete(SearchParamsKeys.LOGGER); + } else { + searchParams.delete(SearchParamsKeys.LOGGER); + value + .filter((state) => state !== "all") + .map((state) => searchParams.append(SearchParamsKeys.LOGGER, state)); + } + setSearchParams(searchParams); + }, + [searchParams, setSearchParams], + ); + return ( {taskInstance === undefined || tryNumber === undefined || taskInstance.try_number <= 1 ? undefined : ( @@ -82,7 +118,7 @@ export const TaskLogHeader = ({ collection={logLevelOptions} maxW="250px" multiple - onValueChange={handleStateChange} + onValueChange={handleLevelChange} value={hasLogLevels ? logLevels : ["all"]} > @@ -114,6 +150,26 @@ export const TaskLogHeader = ({ ))} + {loggerOptions !== undefined && loggerOptions.length > 0 ? ( + + + + + + {loggerOptionList.items.map((option) => ( + + {option.label} + + ))} + + + ) : undefined}