Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions zeppelin-web-angular/e2e/performance/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -47,3 +47,18 @@ Outputs are `baselines/<run-id>.raw.json` and `<run-id>.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.
Original file line number Diff line number Diff line change
@@ -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
}
]
}
Original file line number Diff line number Diff line change
@@ -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
}
}
}
}
Loading