From 23f00c6a2920a1fb8d7511b02c5c3fdcfe413323 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 24 Feb 2022 09:54:26 +0100 Subject: [PATCH] [Reporting] Give users better information when pdf fails (#126171) * raise pdf worker out memory error to common errors * not having a PDF buffer for a PDF report should fail the report * remove unused import * make it possible to format Reporting errors nicely * make pdf v1 behave the same way as v2 regarding not compiling a PDF * remove unused import Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/reporting/common/errors/index.ts | 14 ++++++++++++++ .../server/export_types/common/pdf/index.ts | 1 - .../common/pdf/integration_tests/pdfmaker.test.ts | 2 +- .../server/export_types/common/pdf/pdfmaker.ts | 2 +- .../export_types/common/pdf/pdfmaker_errors.ts | 13 ------------- .../export_types/printable_pdf/lib/generate_pdf.ts | 11 ++--------- .../printable_pdf_v2/lib/generate_pdf.ts | 10 +--------- .../reporting/server/lib/tasks/execute_report.ts | 5 +++-- 8 files changed, 22 insertions(+), 36 deletions(-) delete mode 100644 x-pack/plugins/reporting/server/export_types/common/pdf/pdfmaker_errors.ts diff --git a/x-pack/plugins/reporting/common/errors/index.ts b/x-pack/plugins/reporting/common/errors/index.ts index 3c0ade0ead7e3b..6064eca33ed7bc 100644 --- a/x-pack/plugins/reporting/common/errors/index.ts +++ b/x-pack/plugins/reporting/common/errors/index.ts @@ -7,6 +7,7 @@ /* eslint-disable max-classes-per-file */ +import { i18n } from '@kbn/i18n'; export abstract class ReportingError extends Error { public abstract code: string; @@ -45,6 +46,19 @@ export class UnknownError extends ReportingError { code = 'unknown_error'; } +export class PdfWorkerOutOfMemoryError extends ReportingError { + code = 'pdf_worker_out_of_memory_error'; + + details = i18n.translate('xpack.reporting.common.pdfWorkerOutOfMemoryErrorMessage', { + defaultMessage: + 'Cannot generate PDF due to low memory. Consider making a smaller PDF before retrying this report.', + }); + + public override get message(): string { + return this.details; + } +} + // TODO: Add ReportingError for Kibana stopping unexpectedly // TODO: Add ReportingError for missing Chromium dependencies // TODO: Add ReportingError for missing Chromium dependencies diff --git a/x-pack/plugins/reporting/server/export_types/common/pdf/index.ts b/x-pack/plugins/reporting/server/export_types/common/pdf/index.ts index 1f7f2e21a45a27..e4a1680a958dd2 100644 --- a/x-pack/plugins/reporting/server/export_types/common/pdf/index.ts +++ b/x-pack/plugins/reporting/server/export_types/common/pdf/index.ts @@ -6,4 +6,3 @@ */ export { PdfMaker } from './pdfmaker'; -export { PdfWorkerOutOfMemoryError } from './pdfmaker_errors'; diff --git a/x-pack/plugins/reporting/server/export_types/common/pdf/integration_tests/pdfmaker.test.ts b/x-pack/plugins/reporting/server/export_types/common/pdf/integration_tests/pdfmaker.test.ts index 4b35e0221685be..5302ba07f60020 100644 --- a/x-pack/plugins/reporting/server/export_types/common/pdf/integration_tests/pdfmaker.test.ts +++ b/x-pack/plugins/reporting/server/export_types/common/pdf/integration_tests/pdfmaker.test.ts @@ -10,8 +10,8 @@ import path from 'path'; import { isUint8Array } from 'util/types'; import { createMockLayout } from '../../../../../../screenshotting/server/layouts/mock'; +import { PdfWorkerOutOfMemoryError } from '../../../../../common/errors'; import { PdfMaker } from '../'; -import { PdfWorkerOutOfMemoryError } from '../pdfmaker_errors'; const imageBase64 = Buffer.from( `iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAAGFBMVEXy8vJpaWn7+/vY2Nj39/cAAACcnJzx8fFvt0oZAAAAi0lEQVR4nO3SSQoDIBBFwR7U3P/GQXKEIIJULXr9H3TMrHhX5Yysvj3jjM8+XRnVa9wec8QuHKv3h74Z+PNyGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/xu3Bxy026rXu4ljdUVW395xUFfGzLo946DK+QW+bgCTFcecSAAAAABJRU5ErkJggg==`, diff --git a/x-pack/plugins/reporting/server/export_types/common/pdf/pdfmaker.ts b/x-pack/plugins/reporting/server/export_types/common/pdf/pdfmaker.ts index 18e5346f71c40d..6685cf692ef59a 100644 --- a/x-pack/plugins/reporting/server/export_types/common/pdf/pdfmaker.ts +++ b/x-pack/plugins/reporting/server/export_types/common/pdf/pdfmaker.ts @@ -10,6 +10,7 @@ import path from 'path'; import { Content, ContentImage, ContentText } from 'pdfmake/interfaces'; import { MessageChannel, MessagePort, Worker } from 'worker_threads'; import type { Layout } from '../../../../../screenshotting/server'; +import { PdfWorkerOutOfMemoryError } from '../../../../common/errors'; import { headingHeight, pageMarginBottom, @@ -20,7 +21,6 @@ import { } from './constants'; import { REPORTING_TABLE_LAYOUT } from './get_doc_options'; import { getFont } from './get_font'; -import { PdfWorkerOutOfMemoryError } from './pdfmaker_errors'; import type { GeneratePdfRequest, GeneratePdfResponse, WorkerData } from './worker'; // Ensure that all dependencies are included in the release bundle. diff --git a/x-pack/plugins/reporting/server/export_types/common/pdf/pdfmaker_errors.ts b/x-pack/plugins/reporting/server/export_types/common/pdf/pdfmaker_errors.ts deleted file mode 100644 index d55921d791aded..00000000000000 --- a/x-pack/plugins/reporting/server/export_types/common/pdf/pdfmaker_errors.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export class PdfWorkerOutOfMemoryError extends Error { - constructor(message: string) { - super(message); - this.name = 'PdfWorkerOutOfMemoryError'; - } -} diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf/lib/generate_pdf.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf/lib/generate_pdf.ts index 459887ebb81187..a401f59b8f4bf0 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf/lib/generate_pdf.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf/lib/generate_pdf.ts @@ -13,7 +13,7 @@ import type { PdfMetrics } from '../../../../common/types'; import { ReportingCore } from '../../../'; import { LevelLogger } from '../../../lib'; import { ScreenshotOptions } from '../../../types'; -import { PdfMaker, PdfWorkerOutOfMemoryError } from '../../common/pdf'; +import { PdfMaker } from '../../common/pdf'; import { getTracker } from './tracker'; const getTimeRange = (urlScreenshots: ScreenshotResult['results']) => { @@ -96,14 +96,7 @@ export function generatePdfObservable( tracker.setByteLength(byteLength); } catch (err) { logger.error(`Could not generate the PDF buffer!`); - logger.error(err); - if (err instanceof PdfWorkerOutOfMemoryError) { - warnings.push( - 'Failed to generate PDF due to low memory. Please consider generating a smaller PDF.' - ); - } else { - warnings.push(`Failed to generate PDF due to the following error: ${err.message}`); - } + throw err; } tracker.end(); diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/lib/generate_pdf.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/lib/generate_pdf.ts index b0ac1a59010a69..ac922c07574b3c 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/lib/generate_pdf.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/lib/generate_pdf.ts @@ -14,7 +14,6 @@ import { LocatorParams, PdfMetrics, UrlOrUrlLocatorTuple } from '../../../../com import { LevelLogger } from '../../../lib'; import { ScreenshotOptions } from '../../../types'; import { PdfMaker } from '../../common/pdf'; -import { PdfWorkerOutOfMemoryError } from '../../common/pdf'; import { getFullRedirectAppUrl } from '../../common/v2/get_full_redirect_app_url'; import type { TaskPayloadPDFV2 } from '../types'; import { getTracker } from './tracker'; @@ -109,14 +108,7 @@ export function generatePdfObservable( tracker.end(); } catch (err) { logger.error(`Could not generate the PDF buffer!`); - logger.error(err); - if (err instanceof PdfWorkerOutOfMemoryError) { - warnings.push( - 'Failed to generate PDF due to low memory. Please consider generating a smaller PDF.' - ); - } else { - warnings.push(`Failed to generate PDF due to the following error: ${err.message}`); - } + throw err; } return { diff --git a/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts b/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts index 47f4e8617a9f37..7b380bc5ab353f 100644 --- a/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts +++ b/x-pack/plugins/reporting/server/lib/tasks/execute_report.ts @@ -416,12 +416,13 @@ export class ExecuteReportTask implements ReportingTask { if (report == null) { throw new Error(`Report ${jobId} is null!`); } - const maxAttemptsMsg = `Max attempts (${attempts}) reached for job ${jobId}. Failed with: ${failedToExecuteErr.message}`; const error = failedToExecuteErr instanceof ReportingError ? failedToExecuteErr : new UnknownError(); - error.details = maxAttemptsMsg; + error.details = + error.details || + `Max attempts (${attempts}) reached for job ${jobId}. Failed with: ${failedToExecuteErr.message}`; const resp = await this._failJob(report, error); report._seq_no = resp._seq_no; report._primary_term = resp._primary_term;