Skip to content

Commit c1e699d

Browse files
[Reporting] APM integration for baseline performance measurements (#59967) (#65797)
* apm stuff * fix cluster_client * fix snapshot * tracker utility for generate_pdf * call apm.startSpan instead of txn.startSpan * Fix async call to end transaction * fix typescript * remove captuureErrors * restore accidental removal * add startTrace lib * fix import * fix imports * ts fix * fix generate_png to not format base64 to buffer and back to base64 * 💅 * revert change to cluster client * fix unused translation Co-authored-by: Elastic Machine <[email protected]> Co-authored-by: Elastic Machine <[email protected]>
1 parent 32ad39e commit c1e699d

File tree

20 files changed

+243
-61
lines changed

20 files changed

+243
-61
lines changed

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_element_position_data.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66

77
import { i18n } from '@kbn/i18n';
88
import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers';
9+
import { LevelLogger as Logger, startTrace } from '../../../../server/lib';
910
import { LayoutInstance } from '../../layouts/layout';
10-
import { AttributesMap, ElementsPositionAndAttribute } from './types';
11-
import { Logger } from '../../../../types';
1211
import { CONTEXT_ELEMENTATTRIBUTES } from './constants';
12+
import { AttributesMap, ElementsPositionAndAttribute } from './types';
1313

1414
export const getElementPositionAndAttributes = async (
1515
browser: HeadlessBrowser,
1616
layout: LayoutInstance,
1717
logger: Logger
1818
): Promise<ElementsPositionAndAttribute[] | null> => {
19+
const endTrace = startTrace('get_element_position_data', 'read');
1920
const { screenshot: screenshotSelector } = layout.selectors; // data-shared-items-container
2021
let elementsPositionAndAttributes: ElementsPositionAndAttribute[] | null;
2122
try {
@@ -69,5 +70,7 @@ export const getElementPositionAndAttributes = async (
6970
elementsPositionAndAttributes = null;
7071
}
7172

73+
endTrace();
74+
7275
return elementsPositionAndAttributes;
7376
};

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_number_of_items.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { i18n } from '@kbn/i18n';
88
import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers';
9-
import { LevelLogger } from '../../../../server/lib';
9+
import { LevelLogger, startTrace } from '../../../../server/lib';
1010
import { CaptureConfig } from '../../../../server/types';
1111
import { LayoutInstance } from '../../layouts/layout';
1212
import { CONTEXT_GETNUMBEROFITEMS, CONTEXT_READMETADATA } from './constants';
@@ -17,6 +17,7 @@ export const getNumberOfItems = async (
1717
layout: LayoutInstance,
1818
logger: LevelLogger
1919
): Promise<number> => {
20+
const endTrace = startTrace('get_number_of_items', 'read');
2021
const { renderComplete: renderCompleteSelector, itemsCountAttribute } = layout.selectors;
2122
let itemsCount: number;
2223

@@ -70,5 +71,7 @@ export const getNumberOfItems = async (
7071
itemsCount = 1;
7172
}
7273

74+
endTrace();
75+
7376
return itemsCount;
7477
};

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_screenshots.ts

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,9 @@
66

77
import { i18n } from '@kbn/i18n';
88
import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers';
9-
import { LevelLogger } from '../../../../server/lib';
9+
import { LevelLogger, startTrace } from '../../../../server/lib';
1010
import { Screenshot, ElementsPositionAndAttribute } from './types';
1111

12-
const getAsyncDurationLogger = (logger: LevelLogger) => {
13-
return async (description: string, promise: Promise<any>) => {
14-
const start = Date.now();
15-
const result = await promise;
16-
logger.debug(
17-
i18n.translate('xpack.reporting.screencapture.asyncTook', {
18-
defaultMessage: '{description} took {took}ms',
19-
values: {
20-
description,
21-
took: Date.now() - start,
22-
},
23-
})
24-
);
25-
return result;
26-
};
27-
};
28-
2912
export const getScreenshots = async (
3013
browser: HeadlessBrowser,
3114
elementsPositionAndAttributes: ElementsPositionAndAttribute[],
@@ -37,21 +20,20 @@ export const getScreenshots = async (
3720
})
3821
);
3922

40-
const asyncDurationLogger = getAsyncDurationLogger(logger);
4123
const screenshots: Screenshot[] = [];
4224

4325
for (let i = 0; i < elementsPositionAndAttributes.length; i++) {
26+
const endTrace = startTrace('get_screenshots', 'read');
4427
const item = elementsPositionAndAttributes[i];
45-
const base64EncodedData = await asyncDurationLogger(
46-
`screenshot #${i + 1}`,
47-
browser.screenshot(item.position)
48-
);
28+
const base64EncodedData = await browser.screenshot(item.position);
4929

5030
screenshots.push({
5131
base64EncodedData,
5232
title: item.attributes.title,
5333
description: item.attributes.description,
5434
});
35+
36+
endTrace();
5537
}
5638

5739
logger.info(

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_time_range.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers';
8-
import { LevelLogger } from '../../../../server/lib';
8+
import { LevelLogger, startTrace } from '../../../../server/lib';
99
import { LayoutInstance } from '../../layouts/layout';
1010
import { CONTEXT_GETTIMERANGE } from './constants';
1111
import { TimeRange } from './types';
@@ -15,6 +15,7 @@ export const getTimeRange = async (
1515
layout: LayoutInstance,
1616
logger: LevelLogger
1717
): Promise<TimeRange | null> => {
18+
const endTrace = startTrace('get_time_range', 'read');
1819
logger.debug('getting timeRange');
1920

2021
const timeRange: TimeRange | null = await browser.evaluate(
@@ -45,5 +46,7 @@ export const getTimeRange = async (
4546
logger.debug('no timeRange');
4647
}
4748

49+
endTrace();
50+
4851
return timeRange;
4952
};

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/inject_css.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import { i18n } from '@kbn/i18n';
88
import fs from 'fs';
99
import { promisify } from 'util';
10-
import { LevelLogger } from '../../../../server/lib';
1110
import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers';
11+
import { LevelLogger, startTrace } from '../../../../server/lib';
1212
import { Layout } from '../../layouts/layout';
1313
import { CONTEXT_INJECTCSS } from './constants';
1414

@@ -19,6 +19,7 @@ export const injectCustomCss = async (
1919
layout: Layout,
2020
logger: LevelLogger
2121
): Promise<void> => {
22+
const endTrace = startTrace('inject_css', 'correction');
2223
logger.debug(
2324
i18n.translate('xpack.reporting.screencapture.injectingCss', {
2425
defaultMessage: 'injecting custom css',
@@ -49,4 +50,6 @@ export const injectCustomCss = async (
4950
})
5051
);
5152
}
53+
54+
endTrace();
5255
};

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,18 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7+
import apm from 'elastic-apm-node';
78
import * as Rx from 'rxjs';
8-
import { catchError, concatMap, first, mergeMap, take, takeUntil, toArray } from 'rxjs/operators';
9+
import {
10+
catchError,
11+
concatMap,
12+
first,
13+
mergeMap,
14+
take,
15+
takeUntil,
16+
tap,
17+
toArray,
18+
} from 'rxjs/operators';
919
import { CaptureConfig } from '../../../../server/types';
1020
import { DEFAULT_PAGELOAD_SELECTOR } from '../../constants';
1121
import { HeadlessChromiumDriverFactory } from '../../../../types';
@@ -41,13 +51,17 @@ export function screenshotsObservableFactory(
4151
layout,
4252
browserTimezone,
4353
}: ScreenshotObservableOpts): Rx.Observable<ScreenshotResults[]> {
54+
const apmTrans = apm.startTransaction(`reporting screenshot pipeline`, 'reporting');
55+
56+
const apmCreatePage = apmTrans?.startSpan('create_page', 'wait');
4457
const create$ = browserDriverFactory.createPage(
4558
{ viewport: layout.getBrowserViewport(), browserTimezone },
4659
logger
4760
);
4861

4962
return create$.pipe(
5063
mergeMap(({ driver, exit$ }) => {
64+
if (apmCreatePage) apmCreatePage.end();
5165
return Rx.from(urls).pipe(
5266
concatMap((url, index) => {
5367
const setup$: Rx.Observable<ScreenSetupData> = Rx.of(1).pipe(
@@ -81,10 +95,12 @@ export function screenshotsObservableFactory(
8195
// allows for them to be displayed properly in many cases
8296
await injectCustomCss(driver, layout, logger);
8397

98+
const apmPositionElements = apmTrans?.startSpan('position_elements', 'correction');
8499
if (layout.positionElements) {
85100
// position panel elements for print layout
86101
await layout.positionElements(driver, logger);
87102
}
103+
if (apmPositionElements) apmPositionElements.end();
88104

89105
await waitForRenderComplete(captureConfig, driver, layout, logger);
90106
}),
@@ -125,7 +141,10 @@ export function screenshotsObservableFactory(
125141
toArray()
126142
);
127143
}),
128-
first()
144+
first(),
145+
tap(() => {
146+
if (apmTrans) apmTrans.end();
147+
})
129148
);
130149
};
131150
}

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/open_url.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { i18n } from '@kbn/i18n';
88
import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers';
9-
import { LevelLogger } from '../../../../server/lib';
9+
import { LevelLogger, startTrace } from '../../../../server/lib';
1010
import { CaptureConfig } from '../../../../server/types';
1111
import { ConditionalHeaders } from '../../../../types';
1212

@@ -18,6 +18,7 @@ export const openUrl = async (
1818
conditionalHeaders: ConditionalHeaders,
1919
logger: LevelLogger
2020
): Promise<void> => {
21+
const endTrace = startTrace('open_url', 'wait');
2122
try {
2223
await browser.open(
2324
url,
@@ -32,11 +33,10 @@ export const openUrl = async (
3233
throw new Error(
3334
i18n.translate('xpack.reporting.screencapture.couldntLoadKibana', {
3435
defaultMessage: `An error occurred when trying to open the Kibana URL. You may need to increase '{configKey}'. {error}`,
35-
values: {
36-
configKey: 'xpack.reporting.capture.timeouts.openUrl',
37-
error: err,
38-
},
36+
values: { configKey: 'xpack.reporting.capture.timeouts.openUrl', error: err },
3937
})
4038
);
4139
}
40+
41+
endTrace();
4242
};

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export interface ElementsPositionAndAttribute {
3030
}
3131

3232
export interface Screenshot {
33-
base64EncodedData: Buffer;
33+
base64EncodedData: string;
3434
title: string;
3535
description: string;
3636
}

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_render.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { i18n } from '@kbn/i18n';
88
import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers';
9-
import { LevelLogger } from '../../../../server/lib';
9+
import { LevelLogger, startTrace } from '../../../../server/lib';
1010
import { CaptureConfig } from '../../../../server/types';
1111
import { LayoutInstance } from '../../layouts/layout';
1212
import { CONTEXT_WAITFORRENDER } from './constants';
@@ -17,6 +17,8 @@ export const waitForRenderComplete = async (
1717
layout: LayoutInstance,
1818
logger: LevelLogger
1919
) => {
20+
const endTrace = startTrace('wait_for_render', 'wait');
21+
2022
logger.debug(
2123
i18n.translate('xpack.reporting.screencapture.waitingForRenderComplete', {
2224
defaultMessage: 'waiting for rendering to complete',
@@ -76,5 +78,7 @@ export const waitForRenderComplete = async (
7678
defaultMessage: 'rendering is complete',
7779
})
7880
);
81+
82+
endTrace();
7983
});
8084
};

x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_visualizations.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { i18n } from '@kbn/i18n';
88
import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers';
9-
import { LevelLogger } from '../../../../server/lib';
9+
import { LevelLogger, startTrace } from '../../../../server/lib';
1010
import { CaptureConfig } from '../../../../server/types';
1111
import { LayoutInstance } from '../../layouts/layout';
1212
import { CONTEXT_WAITFORELEMENTSTOBEINDOM } from './constants';
@@ -29,6 +29,7 @@ export const waitForVisualizations = async (
2929
layout: LayoutInstance,
3030
logger: LevelLogger
3131
): Promise<void> => {
32+
const endTrace = startTrace('wait_for_visualizations', 'wait');
3233
const { renderComplete: renderCompleteSelector } = layout.selectors;
3334

3435
logger.debug(
@@ -63,4 +64,6 @@ export const waitForVisualizations = async (
6364
})
6465
);
6566
}
67+
68+
endTrace();
6669
};

0 commit comments

Comments
 (0)