Skip to content

[9.0] [Space time] extending Scout with perfTracker fixture (#212397)#215016

Merged
dmlemeshko merged 3 commits intoelastic:9.0from
dmlemeshko:backport/9.0/pr-212397
Mar 19, 2025
Merged

[9.0] [Space time] extending Scout with perfTracker fixture (#212397)#215016
dmlemeshko merged 3 commits intoelastic:9.0from
dmlemeshko:backport/9.0/pr-212397

Conversation

@dmlemeshko
Copy link
Copy Markdown
Contributor

Backport

This will backport the following commits from main to 9.0:

Questions ?

Please refer to the Backport tool documentation

## Summary

On-Week project "Client-side performance insights with Playwright &
Lighthouse"

revisiting old PR elastic#66224

This PR extends Scout with `perfTracker` fixture designed to analyze
JavaScript bundle performance and page-level performance metrics in
Kibana by leveraging Chrome DevTools Protocol (CDP).

It intercepts network requests, filters static bundles, and computes
bundle size statistics per page load. Additionally, it collects CDP
Performance Domain Metrics, allowing in-depth analysis of rendering and
script execution times.

[README](https://github.com/elastic/kibana/blob/c013c39b7ed92248b94716d953ad692e9328a08d/src/platform/packages/shared/kbn-scout/src/playwright/fixtures/test/performance/README.md)
file with more details and examples was added

Output example for `/app/discover` (shorten, just to share the idea):

```
{
  "url": "http://localhost:5620/app/discover#/",
  "bundleCount": 87,
  "totalSize": 3133420,
  "pluginCount": 9,
  "plugins": [
    {
      "name": "aiops",
      "bundlesCount": 2,
      "totalSize": 5982,
      "bundles": [
        {
          "name": "aiops.chunk.1.js",
          "transferredSize": 2013
        },
        ...
      ]
    },
    {
      "name": "discover",
      "bundlesCount": 17,
      "totalSize": 631605,
      "bundles": [
        {
          "name": "discover.chunk.1.js",
          "transferredSize": 41915
        },
        ...
      ]
    },
    {
      "name": "eventAnnotation",
      "bundlesCount": 1,
      "totalSize": 8652,
      "bundles": [
        {
          "name": "eventAnnotation.chunk.1.js",
          "transferredSize": 8652
        }
      ]
    },
    {
      "name": "expressionXY",
      "bundlesCount": 5,
      "totalSize": 203127,
      "bundles": [
        {
          "name": "expressionXY.chunk.2.js",
          "transferredSize": 5328
        },
        ...
      ]
    },
  ]
}
```

You can create a Scout UI test and start bundle tracker whenever you
want to compute collected stats when all loading is done. Designed as
test, it allows you to have individual validations for plugins, total
bundle size, individual plugin size, etc.

```
      // Ensure all JS bundles are loaded
      await perfTracker.waitForJsLoad(cdp);

      // Collect and validate stats
      const stats = perfTracker.collectJsBundleStats(currentUrl);
      expect(
        stats.totalSize,
        `Total bundles size loaded on page should not exceed 3.0 MB`
      ).toBeLessThan(3 * 1024 * 1024);
      expect(stats.bundleCount, {
        message: `Total bundle chunks count loaded on page should not exceed 100`,
      }).toBeLessThan(100);
      expect(
        stats.plugins.map((p) => p.name),
        { message: 'Unexpected plugins were loaded on page' }
      ).toStrictEqual([
        'aiops',
        'discover',
        'eventAnnotation',
        'expressionXY',
        'kbn-ui-shared-deps-npm',
        'lens',
        'maps',
        'unifiedHistogram',
        'unifiedSearch',
      ]);
      // Validate individual plugin bundle sizes
      expect(stats.plugins.find((p) => p.name === 'discover')?.totalSize, {
        message: `Total 'discover' bundles size should not exceed 625 KB`,
      }).toBeLessThan(625 * 1024);
```

Full test example:
https://github.com/elastic/kibana/blob/7b18e85541d00c3c33a9640cd38a5896b3a758ed/x-pack/platform/plugins/private/discover_enhanced/ui_tests/tests/discover_cdp_perf.spec.ts

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
(cherry picked from commit b5f158b)

# Conflicts:
#	yarn.lock
@dmlemeshko dmlemeshko added the backport This PR is a backport of another PR label Mar 18, 2025
@dmlemeshko dmlemeshko enabled auto-merge (squash) March 18, 2025 16:13
@dmlemeshko dmlemeshko requested a review from pheyos March 18, 2025 16:15
Copy link
Copy Markdown
Member

@pheyos pheyos left a comment

Choose a reason for hiding this comment

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

LGTM

@elasticmachine
Copy link
Copy Markdown
Contributor

elasticmachine commented Mar 19, 2025

💛 Build succeeded, but was flaky

Failed CI Steps

Test Failures

  • [job] [logs] Scout: [ platform / discover_enhanced ] plugin / stateful - Discover App - Performance Metrics & Bundle Analysis - measures Performance Metrics before and after Discover load

Metrics [docs]

Public APIs missing comments

Total count of every public API that lacks a comment. Target amount is 0. Run node scripts/build_api_docs --plugin [yourplugin] --stats comments for more detailed information.

id before after diff
@kbn/scout 97 101 +4
@kbn/scout-oblt 65 66 +1
total +5

Async chunks

Total size of all lazy-loaded chunks that will be downloaded as the user navigates the app

id before after diff
canvas 1002.6KB 1002.7KB +20.0B

Public APIs missing exports

Total count of every type that is part of your API that should be exported but is not. This will cause broken links in the API documentation system. Target amount is 0. Run node scripts/build_api_docs --plugin [yourplugin] --stats exports for more detailed information.

id before after diff
@kbn/scout 15 18 +3
Unknown metric groups

API count

id before after diff
@kbn/scout 388 412 +24
@kbn/scout-oblt 356 357 +1
total +25

ESLint disabled line counts

id before after diff
@kbn/scout 1 2 +1

Total ESLint disabled count

id before after diff
@kbn/scout 1 2 +1

History

@dmlemeshko dmlemeshko merged commit 270867b into elastic:9.0 Mar 19, 2025
9 checks passed
dmlemeshko added a commit that referenced this pull request Mar 19, 2025
…#215141)

# Backport

This will backport the following commits from `main` to `8.x`:
- [[Space time] extending Scout with perfTracker fixture
(#212397)](#212397)

<!--- Backport version: 9.6.6 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

<!--BACKPORT [{"author":{"name":"Dzmitry
Lemechko","email":"dzmitry.lemechko@elastic.co"},"sourceCommit":{"committedDate":"2025-03-14T17:35:31Z","message":"[Space
time] extending Scout with perfTracker fixture (#212397)\n\n##
Summary\n\nOn-Week project \"Client-side performance insights with
Playwright &\nLighthouse\"\n\nrevisiting old PR #66224\n\nThis PR
extends Scout with `perfTracker` fixture designed to analyze\nJavaScript
bundle performance and page-level performance metrics in\nKibana by
leveraging Chrome DevTools Protocol (CDP).\n\nIt intercepts network
requests, filters static bundles, and computes\nbundle size statistics
per page load. Additionally, it collects CDP\nPerformance Domain
Metrics, allowing in-depth analysis of rendering and\nscript execution
times.\n\n\n[README](https://github.com/elastic/kibana/blob/c013c39b7ed92248b94716d953ad692e9328a08d/src/platform/packages/shared/kbn-scout/src/playwright/fixtures/test/performance/README.md)\nfile
with more details and examples was added\n\nOutput example for
`/app/discover` (shorten, just to share the idea):\n\n```\n{\n \"url\":
\"http://localhost:5620/app/discover#/\",\n \"bundleCount\": 87,\n
\"totalSize\": 3133420,\n \"pluginCount\": 9,\n \"plugins\": [\n {\n
\"name\": \"aiops\",\n \"bundlesCount\": 2,\n \"totalSize\": 5982,\n
\"bundles\": [\n {\n \"name\": \"aiops.chunk.1.js\",\n
\"transferredSize\": 2013\n },\n ...\n ]\n },\n {\n \"name\":
\"discover\",\n \"bundlesCount\": 17,\n \"totalSize\": 631605,\n
\"bundles\": [\n {\n \"name\": \"discover.chunk.1.js\",\n
\"transferredSize\": 41915\n },\n ...\n ]\n },\n {\n \"name\":
\"eventAnnotation\",\n \"bundlesCount\": 1,\n \"totalSize\": 8652,\n
\"bundles\": [\n {\n \"name\": \"eventAnnotation.chunk.1.js\",\n
\"transferredSize\": 8652\n }\n ]\n },\n {\n \"name\":
\"expressionXY\",\n \"bundlesCount\": 5,\n \"totalSize\": 203127,\n
\"bundles\": [\n {\n \"name\": \"expressionXY.chunk.2.js\",\n
\"transferredSize\": 5328\n },\n ...\n ]\n },\n ]\n}\n```\n\nYou can
create a Scout UI test and start bundle tracker whenever you\nwant to
compute collected stats when all loading is done. Designed as\ntest, it
allows you to have individual validations for plugins, total\nbundle
size, individual plugin size, etc.\n\n```\n // Ensure all JS bundles are
loaded\n await perfTracker.waitForJsLoad(cdp);\n\n // Collect and
validate stats\n const stats =
perfTracker.collectJsBundleStats(currentUrl);\n expect(\n
stats.totalSize,\n `Total bundles size loaded on page should not exceed
3.0 MB`\n ).toBeLessThan(3 * 1024 * 1024);\n expect(stats.bundleCount,
{\n message: `Total bundle chunks count loaded on page should not exceed
100`,\n }).toBeLessThan(100);\n expect(\n stats.plugins.map((p) =>
p.name),\n { message: 'Unexpected plugins were loaded on page' }\n
).toStrictEqual([\n 'aiops',\n 'discover',\n 'eventAnnotation',\n
'expressionXY',\n 'kbn-ui-shared-deps-npm',\n 'lens',\n 'maps',\n
'unifiedHistogram',\n 'unifiedSearch',\n ]);\n // Validate individual
plugin bundle sizes\n expect(stats.plugins.find((p) => p.name ===
'discover')?.totalSize, {\n message: `Total 'discover' bundles size
should not exceed 625 KB`,\n }).toBeLessThan(625 * 1024);\n```\n\nFull
test
example:\nhttps://github.com/elastic/kibana/blob/7b18e85541d00c3c33a9640cd38a5896b3a758ed/x-pack/platform/plugins/private/discover_enhanced/ui_tests/tests/discover_cdp_perf.spec.ts\n\n---------\n\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>","sha":"b5f158bc42285c37911abca17c371f4459106fa7","branchLabelMapping":{"^v9.1.0$":"main","^v8.19.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","v9.0.0","wg:performance","backport:version","test:scout","v9.1.0","v8.19.0"],"title":"[Space
time] extending Scout with perfTracker
fixture","number":212397,"url":"https://github.com/elastic/kibana/pull/212397","mergeCommit":{"message":"[Space
time] extending Scout with perfTracker fixture (#212397)\n\n##
Summary\n\nOn-Week project \"Client-side performance insights with
Playwright &\nLighthouse\"\n\nrevisiting old PR #66224\n\nThis PR
extends Scout with `perfTracker` fixture designed to analyze\nJavaScript
bundle performance and page-level performance metrics in\nKibana by
leveraging Chrome DevTools Protocol (CDP).\n\nIt intercepts network
requests, filters static bundles, and computes\nbundle size statistics
per page load. Additionally, it collects CDP\nPerformance Domain
Metrics, allowing in-depth analysis of rendering and\nscript execution
times.\n\n\n[README](https://github.com/elastic/kibana/blob/c013c39b7ed92248b94716d953ad692e9328a08d/src/platform/packages/shared/kbn-scout/src/playwright/fixtures/test/performance/README.md)\nfile
with more details and examples was added\n\nOutput example for
`/app/discover` (shorten, just to share the idea):\n\n```\n{\n \"url\":
\"http://localhost:5620/app/discover#/\",\n \"bundleCount\": 87,\n
\"totalSize\": 3133420,\n \"pluginCount\": 9,\n \"plugins\": [\n {\n
\"name\": \"aiops\",\n \"bundlesCount\": 2,\n \"totalSize\": 5982,\n
\"bundles\": [\n {\n \"name\": \"aiops.chunk.1.js\",\n
\"transferredSize\": 2013\n },\n ...\n ]\n },\n {\n \"name\":
\"discover\",\n \"bundlesCount\": 17,\n \"totalSize\": 631605,\n
\"bundles\": [\n {\n \"name\": \"discover.chunk.1.js\",\n
\"transferredSize\": 41915\n },\n ...\n ]\n },\n {\n \"name\":
\"eventAnnotation\",\n \"bundlesCount\": 1,\n \"totalSize\": 8652,\n
\"bundles\": [\n {\n \"name\": \"eventAnnotation.chunk.1.js\",\n
\"transferredSize\": 8652\n }\n ]\n },\n {\n \"name\":
\"expressionXY\",\n \"bundlesCount\": 5,\n \"totalSize\": 203127,\n
\"bundles\": [\n {\n \"name\": \"expressionXY.chunk.2.js\",\n
\"transferredSize\": 5328\n },\n ...\n ]\n },\n ]\n}\n```\n\nYou can
create a Scout UI test and start bundle tracker whenever you\nwant to
compute collected stats when all loading is done. Designed as\ntest, it
allows you to have individual validations for plugins, total\nbundle
size, individual plugin size, etc.\n\n```\n // Ensure all JS bundles are
loaded\n await perfTracker.waitForJsLoad(cdp);\n\n // Collect and
validate stats\n const stats =
perfTracker.collectJsBundleStats(currentUrl);\n expect(\n
stats.totalSize,\n `Total bundles size loaded on page should not exceed
3.0 MB`\n ).toBeLessThan(3 * 1024 * 1024);\n expect(stats.bundleCount,
{\n message: `Total bundle chunks count loaded on page should not exceed
100`,\n }).toBeLessThan(100);\n expect(\n stats.plugins.map((p) =>
p.name),\n { message: 'Unexpected plugins were loaded on page' }\n
).toStrictEqual([\n 'aiops',\n 'discover',\n 'eventAnnotation',\n
'expressionXY',\n 'kbn-ui-shared-deps-npm',\n 'lens',\n 'maps',\n
'unifiedHistogram',\n 'unifiedSearch',\n ]);\n // Validate individual
plugin bundle sizes\n expect(stats.plugins.find((p) => p.name ===
'discover')?.totalSize, {\n message: `Total 'discover' bundles size
should not exceed 625 KB`,\n }).toBeLessThan(625 * 1024);\n```\n\nFull
test
example:\nhttps://github.com/elastic/kibana/blob/7b18e85541d00c3c33a9640cd38a5896b3a758ed/x-pack/platform/plugins/private/discover_enhanced/ui_tests/tests/discover_cdp_perf.spec.ts\n\n---------\n\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>","sha":"b5f158bc42285c37911abca17c371f4459106fa7"}},"sourceBranch":"main","suggestedTargetBranches":["8.x"],"targetPullRequestStates":[{"branch":"9.0","label":"v9.0.0","branchLabelMappingKey":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"url":"https://github.com/elastic/kibana/pull/215016","number":215016,"state":"MERGED","mergeCommit":{"sha":"270867bac6f803fcd9ccb12357710300c0770a15","message":"[9.0]
[Space time] extending Scout with perfTracker fixture (#212397)
(#215016)\n\n# Backport\n\nThis will backport the following commits from
`main` to `9.0`:\n- [[Space time] extending Scout with perfTracker
fixture\n(#212397)](https://github.com/elastic/kibana/pull/212397)\n\n\n\n###
Questions ?\nPlease refer to the [Backport
tool\ndocumentation](https://github.com/sorenlouv/backport)\n\n"}},{"branch":"main","label":"v9.1.0","branchLabelMappingKey":"^v9.1.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/212397","number":212397,"mergeCommit":{"message":"[Space
time] extending Scout with perfTracker fixture (#212397)\n\n##
Summary\n\nOn-Week project \"Client-side performance insights with
Playwright &\nLighthouse\"\n\nrevisiting old PR #66224\n\nThis PR
extends Scout with `perfTracker` fixture designed to analyze\nJavaScript
bundle performance and page-level performance metrics in\nKibana by
leveraging Chrome DevTools Protocol (CDP).\n\nIt intercepts network
requests, filters static bundles, and computes\nbundle size statistics
per page load. Additionally, it collects CDP\nPerformance Domain
Metrics, allowing in-depth analysis of rendering and\nscript execution
times.\n\n\n[README](https://github.com/elastic/kibana/blob/c013c39b7ed92248b94716d953ad692e9328a08d/src/platform/packages/shared/kbn-scout/src/playwright/fixtures/test/performance/README.md)\nfile
with more details and examples was added\n\nOutput example for
`/app/discover` (shorten, just to share the idea):\n\n```\n{\n \"url\":
\"http://localhost:5620/app/discover#/\",\n \"bundleCount\": 87,\n
\"totalSize\": 3133420,\n \"pluginCount\": 9,\n \"plugins\": [\n {\n
\"name\": \"aiops\",\n \"bundlesCount\": 2,\n \"totalSize\": 5982,\n
\"bundles\": [\n {\n \"name\": \"aiops.chunk.1.js\",\n
\"transferredSize\": 2013\n },\n ...\n ]\n },\n {\n \"name\":
\"discover\",\n \"bundlesCount\": 17,\n \"totalSize\": 631605,\n
\"bundles\": [\n {\n \"name\": \"discover.chunk.1.js\",\n
\"transferredSize\": 41915\n },\n ...\n ]\n },\n {\n \"name\":
\"eventAnnotation\",\n \"bundlesCount\": 1,\n \"totalSize\": 8652,\n
\"bundles\": [\n {\n \"name\": \"eventAnnotation.chunk.1.js\",\n
\"transferredSize\": 8652\n }\n ]\n },\n {\n \"name\":
\"expressionXY\",\n \"bundlesCount\": 5,\n \"totalSize\": 203127,\n
\"bundles\": [\n {\n \"name\": \"expressionXY.chunk.2.js\",\n
\"transferredSize\": 5328\n },\n ...\n ]\n },\n ]\n}\n```\n\nYou can
create a Scout UI test and start bundle tracker whenever you\nwant to
compute collected stats when all loading is done. Designed as\ntest, it
allows you to have individual validations for plugins, total\nbundle
size, individual plugin size, etc.\n\n```\n // Ensure all JS bundles are
loaded\n await perfTracker.waitForJsLoad(cdp);\n\n // Collect and
validate stats\n const stats =
perfTracker.collectJsBundleStats(currentUrl);\n expect(\n
stats.totalSize,\n `Total bundles size loaded on page should not exceed
3.0 MB`\n ).toBeLessThan(3 * 1024 * 1024);\n expect(stats.bundleCount,
{\n message: `Total bundle chunks count loaded on page should not exceed
100`,\n }).toBeLessThan(100);\n expect(\n stats.plugins.map((p) =>
p.name),\n { message: 'Unexpected plugins were loaded on page' }\n
).toStrictEqual([\n 'aiops',\n 'discover',\n 'eventAnnotation',\n
'expressionXY',\n 'kbn-ui-shared-deps-npm',\n 'lens',\n 'maps',\n
'unifiedHistogram',\n 'unifiedSearch',\n ]);\n // Validate individual
plugin bundle sizes\n expect(stats.plugins.find((p) => p.name ===
'discover')?.totalSize, {\n message: `Total 'discover' bundles size
should not exceed 625 KB`,\n }).toBeLessThan(625 * 1024);\n```\n\nFull
test
example:\nhttps://github.com/elastic/kibana/blob/7b18e85541d00c3c33a9640cd38a5896b3a758ed/x-pack/platform/plugins/private/discover_enhanced/ui_tests/tests/discover_cdp_perf.spec.ts\n\n---------\n\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>","sha":"b5f158bc42285c37911abca17c371f4459106fa7"}},{"branch":"8.x","label":"v8.19.0","branchLabelMappingKey":"^v8.19.0$","isSourceBranch":false,"state":"NOT_CREATED"}]}]
BACKPORT-->

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport This PR is a backport of another PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants