Skip to content

Add collapsible failed task logs to prevent React error 185 - #54377

Merged
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs
Sep 4, 2025
Merged

Add collapsible failed task logs to prevent React error 185#54377
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs

Conversation

@dheerajturaga

@dheerajturagadheerajturaga commented Aug 11, 2025

Copy link
Copy Markdown
Member

This PR is an attempt to mitigate #52916. It does not "fix" the issue but prevents it from happening on the dag landing page.

  • Recent failed task logs now start collapsed by default
  • Added "Expand Logs"/"Hide Logs" toggle buttons with translations
  • Implemented lazy loading - logs only fetch when expanded
  • Prevents page crashes from large log content rendering
  • Increased log container max height from 100px to 200px
Minified.React.Error.mp4
image

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@potiuk , @pierrejeambrun I have this work around that will prevent the issue from happening on the DAG landing page. Please let me know if this is good.

Comment threadairflow-core/src/airflow/ui/public/i18n/locales/en/dag.json Outdated

@bbovenzibbovenzi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

Done! Ive made the changes. Please let me know if any other update is needed

@bbovenzi

Copy link
Copy Markdown
Contributor

I wonder if we still need this with #54462?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@bbovenzi , glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

@guan404ming

guan404ming commented Aug 18, 2025

Copy link
Copy Markdown
Member

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

Im not sure about that aswell. Say we limit to 5 failed tasks and have them expanded by default. If the user is interested in the 6th task that isn't displayed here, they would still have to make multiple clicks to get the desired error log. Having them all available in the landing page but collapsed for performance seems to be better IMO.

Open to feedback here.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@jason810496

jason810496 commented Aug 22, 2025

Copy link
Copy Markdown
Member

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

From the API server aspect, it would be better to just have one Streaming API Call to continuously stream the logs with #54552 fix.

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@pierrejeambrun , I have updated this to useLogs(limit=100) this should prevent the dag page ending up in a bad state.

@pierrejeambrun

Copy link
Copy Markdown
Member

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

Oh I didn't know that. I was naively thinking the log reading similarly to a file handler / file descriptor and that we we would be able to seek/tail the fail appropriately.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few suggestions before we can merge. Looking good otherwise.

Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun Thanks for the review! I updated the PR with your suggestions. Let me know if this looks good

dheerajturagaand others added 4 commits September 3, 2025 07:49
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
…ing, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Had to rebase to fix static check fails that was introduced and fixed on main by some other PRs

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, ready to merge.

@pierrejeambrun
pierrejeambrun merged commit 0578598 into apache:mainSep 4, 2025
56 checks passed
@pierrejeambrun

Copy link
Copy Markdown
Member

Backport will fail, need a manual one

@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-0-test. View the failure log Run details

StatusBranchResult
v3-0-testCommit Link

You can attempt to backport this manually by running:

cherry_picker 0578598 v3-0-test

This should apply the commit to the v3-0-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

@pierrejeambrun

Copy link
Copy Markdown
Member

Backport is not straight forward. This is not critical, marking for 3.1.0 which is just around the corner.

@pierrejeambrunpierrejeambrun added this to the Airflow 3.1.0 milestone Sep 4, 2025
@dheerajturaga
dheerajturaga deleted the lazy-load-fail-logs branch September 4, 2025 13:46
RoyLee1224 pushed a commit to RoyLee1224/airflow that referenced this pull request Sep 8, 2025
…4377)
* Add collapsible failed task logs to prevent React error 185
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
* Apply suggestion from @bbovenzi
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
* Add optional parameter to useLogs hook to truncate logs before rendering, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
* Pierre's Suggestions
---------
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@dheerajturaga@bbovenzi@guan404ming@jason810496@pierrejeambrun
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add collapsible failed task logs to prevent React error 185 by dheerajturaga · Pull Request #54377 · apache/airflow · GitHub
Skip to content

Add collapsible failed task logs to prevent React error 185 - #54377

Merged
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs
Sep 4, 2025
Merged

Add collapsible failed task logs to prevent React error 185#54377
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs

Conversation

@dheerajturaga

@dheerajturagadheerajturaga commented Aug 11, 2025

Copy link
Copy Markdown
Member

This PR is an attempt to mitigate #52916. It does not "fix" the issue but prevents it from happening on the dag landing page.

  • Recent failed task logs now start collapsed by default
  • Added "Expand Logs"/"Hide Logs" toggle buttons with translations
  • Implemented lazy loading - logs only fetch when expanded
  • Prevents page crashes from large log content rendering
  • Increased log container max height from 100px to 200px
Minified.React.Error.mp4
image

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@potiuk , @pierrejeambrun I have this work around that will prevent the issue from happening on the DAG landing page. Please let me know if this is good.

Comment threadairflow-core/src/airflow/ui/public/i18n/locales/en/dag.json Outdated

@bbovenzibbovenzi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

Done! Ive made the changes. Please let me know if any other update is needed

@bbovenzi

Copy link
Copy Markdown
Contributor

I wonder if we still need this with #54462?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@bbovenzi , glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

@guan404ming

guan404ming commented Aug 18, 2025

Copy link
Copy Markdown
Member

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

Im not sure about that aswell. Say we limit to 5 failed tasks and have them expanded by default. If the user is interested in the 6th task that isn't displayed here, they would still have to make multiple clicks to get the desired error log. Having them all available in the landing page but collapsed for performance seems to be better IMO.

Open to feedback here.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@jason810496

jason810496 commented Aug 22, 2025

Copy link
Copy Markdown
Member

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

From the API server aspect, it would be better to just have one Streaming API Call to continuously stream the logs with #54552 fix.

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@pierrejeambrun , I have updated this to useLogs(limit=100) this should prevent the dag page ending up in a bad state.

@pierrejeambrun

Copy link
Copy Markdown
Member

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

Oh I didn't know that. I was naively thinking the log reading similarly to a file handler / file descriptor and that we we would be able to seek/tail the fail appropriately.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few suggestions before we can merge. Looking good otherwise.

Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun Thanks for the review! I updated the PR with your suggestions. Let me know if this looks good

dheerajturagaand others added 4 commits September 3, 2025 07:49
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
…ing, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Had to rebase to fix static check fails that was introduced and fixed on main by some other PRs

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, ready to merge.

@pierrejeambrun
pierrejeambrun merged commit 0578598 into apache:mainSep 4, 2025
56 checks passed
@pierrejeambrun

Copy link
Copy Markdown
Member

Backport will fail, need a manual one

@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-0-test. View the failure log Run details

StatusBranchResult
v3-0-testCommit Link

You can attempt to backport this manually by running:

cherry_picker 0578598 v3-0-test

This should apply the commit to the v3-0-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

@pierrejeambrun

Copy link
Copy Markdown
Member

Backport is not straight forward. This is not critical, marking for 3.1.0 which is just around the corner.

@pierrejeambrunpierrejeambrun added this to the Airflow 3.1.0 milestone Sep 4, 2025
@dheerajturaga
dheerajturaga deleted the lazy-load-fail-logs branch September 4, 2025 13:46
RoyLee1224 pushed a commit to RoyLee1224/airflow that referenced this pull request Sep 8, 2025
…4377)
* Add collapsible failed task logs to prevent React error 185
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
* Apply suggestion from @bbovenzi
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
* Add optional parameter to useLogs hook to truncate logs before rendering, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
* Pierre's Suggestions
---------
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@dheerajturaga@bbovenzi@guan404ming@jason810496@pierrejeambrun
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add collapsible failed task logs to prevent React error 185 by dheerajturaga · Pull Request #54377 · apache/airflow · GitHub
Skip to content

Add collapsible failed task logs to prevent React error 185 - #54377

Merged
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs
Sep 4, 2025
Merged

Add collapsible failed task logs to prevent React error 185#54377
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs

Conversation

@dheerajturaga

@dheerajturagadheerajturaga commented Aug 11, 2025

Copy link
Copy Markdown
Member

This PR is an attempt to mitigate #52916. It does not "fix" the issue but prevents it from happening on the dag landing page.

  • Recent failed task logs now start collapsed by default
  • Added "Expand Logs"/"Hide Logs" toggle buttons with translations
  • Implemented lazy loading - logs only fetch when expanded
  • Prevents page crashes from large log content rendering
  • Increased log container max height from 100px to 200px
Minified.React.Error.mp4
image

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@potiuk , @pierrejeambrun I have this work around that will prevent the issue from happening on the DAG landing page. Please let me know if this is good.

Comment threadairflow-core/src/airflow/ui/public/i18n/locales/en/dag.json Outdated

@bbovenzibbovenzi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

Done! Ive made the changes. Please let me know if any other update is needed

@bbovenzi

Copy link
Copy Markdown
Contributor

I wonder if we still need this with #54462?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@bbovenzi , glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

@guan404ming

guan404ming commented Aug 18, 2025

Copy link
Copy Markdown
Member

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

Im not sure about that aswell. Say we limit to 5 failed tasks and have them expanded by default. If the user is interested in the 6th task that isn't displayed here, they would still have to make multiple clicks to get the desired error log. Having them all available in the landing page but collapsed for performance seems to be better IMO.

Open to feedback here.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@jason810496

jason810496 commented Aug 22, 2025

Copy link
Copy Markdown
Member

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

From the API server aspect, it would be better to just have one Streaming API Call to continuously stream the logs with #54552 fix.

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@pierrejeambrun , I have updated this to useLogs(limit=100) this should prevent the dag page ending up in a bad state.

@pierrejeambrun

Copy link
Copy Markdown
Member

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

Oh I didn't know that. I was naively thinking the log reading similarly to a file handler / file descriptor and that we we would be able to seek/tail the fail appropriately.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few suggestions before we can merge. Looking good otherwise.

Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun Thanks for the review! I updated the PR with your suggestions. Let me know if this looks good

dheerajturagaand others added 4 commits September 3, 2025 07:49
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
…ing, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Had to rebase to fix static check fails that was introduced and fixed on main by some other PRs

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, ready to merge.

@pierrejeambrun
pierrejeambrun merged commit 0578598 into apache:mainSep 4, 2025
56 checks passed
@pierrejeambrun

Copy link
Copy Markdown
Member

Backport will fail, need a manual one

@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-0-test. View the failure log Run details

StatusBranchResult
v3-0-testCommit Link

You can attempt to backport this manually by running:

cherry_picker 0578598 v3-0-test

This should apply the commit to the v3-0-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

@pierrejeambrun

Copy link
Copy Markdown
Member

Backport is not straight forward. This is not critical, marking for 3.1.0 which is just around the corner.

@pierrejeambrunpierrejeambrun added this to the Airflow 3.1.0 milestone Sep 4, 2025
@dheerajturaga
dheerajturaga deleted the lazy-load-fail-logs branch September 4, 2025 13:46
RoyLee1224 pushed a commit to RoyLee1224/airflow that referenced this pull request Sep 8, 2025
…4377)
* Add collapsible failed task logs to prevent React error 185
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
* Apply suggestion from @bbovenzi
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
* Add optional parameter to useLogs hook to truncate logs before rendering, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
* Pierre's Suggestions
---------
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@dheerajturaga@bbovenzi@guan404ming@jason810496@pierrejeambrun
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add collapsible failed task logs to prevent React error 185 by dheerajturaga · Pull Request #54377 · apache/airflow · GitHub
Skip to content

Add collapsible failed task logs to prevent React error 185 - #54377

Merged
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs
Sep 4, 2025
Merged

Add collapsible failed task logs to prevent React error 185#54377
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs

Conversation

@dheerajturaga

@dheerajturagadheerajturaga commented Aug 11, 2025

Copy link
Copy Markdown
Member

This PR is an attempt to mitigate #52916. It does not "fix" the issue but prevents it from happening on the dag landing page.

  • Recent failed task logs now start collapsed by default
  • Added "Expand Logs"/"Hide Logs" toggle buttons with translations
  • Implemented lazy loading - logs only fetch when expanded
  • Prevents page crashes from large log content rendering
  • Increased log container max height from 100px to 200px
Minified.React.Error.mp4
image

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@potiuk , @pierrejeambrun I have this work around that will prevent the issue from happening on the DAG landing page. Please let me know if this is good.

Comment threadairflow-core/src/airflow/ui/public/i18n/locales/en/dag.json Outdated

@bbovenzibbovenzi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

Done! Ive made the changes. Please let me know if any other update is needed

@bbovenzi

Copy link
Copy Markdown
Contributor

I wonder if we still need this with #54462?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@bbovenzi , glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

@guan404ming

guan404ming commented Aug 18, 2025

Copy link
Copy Markdown
Member

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

Im not sure about that aswell. Say we limit to 5 failed tasks and have them expanded by default. If the user is interested in the 6th task that isn't displayed here, they would still have to make multiple clicks to get the desired error log. Having them all available in the landing page but collapsed for performance seems to be better IMO.

Open to feedback here.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@jason810496

jason810496 commented Aug 22, 2025

Copy link
Copy Markdown
Member

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

From the API server aspect, it would be better to just have one Streaming API Call to continuously stream the logs with #54552 fix.

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@pierrejeambrun , I have updated this to useLogs(limit=100) this should prevent the dag page ending up in a bad state.

@pierrejeambrun

Copy link
Copy Markdown
Member

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

Oh I didn't know that. I was naively thinking the log reading similarly to a file handler / file descriptor and that we we would be able to seek/tail the fail appropriately.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few suggestions before we can merge. Looking good otherwise.

Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun Thanks for the review! I updated the PR with your suggestions. Let me know if this looks good

dheerajturagaand others added 4 commits September 3, 2025 07:49
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
…ing, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Had to rebase to fix static check fails that was introduced and fixed on main by some other PRs

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, ready to merge.

@pierrejeambrun
pierrejeambrun merged commit 0578598 into apache:mainSep 4, 2025
56 checks passed
@pierrejeambrun

Copy link
Copy Markdown
Member

Backport will fail, need a manual one

@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-0-test. View the failure log Run details

StatusBranchResult
v3-0-testCommit Link

You can attempt to backport this manually by running:

cherry_picker 0578598 v3-0-test

This should apply the commit to the v3-0-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

@pierrejeambrun

Copy link
Copy Markdown
Member

Backport is not straight forward. This is not critical, marking for 3.1.0 which is just around the corner.

@pierrejeambrunpierrejeambrun added this to the Airflow 3.1.0 milestone Sep 4, 2025
@dheerajturaga
dheerajturaga deleted the lazy-load-fail-logs branch September 4, 2025 13:46
RoyLee1224 pushed a commit to RoyLee1224/airflow that referenced this pull request Sep 8, 2025
…4377)
* Add collapsible failed task logs to prevent React error 185
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
* Apply suggestion from @bbovenzi
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
* Add optional parameter to useLogs hook to truncate logs before rendering, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
* Pierre's Suggestions
---------
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@dheerajturaga@bbovenzi@guan404ming@jason810496@pierrejeambrun
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Add collapsible failed task logs to prevent React error 185 by dheerajturaga · Pull Request #54377 · apache/airflow · GitHub
Skip to content

Add collapsible failed task logs to prevent React error 185 - #54377

Merged
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs
Sep 4, 2025
Merged

Add collapsible failed task logs to prevent React error 185#54377
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs

Conversation

@dheerajturaga

@dheerajturagadheerajturaga commented Aug 11, 2025

Copy link
Copy Markdown
Member

This PR is an attempt to mitigate #52916. It does not "fix" the issue but prevents it from happening on the dag landing page.

  • Recent failed task logs now start collapsed by default
  • Added "Expand Logs"/"Hide Logs" toggle buttons with translations
  • Implemented lazy loading - logs only fetch when expanded
  • Prevents page crashes from large log content rendering
  • Increased log container max height from 100px to 200px
Minified.React.Error.mp4
image

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@potiuk , @pierrejeambrun I have this work around that will prevent the issue from happening on the DAG landing page. Please let me know if this is good.

Comment threadairflow-core/src/airflow/ui/public/i18n/locales/en/dag.json Outdated

@bbovenzibbovenzi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

Done! Ive made the changes. Please let me know if any other update is needed

@bbovenzi

Copy link
Copy Markdown
Contributor

I wonder if we still need this with #54462?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@bbovenzi , glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

@guan404ming

guan404ming commented Aug 18, 2025

Copy link
Copy Markdown
Member

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

Im not sure about that aswell. Say we limit to 5 failed tasks and have them expanded by default. If the user is interested in the 6th task that isn't displayed here, they would still have to make multiple clicks to get the desired error log. Having them all available in the landing page but collapsed for performance seems to be better IMO.

Open to feedback here.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@jason810496

jason810496 commented Aug 22, 2025

Copy link
Copy Markdown
Member

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

From the API server aspect, it would be better to just have one Streaming API Call to continuously stream the logs with #54552 fix.

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@pierrejeambrun , I have updated this to useLogs(limit=100) this should prevent the dag page ending up in a bad state.

@pierrejeambrun

Copy link
Copy Markdown
Member

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

Oh I didn't know that. I was naively thinking the log reading similarly to a file handler / file descriptor and that we we would be able to seek/tail the fail appropriately.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few suggestions before we can merge. Looking good otherwise.

Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun Thanks for the review! I updated the PR with your suggestions. Let me know if this looks good

dheerajturagaand others added 4 commits September 3, 2025 07:49
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
…ing, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Had to rebase to fix static check fails that was introduced and fixed on main by some other PRs

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, ready to merge.

@pierrejeambrun
pierrejeambrun merged commit 0578598 into apache:mainSep 4, 2025
56 checks passed
@pierrejeambrun

Copy link
Copy Markdown
Member

Backport will fail, need a manual one

@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-0-test. View the failure log Run details

StatusBranchResult
v3-0-testCommit Link

You can attempt to backport this manually by running:

cherry_picker 0578598 v3-0-test

This should apply the commit to the v3-0-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

@pierrejeambrun

Copy link
Copy Markdown
Member

Backport is not straight forward. This is not critical, marking for 3.1.0 which is just around the corner.

@pierrejeambrunpierrejeambrun added this to the Airflow 3.1.0 milestone Sep 4, 2025
@dheerajturaga
dheerajturaga deleted the lazy-load-fail-logs branch September 4, 2025 13:46
RoyLee1224 pushed a commit to RoyLee1224/airflow that referenced this pull request Sep 8, 2025
…4377)
* Add collapsible failed task logs to prevent React error 185
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
* Apply suggestion from @bbovenzi
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
* Add optional parameter to useLogs hook to truncate logs before rendering, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
* Pierre's Suggestions
---------
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@dheerajturaga@bbovenzi@guan404ming@jason810496@pierrejeambrun
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add collapsible failed task logs to prevent React error 185 by dheerajturaga · Pull Request #54377 · apache/airflow · GitHub
Skip to content

Add collapsible failed task logs to prevent React error 185 - #54377

Merged
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs
Sep 4, 2025
Merged

Add collapsible failed task logs to prevent React error 185#54377
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs

Conversation

@dheerajturaga

@dheerajturagadheerajturaga commented Aug 11, 2025

Copy link
Copy Markdown
Member

This PR is an attempt to mitigate #52916. It does not "fix" the issue but prevents it from happening on the dag landing page.

  • Recent failed task logs now start collapsed by default
  • Added "Expand Logs"/"Hide Logs" toggle buttons with translations
  • Implemented lazy loading - logs only fetch when expanded
  • Prevents page crashes from large log content rendering
  • Increased log container max height from 100px to 200px
Minified.React.Error.mp4
image

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@potiuk , @pierrejeambrun I have this work around that will prevent the issue from happening on the DAG landing page. Please let me know if this is good.

Comment threadairflow-core/src/airflow/ui/public/i18n/locales/en/dag.json Outdated

@bbovenzibbovenzi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

Done! Ive made the changes. Please let me know if any other update is needed

@bbovenzi

Copy link
Copy Markdown
Contributor

I wonder if we still need this with #54462?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@bbovenzi , glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

@guan404ming

guan404ming commented Aug 18, 2025

Copy link
Copy Markdown
Member

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

Im not sure about that aswell. Say we limit to 5 failed tasks and have them expanded by default. If the user is interested in the 6th task that isn't displayed here, they would still have to make multiple clicks to get the desired error log. Having them all available in the landing page but collapsed for performance seems to be better IMO.

Open to feedback here.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@jason810496

jason810496 commented Aug 22, 2025

Copy link
Copy Markdown
Member

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

From the API server aspect, it would be better to just have one Streaming API Call to continuously stream the logs with #54552 fix.

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@pierrejeambrun , I have updated this to useLogs(limit=100) this should prevent the dag page ending up in a bad state.

@pierrejeambrun

Copy link
Copy Markdown
Member

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

Oh I didn't know that. I was naively thinking the log reading similarly to a file handler / file descriptor and that we we would be able to seek/tail the fail appropriately.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few suggestions before we can merge. Looking good otherwise.

Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun Thanks for the review! I updated the PR with your suggestions. Let me know if this looks good

dheerajturagaand others added 4 commits September 3, 2025 07:49
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
…ing, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Had to rebase to fix static check fails that was introduced and fixed on main by some other PRs

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, ready to merge.

@pierrejeambrun
pierrejeambrun merged commit 0578598 into apache:mainSep 4, 2025
56 checks passed
@pierrejeambrun

Copy link
Copy Markdown
Member

Backport will fail, need a manual one

@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-0-test. View the failure log Run details

StatusBranchResult
v3-0-testCommit Link

You can attempt to backport this manually by running:

cherry_picker 0578598 v3-0-test

This should apply the commit to the v3-0-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

@pierrejeambrun

Copy link
Copy Markdown
Member

Backport is not straight forward. This is not critical, marking for 3.1.0 which is just around the corner.

@pierrejeambrunpierrejeambrun added this to the Airflow 3.1.0 milestone Sep 4, 2025
@dheerajturaga
dheerajturaga deleted the lazy-load-fail-logs branch September 4, 2025 13:46
RoyLee1224 pushed a commit to RoyLee1224/airflow that referenced this pull request Sep 8, 2025
…4377)
* Add collapsible failed task logs to prevent React error 185
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
* Apply suggestion from @bbovenzi
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
* Add optional parameter to useLogs hook to truncate logs before rendering, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
* Pierre's Suggestions
---------
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@dheerajturaga@bbovenzi@guan404ming@jason810496@pierrejeambrun
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add collapsible failed task logs to prevent React error 185 by dheerajturaga · Pull Request #54377 · apache/airflow · GitHub
Skip to content

Add collapsible failed task logs to prevent React error 185 - #54377

Merged
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs
Sep 4, 2025
Merged

Add collapsible failed task logs to prevent React error 185#54377
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs

Conversation

@dheerajturaga

@dheerajturagadheerajturaga commented Aug 11, 2025

Copy link
Copy Markdown
Member

This PR is an attempt to mitigate #52916. It does not "fix" the issue but prevents it from happening on the dag landing page.

  • Recent failed task logs now start collapsed by default
  • Added "Expand Logs"/"Hide Logs" toggle buttons with translations
  • Implemented lazy loading - logs only fetch when expanded
  • Prevents page crashes from large log content rendering
  • Increased log container max height from 100px to 200px
Minified.React.Error.mp4
image

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@potiuk , @pierrejeambrun I have this work around that will prevent the issue from happening on the DAG landing page. Please let me know if this is good.

Comment threadairflow-core/src/airflow/ui/public/i18n/locales/en/dag.json Outdated

@bbovenzibbovenzi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

Done! Ive made the changes. Please let me know if any other update is needed

@bbovenzi

Copy link
Copy Markdown
Contributor

I wonder if we still need this with #54462?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@bbovenzi , glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

@guan404ming

guan404ming commented Aug 18, 2025

Copy link
Copy Markdown
Member

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

Im not sure about that aswell. Say we limit to 5 failed tasks and have them expanded by default. If the user is interested in the 6th task that isn't displayed here, they would still have to make multiple clicks to get the desired error log. Having them all available in the landing page but collapsed for performance seems to be better IMO.

Open to feedback here.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@jason810496

jason810496 commented Aug 22, 2025

Copy link
Copy Markdown
Member

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

From the API server aspect, it would be better to just have one Streaming API Call to continuously stream the logs with #54552 fix.

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@pierrejeambrun , I have updated this to useLogs(limit=100) this should prevent the dag page ending up in a bad state.

@pierrejeambrun

Copy link
Copy Markdown
Member

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

Oh I didn't know that. I was naively thinking the log reading similarly to a file handler / file descriptor and that we we would be able to seek/tail the fail appropriately.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few suggestions before we can merge. Looking good otherwise.

Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun Thanks for the review! I updated the PR with your suggestions. Let me know if this looks good

dheerajturagaand others added 4 commits September 3, 2025 07:49
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
…ing, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Had to rebase to fix static check fails that was introduced and fixed on main by some other PRs

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, ready to merge.

@pierrejeambrun
pierrejeambrun merged commit 0578598 into apache:mainSep 4, 2025
56 checks passed
@pierrejeambrun

Copy link
Copy Markdown
Member

Backport will fail, need a manual one

@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-0-test. View the failure log Run details

StatusBranchResult
v3-0-testCommit Link

You can attempt to backport this manually by running:

cherry_picker 0578598 v3-0-test

This should apply the commit to the v3-0-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

@pierrejeambrun

Copy link
Copy Markdown
Member

Backport is not straight forward. This is not critical, marking for 3.1.0 which is just around the corner.

@pierrejeambrunpierrejeambrun added this to the Airflow 3.1.0 milestone Sep 4, 2025
@dheerajturaga
dheerajturaga deleted the lazy-load-fail-logs branch September 4, 2025 13:46
RoyLee1224 pushed a commit to RoyLee1224/airflow that referenced this pull request Sep 8, 2025
…4377)
* Add collapsible failed task logs to prevent React error 185
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
* Apply suggestion from @bbovenzi
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
* Add optional parameter to useLogs hook to truncate logs before rendering, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
* Pierre's Suggestions
---------
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@dheerajturaga@bbovenzi@guan404ming@jason810496@pierrejeambrun
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Add collapsible failed task logs to prevent React error 185 by dheerajturaga · Pull Request #54377 · apache/airflow · GitHub
Skip to content

Add collapsible failed task logs to prevent React error 185 - #54377

Merged
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs
Sep 4, 2025
Merged

Add collapsible failed task logs to prevent React error 185#54377
pierrejeambrun merged 4 commits into
apache:mainfrom
dheerajturaga:lazy-load-fail-logs

Conversation

@dheerajturaga

@dheerajturagadheerajturaga commented Aug 11, 2025

Copy link
Copy Markdown
Member

This PR is an attempt to mitigate #52916. It does not "fix" the issue but prevents it from happening on the dag landing page.

  • Recent failed task logs now start collapsed by default
  • Added "Expand Logs"/"Hide Logs" toggle buttons with translations
  • Implemented lazy loading - logs only fetch when expanded
  • Prevents page crashes from large log content rendering
  • Increased log container max height from 100px to 200px
Minified.React.Error.mp4
image

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@potiuk , @pierrejeambrun I have this work around that will prevent the issue from happening on the DAG landing page. Please let me know if this is good.

Comment threadairflow-core/src/airflow/ui/public/i18n/locales/en/dag.json Outdated

@bbovenzibbovenzi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Let's move over to show/hide terminology and avoid the confusion with expand/collapse log groups. Otherwise lgtm

Done! Ive made the changes. Please let me know if any other update is needed

@bbovenzi

Copy link
Copy Markdown
Contributor

I wonder if we still need this with #54462?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@bbovenzi , glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

@guan404ming

guan404ming commented Aug 18, 2025

Copy link
Copy Markdown
Member

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

glad the original issue was resolved. I still think having these collapsed by default is useful incase there are dags with too many task failures. Given this is the default landing page for the dag its worth keeping the load times on this page fast

I think it would be clearer to show the error log directly instead of requiring an extra click. But I agree it could slow down load times if there are many error logs. How about limiting the number of displayed logs in overview page instead?

Im not sure about that aswell. Say we limit to 5 failed tasks and have them expanded by default. If the user is interested in the 6th task that isn't displayed here, they would still have to make multiple clicks to get the desired error log. Having them all available in the landing page but collapsed for performance seems to be better IMO.

Open to feedback here.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@jason810496

jason810496 commented Aug 22, 2025

Copy link
Copy Markdown
Member

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

From the API server aspect, it would be better to just have one Streaming API Call to continuously stream the logs with #54552 fix.

@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

If you try to do this with tasks that have big logs (10M) the collapsing will help, but after expanding a couple of them, the page still becomes unresponsive. (Without this, it's unresponsive/crash on load).

Yes, as mentionned by @guan404ming ideally I think on the 'overview' we only want to show a log sample, maybe the last 100 lines of the logs to be able to debug most cases, if not enough they will need to go specifically check the TI logs on the TI page to load full content. For now we can just do this truncation in the frontend. (for instance custom hook wrapping useLogs and truncating response based on a param right after the backend response is received, i.e onSuccess, useLogs(limit=100)).

The long term solution would be to implement a backend feature to be able to paginate logs as well as a read order (start to end, end to start), so we could read the most recent 100 lines of the log file and return that directly, I don't think we support that yet cc: @jason810496

@pierrejeambrun , I have updated this to useLogs(limit=100) this should prevent the dag page ending up in a bad state.

@pierrejeambrun

Copy link
Copy Markdown
Member

It could be possible, but the behavior will be quite heavy for API server. Since even we specify the "end to start" at the RestAPI level, the FileTaskHandler will still need to read from the beginning of the log stream then do the interleave and sorting stuff, and finally drop the output stream until "end to start" position before returning as API response.

Oh I didn't know that. I was naively thinking the log reading similarly to a file handler / file descriptor and that we we would be able to seek/tail the fail appropriately.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few suggestions before we can merge. Looking good otherwise.

Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx
Comment threadairflow-core/src/airflow/ui/src/queries/useLogs.tsx Outdated
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun Thanks for the review! I updated the PR with your suggestions. Let me know if this looks good

dheerajturagaand others added 4 commits September 3, 2025 07:49
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
…ing, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

Had to rebase to fix static check fails that was introduced and fixed on main by some other PRs

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, ready to merge.

@pierrejeambrun
pierrejeambrun merged commit 0578598 into apache:mainSep 4, 2025
56 checks passed
@pierrejeambrun

Copy link
Copy Markdown
Member

Backport will fail, need a manual one

@github-actions

Copy link
Copy Markdown
Contributor

Backport failed to create: v3-0-test. View the failure log Run details

StatusBranchResult
v3-0-testCommit Link

You can attempt to backport this manually by running:

cherry_picker 0578598 v3-0-test

This should apply the commit to the v3-0-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

@pierrejeambrun

Copy link
Copy Markdown
Member

Backport is not straight forward. This is not critical, marking for 3.1.0 which is just around the corner.

@pierrejeambrunpierrejeambrun added this to the Airflow 3.1.0 milestone Sep 4, 2025
@dheerajturaga
dheerajturaga deleted the lazy-load-fail-logs branch September 4, 2025 13:46
RoyLee1224 pushed a commit to RoyLee1224/airflow that referenced this pull request Sep 8, 2025
…4377)
* Add collapsible failed task logs to prevent React error 185
- Recent failed task logs now start collapsed by default
- Added "Expand Logs"/"Hide Logs" toggle buttons with translations
- Implemented lazy loading - logs only fetch when expanded
- Prevents page crashes from large log content rendering
- Increased log container max height from 100px to 200px
* Apply suggestion from @bbovenzi
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
* Add optional parameter to useLogs hook to truncate logs before rendering, preventing page unresponsiveness when expanding multiple large log previews. This addresses performance issues with tasks that have very large logs (10M+) while
maintaining the lazy loading behavior.
- Add limit parameter to useLogs hook Props interface
- Implement log truncation logic using useMemo for performance
- Update TaskLogPreview to use limit: 100 for overview display
- Preserve backward compatibility - existing usage without limit unchanged
* Pierre's Suggestions
---------
Co-authored-by: Brent Bovenzi <brent.bovenzi@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@dheerajturaga@bbovenzi@guan404ming@jason810496@pierrejeambrun