diff --git a/airflow/www/static/js/api/useTaskLog.ts b/airflow/www/static/js/api/useTaskLog.ts index bbb6395878b4f..53e0e57ca4add 100644 --- a/airflow/www/static/js/api/useTaskLog.ts +++ b/airflow/www/static/js/api/useTaskLog.ts @@ -32,7 +32,7 @@ interface Props extends API.GetLogVariables { } const useTaskLog = ({ - dagId, dagRunId, taskId, taskTryNumber, mapIndex, fullContent, state, + dagId, dagRunId, taskId, taskTryNumber, mapIndex, fullContent = false, state, }: Props) => { let url: string = ''; const [isPreviousStatePending, setPrevState] = useState(true); diff --git a/airflow/www/static/js/dag/details/taskInstance/Logs/index.test.tsx b/airflow/www/static/js/dag/details/taskInstance/Logs/index.test.tsx index 10d1c48863a16..19fd3ee95372c 100644 --- a/airflow/www/static/js/dag/details/taskInstance/Logs/index.test.tsx +++ b/airflow/www/static/js/dag/details/taskInstance/Logs/index.test.tsx @@ -81,7 +81,6 @@ describe('Test Logs Component.', () => { expect(useTaskLogMock).toHaveBeenLastCalledWith({ dagId: 'dummyDagId', dagRunId: 'dummyDagRunId', - fullContent: false, taskId: 'dummyTaskId', taskTryNumber: 2, }); @@ -141,7 +140,6 @@ describe('Test Logs Component.', () => { expect(useTaskLogMock).toHaveBeenLastCalledWith({ dagId: 'dummyDagId', dagRunId: 'dummyDagRunId', - fullContent: false, mapIndex: 1, taskId: 'dummyTaskId', taskTryNumber: 2, @@ -168,7 +166,6 @@ describe('Test Logs Component.', () => { expect(useTaskLogMock).toHaveBeenLastCalledWith({ dagId: 'dummyDagId', dagRunId: 'dummyDagRunId', - fullContent: false, taskId: 'dummyTaskId', taskTryNumber: 2, }); @@ -179,40 +176,8 @@ describe('Test Logs Component.', () => { expect(useTaskLogMock).toHaveBeenLastCalledWith({ dagId: 'dummyDagId', dagRunId: 'dummyDagRunId', - fullContent: false, taskId: 'dummyTaskId', taskTryNumber: 1, }); }); - - test('Test Logs Full Content', () => { - const tryNumber = 2; - const { getByTestId } = render( - , - ); - expect(useTaskLogMock).toHaveBeenLastCalledWith({ - dagId: 'dummyDagId', - dagRunId: 'dummyDagRunId', - fullContent: false, - taskId: 'dummyTaskId', - taskTryNumber: 2, - }); - const fullContentCheckbox = getByTestId('full-content-checkbox'); - - fireEvent.click(fullContentCheckbox); - - expect(useTaskLogMock).toHaveBeenLastCalledWith({ - dagId: 'dummyDagId', - dagRunId: 'dummyDagRunId', - fullContent: true, - taskId: 'dummyTaskId', - taskTryNumber: 2, - }); - }); }); diff --git a/airflow/www/static/js/dag/details/taskInstance/Logs/index.tsx b/airflow/www/static/js/dag/details/taskInstance/Logs/index.tsx index 0139d8e22392a..5ebf7b2a9848b 100644 --- a/airflow/www/static/js/dag/details/taskInstance/Logs/index.tsx +++ b/airflow/www/static/js/dag/details/taskInstance/Logs/index.tsx @@ -27,7 +27,9 @@ import { Divider, Button, Checkbox, + Icon, } from '@chakra-ui/react'; +import { MdWarning } from 'react-icons/md'; import { getMetaValue } from 'src/utils'; import useTaskLog from 'src/api/useTaskLog'; @@ -102,7 +104,6 @@ const Logs = ({ }: Props) => { const [internalIndexes, externalIndexes] = getLinkIndexes(tryNumber); const [selectedTryNumber, setSelectedTryNumber] = useState(); - const [shouldRequestFullContent, setShouldRequestFullContent] = useState(false); const [wrap, setWrap] = useState(getMetaValue('default_wrap') === 'True'); const [logLevelFilters, setLogLevelFilters] = useState>([]); const [fileSourceFilters, setFileSourceFilters] = useState>([]); @@ -115,7 +116,6 @@ const Logs = ({ taskId, mapIndex, taskTryNumber, - fullContent: shouldRequestFullContent, state, }); @@ -128,7 +128,11 @@ const Logs = ({ params.append('map_index', mapIndex.toString()); } - const { parsedLogs, fileSources = [] } = useMemo( + const { + parsedLogs, + fileSources = [], + warning, + } = useMemo( () => parseLogs( data, timezone, @@ -222,13 +226,6 @@ const Logs = ({ > Wrap - setShouldRequestFullContent((previousState) => !previousState)} - px={4} - data-testid="full-content-checkbox" - > - Full Logs - + {!!warning && ( + + + + {warning} + + + )} {!!parsedLogs && ( = []; @@ -87,5 +90,17 @@ export const parseLogs = ( } }); - return { parsedLogs: parsedLines.join('\n'), fileSources: Array.from(fileSources).sort() }; + return { + parsedLogs: parsedLines + .map((l) => { + if (l.length >= 1000000) { + warning = 'Large log file. Some lines have been truncated. Download logs in order to see everything.'; + return `${l.slice(0, 1000000)}...`; + } + return l; + }) + .join('\n'), + fileSources: Array.from(fileSources).sort(), + warning, + }; };