diff --git a/zeppelin-web-angular/e2e/performance/README.md b/zeppelin-web-angular/e2e/performance/README.md index f1f8b70e0d7..4f01adbf3bd 100644 --- a/zeppelin-web-angular/e2e/performance/README.md +++ b/zeppelin-web-angular/e2e/performance/README.md @@ -15,11 +15,11 @@ limitations under the License. # Notebook route benchmark contract -ZEPPELIN-6668 defines the fixture and measurement format. It does not establish a pinned Angular baseline. Generated JSON is ignored by Git. +ZEPPELIN-6668 defines the fixture and measurement format. ZEPPELIN-6722 records the pinned Angular baseline described under [Recorded Angular baseline](#recorded-angular-baseline). Generated JSON is ignored by Git; only that recorded baseline is committed. Build with `npm run build`, then serve `dist/zeppelin` with an isolated local Zeppelin backend. The benchmark imports one note and deletes that note in cleanup. Do not point it at a shared notebook store. It checks the served index's entry script list and the served entry asset hashes against the local build before importing the fixture; server-injected inline markup does not affect this check. The normal E2E suite does not run this benchmark; no development server is started by its config. Each measured navigation's response is checked again after recording readiness, before accepting the sample, so validation does not delay the measured ready time. -To serve the fresh build, start Zeppelin from this source tree after `npm run build`. In `zeppelin-server`'s `ZeppelinConfiguration`, `zeppelin.default.ui` defaults to `new` and `zeppelin.angular.war` defaults to `zeppelin-web-angular/dist/zeppelin`, so the benchmark requests that `dist` at `/` unless either property is overridden. Use `localhost` in `PLAYWRIGHT_BASE_URL`: unless `zeppelin.server.allowed.origins` is set, the server accepts a WebSocket origin only from `localhost` or its own host name, so a `127.0.0.1` origin never loads the note. +To serve the fresh build, start Zeppelin from this source tree after `npm run build`. In `zeppelin-server`'s `ZeppelinConfiguration`, `zeppelin.default.ui` defaults to `new` and `zeppelin.angular.war` defaults to `zeppelin-web-angular/dist/zeppelin`, so the benchmark requests that `dist` at `/` unless either property is overridden. Use `localhost` in `PLAYWRIGHT_BASE_URL`: unless `zeppelin.server.allowed.origins` is set, the server accepts a WebSocket origin only from `localhost` or its own host name, so a `127.0.0.1` origin never loads the note. Note import needs a default interpreter setting, so at least one interpreter must be installed; the fixture's paragraphs use `%sh`, so building the `shell` module (`./mvnw install -DskipTests -pl shell`) is enough. Without any interpreter, import fails with HTTP 500. `playwright.performance.config.js` intentionally throws when `PLAYWRIGHT_BASE_URL` or `PERF_NOTEBOOK_DISPOSABLE=1` is missing, so `npx playwright test --list --config playwright.performance.config.js` needs them too. @@ -47,3 +47,18 @@ Outputs are `baselines/.raw.json` and `.summary.json`. Both cont `bundles.angularEntryChunks` lists JavaScript entry scripts from the built Angular `index.html`. `bundles.reactRemoteEntry` measures the separately served `assets/react/remoteEntry.js`. Each file records relative path, SHA-256, raw bytes and gzip bytes. These are entry asset measurements, not the whole `dist` tree or a claim about the complete notebook route's lazy-loaded bundle size. Focused static checks: `npm run test:shell -- test/notebook-baseline.spec.ts` and `npx eslint e2e/performance/*.ts e2e/models/notebook-performance-page.ts`. + +## Recorded Angular baseline + +`baselines/70eef3f8-b75c-427a-b8b4-bfcd65b71264.raw.json` and `.summary.json` are the pinned Angular notebook route baseline, recorded before the React route host (ZEPPELIN-6675) lands. They are a single run of 10 cold and 10 warm samples in one environment; no outlier was removed and no other run is merged into them. + +* Zeppelin commit: `7f7b995c35978c4a3ef3df31ec8faf206ce179f9`, clean working tree +* Environment: macOS (Darwin 23.6.0), Apple M3 Pro, 36 GiB memory, Playwright Chromium 140.0.7339.186, Node v22.21.1, on AC power +* Server: Zeppelin built from the same commit (`zeppelin-server` with its dependencies, and `shell`), anonymous access, an empty isolated notebook directory + +| Metric (ms) | Cold median | Cold p95 | Warm median | Warm p95 | +| --- | --- | --- | --- | --- | +| `notebookReadyMs` | 1102.9 | 1181.9 | 806.2 | 871.6 | +| `fcpMs` | 28 | 44 | 36 | 40 | + +The table rounds the summary file to 0.1 ms; the JSON files are authoritative. Compare a later run with this baseline only when it was recorded in the same environment. diff --git a/zeppelin-web-angular/e2e/performance/baselines/70eef3f8-b75c-427a-b8b4-bfcd65b71264.raw.json b/zeppelin-web-angular/e2e/performance/baselines/70eef3f8-b75c-427a-b8b4-bfcd65b71264.raw.json new file mode 100644 index 00000000000..ec8db260e42 --- /dev/null +++ b/zeppelin-web-angular/e2e/performance/baselines/70eef3f8-b75c-427a-b8b4-bfcd65b71264.raw.json @@ -0,0 +1,185 @@ +{ + "schemaVersion": 1, + "runId": "70eef3f8-b75c-427a-b8b4-bfcd65b71264", + "generatedAt": "2026-09-29T07:30:00.547Z", + "dryRun": false, + "zeppelinCommit": "7f7b995c35978c4a3ef3df31ec8faf206ce179f9", + "workingTreeDirty": false, + "os": { + "platform": "darwin", + "release": "23.6.0" + }, + "cpuModel": "Apple M3 Pro", + "memoryBytes": 38654705664, + "browserVersion": "140.0.7339.186", + "nodeVersion": "v22.21.1", + "buildCommand": "npm run build", + "fixture": { + "path": "e2e/fixtures/performance/notebook-route-100-paragraphs.json", + "sha256": "7f94de1f9a7e529c7baf473a8bba9ab017f410c896f21bd8357922b63bd81fde" + }, + "baseURL": "http://localhost:8080/", + "viewport": { + "width": 1280, + "height": 720 + }, + "runsPerCache": 10, + "warmPrimingNavigations": 1, + "percentileMethod": "nearest-rank", + "bundles": { + "angularEntryChunks": [ + { + "path": "dist/zeppelin/polyfills.ff67e561b2f2bf75.js", + "rawBytes": 56102, + "gzipBytes": 20644, + "sha256": "194d61d77df3cf43cc38b9fc29df74e3812e6548ce6300b5307477cdffe51802" + }, + { + "path": "dist/zeppelin/styles.c4ee7052b61641a3.js", + "rawBytes": 136950, + "gzipBytes": 23253, + "sha256": "3a66a5f592c854b3352b75842ee21111d947a0a1e69fe7d26e88e60750c377ad" + }, + { + "path": "dist/zeppelin/scripts.3e02b0ea73800c10.js", + "rawBytes": 825757, + "gzipBytes": 238428, + "sha256": "ca3bbd0856ca2debfdd5a58c49d95c57793dbfec3ed661920e87aa5506fa176f" + }, + { + "path": "dist/zeppelin/main.3a26bcb125282632.js", + "rawBytes": 6691449, + "gzipBytes": 1786481, + "sha256": "072ad8207750b596ffea6242ac6d4d800886a9124caa541bb0b92685f6c906ed" + } + ], + "reactRemoteEntry": { + "path": "dist/zeppelin/assets/react/remoteEntry.js", + "rawBytes": 4109, + "gzipBytes": 1785, + "sha256": "42cdb5cdac9a5d9c8ad8675b6847bbced19b73f505787e0285c5e46aca342f82" + } + }, + "samples": [ + { + "cache": "cold", + "run": 1, + "notebookReadyMs": 1181.9000000003725, + "fcpMs": 24 + }, + { + "cache": "cold", + "run": 2, + "notebookReadyMs": 1167.3999999994412, + "fcpMs": 40 + }, + { + "cache": "cold", + "run": 3, + "notebookReadyMs": 1106.7999999998137, + "fcpMs": 20 + }, + { + "cache": "cold", + "run": 4, + "notebookReadyMs": 1093.199999999255, + "fcpMs": 20 + }, + { + "cache": "cold", + "run": 5, + "notebookReadyMs": 1095.4000000003725, + "fcpMs": 44 + }, + { + "cache": "cold", + "run": 6, + "notebookReadyMs": 1096.7000000001863, + "fcpMs": 20 + }, + { + "cache": "cold", + "run": 7, + "notebookReadyMs": 1092.3999999994412, + "fcpMs": 40 + }, + { + "cache": "cold", + "run": 8, + "notebookReadyMs": 1098.9000000003725, + "fcpMs": 36 + }, + { + "cache": "cold", + "run": 9, + "notebookReadyMs": 1112.7000000001863, + "fcpMs": 32 + }, + { + "cache": "cold", + "run": 10, + "notebookReadyMs": 1162.199999999255, + "fcpMs": 20 + }, + { + "cache": "warm", + "run": 1, + "notebookReadyMs": 825.2000000001863, + "fcpMs": 40 + }, + { + "cache": "warm", + "run": 2, + "notebookReadyMs": 817.0999999996275, + "fcpMs": 36 + }, + { + "cache": "warm", + "run": 3, + "notebookReadyMs": 871.6000000005588, + "fcpMs": 36 + }, + { + "cache": "warm", + "run": 4, + "notebookReadyMs": 844.3999999994412, + "fcpMs": 24 + }, + { + "cache": "warm", + "run": 5, + "notebookReadyMs": 776.5, + "fcpMs": 40 + }, + { + "cache": "warm", + "run": 6, + "notebookReadyMs": 795.3999999994412, + "fcpMs": 36 + }, + { + "cache": "warm", + "run": 7, + "notebookReadyMs": 771.4000000003725, + "fcpMs": 36 + }, + { + "cache": "warm", + "run": 8, + "notebookReadyMs": 782.6000000005588, + "fcpMs": 24 + }, + { + "cache": "warm", + "run": 9, + "notebookReadyMs": 824.4000000003725, + "fcpMs": 32 + }, + { + "cache": "warm", + "run": 10, + "notebookReadyMs": 768.9000000003725, + "fcpMs": 36 + } + ] +} diff --git a/zeppelin-web-angular/e2e/performance/baselines/70eef3f8-b75c-427a-b8b4-bfcd65b71264.summary.json b/zeppelin-web-angular/e2e/performance/baselines/70eef3f8-b75c-427a-b8b4-bfcd65b71264.summary.json new file mode 100644 index 00000000000..25b4c82c8e7 --- /dev/null +++ b/zeppelin-web-angular/e2e/performance/baselines/70eef3f8-b75c-427a-b8b4-bfcd65b71264.summary.json @@ -0,0 +1,87 @@ +{ + "schemaVersion": 1, + "runId": "70eef3f8-b75c-427a-b8b4-bfcd65b71264", + "generatedAt": "2026-09-29T07:30:00.547Z", + "dryRun": false, + "zeppelinCommit": "7f7b995c35978c4a3ef3df31ec8faf206ce179f9", + "workingTreeDirty": false, + "os": { + "platform": "darwin", + "release": "23.6.0" + }, + "cpuModel": "Apple M3 Pro", + "memoryBytes": 38654705664, + "browserVersion": "140.0.7339.186", + "nodeVersion": "v22.21.1", + "buildCommand": "npm run build", + "fixture": { + "path": "e2e/fixtures/performance/notebook-route-100-paragraphs.json", + "sha256": "7f94de1f9a7e529c7baf473a8bba9ab017f410c896f21bd8357922b63bd81fde" + }, + "baseURL": "http://localhost:8080/", + "viewport": { + "width": 1280, + "height": 720 + }, + "runsPerCache": 10, + "warmPrimingNavigations": 1, + "percentileMethod": "nearest-rank", + "bundles": { + "angularEntryChunks": [ + { + "path": "dist/zeppelin/polyfills.ff67e561b2f2bf75.js", + "rawBytes": 56102, + "gzipBytes": 20644, + "sha256": "194d61d77df3cf43cc38b9fc29df74e3812e6548ce6300b5307477cdffe51802" + }, + { + "path": "dist/zeppelin/styles.c4ee7052b61641a3.js", + "rawBytes": 136950, + "gzipBytes": 23253, + "sha256": "3a66a5f592c854b3352b75842ee21111d947a0a1e69fe7d26e88e60750c377ad" + }, + { + "path": "dist/zeppelin/scripts.3e02b0ea73800c10.js", + "rawBytes": 825757, + "gzipBytes": 238428, + "sha256": "ca3bbd0856ca2debfdd5a58c49d95c57793dbfec3ed661920e87aa5506fa176f" + }, + { + "path": "dist/zeppelin/main.3a26bcb125282632.js", + "rawBytes": 6691449, + "gzipBytes": 1786481, + "sha256": "072ad8207750b596ffea6242ac6d4d800886a9124caa541bb0b92685f6c906ed" + } + ], + "reactRemoteEntry": { + "path": "dist/zeppelin/assets/react/remoteEntry.js", + "rawBytes": 4109, + "gzipBytes": 1785, + "sha256": "42cdb5cdac9a5d9c8ad8675b6847bbced19b73f505787e0285c5e46aca342f82" + } + }, + "summary": { + "cold": { + "count": 10, + "notebookReadyMs": { + "median": 1102.8500000000931, + "p95": 1181.9000000003725 + }, + "fcpMs": { + "median": 28, + "p95": 44 + } + }, + "warm": { + "count": 10, + "notebookReadyMs": { + "median": 806.2499999995343, + "p95": 871.6000000005588 + }, + "fcpMs": { + "median": 36, + "p95": 40 + } + } + } +}