{"record":{"id":"58b5c750c330f23c","repo":"apache/superset","slug":"screenshot-failed-aborting-to-avoid-sending-a-par","errorCode":null,"errorMessage":"Screenshot failed; aborting to avoid sending a partial report","messagePattern":"Screenshot failed; aborting to avoid sending a partial report","errorType":"exception","errorClass":"ReportScheduleScreenshotFailedError","httpStatus":500,"severity":"error","filePath":"superset/commands/report/execute.py","lineNumber":787,"sourceCode":"            screenshots = [\n                DashboardScreenshot(\n                    url,\n                    self._report_schedule.dashboard.digest,\n                    window_size=window_size,\n                    thumb_size=app.config[\"WEBDRIVER_WINDOW\"][\"dashboard\"],\n                )\n                for url in urls\n            ]\n        try:\n            imges = []\n            for screenshot in screenshots:\n                imge = screenshot.get_screenshot(\n                    user=user,\n                    log_context=self._log_context,\n                    report_execution_context=self._report_execution_context,\n                )\n                if imge is None:\n                    raise ReportScheduleScreenshotFailedError(\n                        \"Screenshot failed; aborting to avoid sending a partial report\"\n                    )\n                imges.append(imge)\n            elapsed_seconds: float = (\n                datetime.now(timezone.utc).replace(tzinfo=None) - start_time\n            ).total_seconds()\n            logger.info(\n                \"report_capture_complete %s elapsed_seconds=%.2f \"\n                \"remaining_seconds=%s screenshot_count=%s\",\n                self._log_context,\n                elapsed_seconds,\n                (\n                    f\"{self._report_execution_context.deadline.remaining_seconds:.2f}\"\n                    if self._report_execution_context\n                    else None\n                ),\n                len(imges),\n            )","sourceCodeStart":769,"sourceCodeEnd":805,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset/commands/report/execute.py#L769-L805","documentation":"ReportScheduleScreenshotFailedError('Screenshot failed; aborting to avoid sending a partial report'): in _get_screenshots each screenshot.playwright capture returns via get_screenshot; a None result (playwright wrapper signaling failure without an exception) triggers this raise so a multi-URL report does not email some panels and silently omit others.","triggerScenarios":"Tabbed dashboard reports where one tab's screenshot.get_screenshot returns None (playwright page crash, navigation failure, target element missing); rate-limited or memory-starved playwright worker returning None instead of raising.","commonSituations":"Heavy dashboards under worker memory pressure; flaky internal network between worker and the screenshot service; playwright/browser version mismatch after upgrades.","solutions":["Re-run the schedule — transient playwright failures usually succeed on retry","Check worker logs for playwright errors near the failure; raise SCREENSHOT_* timeouts or worker memory if pages crash","Reduce tab count or dashboard weight (fewer/faster charts) if the failure is consistent on one specific tab"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    screenshots = _get_screenshots()\nexcept ReportScheduleScreenshotFailedError as ex:\n    if 'partial report' in str(ex):\n        retry_with_backoff(_get_screenshots, attempts=2)  # transient playwright flake\n    else:\n        raise","preventionTips":["Keep playwright/browser versions pinned and matched to the wrapper","Size worker memory for the heaviest dashboard render","Alert on 'partial report' failures per schedule so owners learn their tab fails"],"tags":["alerts-reports","screenshot","playwright","execution"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}