This is an automated email from the ASF dual-hosted git repository.
voidmatcha pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zeppelin.git
The following commit(s) were added to refs/heads/master by this push:
new 28894a1fc6 [ZEPPELIN-6722] Record the pinned Angular notebook route
baseline
28894a1fc6 is described below
commit 28894a1fc68bc188be72437f81d8d014240c5c52
Author: 김예나 <[email protected]>
AuthorDate: Wed Sep 30 21:04:12 2026 +0900
[ZEPPELIN-6722] Record the pinned Angular notebook route baseline
### What is this PR for?
Record the pinned Angular notebook route baseline with the benchmark
contract from ZEPPELIN-6668, before the React route host (ZEPPELIN-6675) lands
and the current Angular path can no longer be measured under the same
conditions.
* Measured at `7f7b995c3` (the ZEPPELIN-6668 merge, current `master`), with
a clean working tree (`workingTreeDirty: false`).
* One run in one environment: 10 cold and 10 warm samples, no outlier
removed, nothing merged from other runs.
* No script, fixture or config change. The measurement tool stays exactly
as ZEPPELIN-6668 fixed it, so the recorded commit identifies the tool that
produced these numbers.
| Metric (ms) | Cold median | Cold p95 | Warm median | Warm p95 |
| --- | --- | --- | --- | --- |
| `notebookReadyMs` | 1102.9 | 1181.9 | 806.2 | 871.6 |
| `fcpMs` | 28 | 44 | 36 | 40 |
Raw samples: cold 1092.4–1181.9 ms, warm 768.9–871.6 ms. The JSON files are
authoritative; the table rounds to 0.1 ms.
Entry bundles (raw / gzip bytes): `main` 6,691,449 / 1,786,481, `scripts`
825,757 / 238,428, `styles` 136,950 / 23,253, `polyfills` 56,102 / 20,644;
React `remoteEntry.js` 4,109 / 1,785.
Environment: macOS (Darwin 23.6.0), Apple M3 Pro, 36 GiB, Playwright
Chromium 140.0.7339.186, Node v22.21.1 (the `.nvmrc` version), AC power.
Zeppelin was built from the same commit (`zeppelin-server` with its
dependencies, and `shell`), with anonymous access and an empty isolated
notebook directory. Measurement started after the post-build Spotlight indexing
settled (1-minute load average 3.8).
Files:
* `e2e/performance/baselines/70eef3f8-….raw.json` / `.summary.json`: added
with `git add -f`, as the README describes, because generated outputs stay
git-ignored.
* `e2e/performance/README.md`: the sentence saying there is no pinned
baseline now points to the recorded one, and a `Recorded Angular baseline`
section lists the commit, environment and summary. It also notes that note
import needs at least one interpreter. With none installed, import fails with
HTTP 500 (`InterpreterSettingManager.getDefaultInterpreterSetting` throws
`IndexOutOfBoundsException`). The fixture's paragraphs use `%sh`, so building
`shell` is enough. No existing sentence [...]
### What type of PR is it?
Improvement
### Todos
* [x] Record 10 cold and 10 warm samples at a pinned `master` commit
* [x] Commit raw and summary JSON with the environment record
* [x] Point the README at the recorded baseline
### What is the Jira issue?
[ZEPPELIN-6722](https://issues.apache.org/jira/browse/ZEPPELIN-6722)
### How should this be tested?
```bash
cd zeppelin-web-angular
npm run test:shell -- test/notebook-baseline.spec.ts
# against an isolated Zeppelin serving the `npm run build` output, with the
shell interpreter installed
PLAYWRIGHT_BASE_URL=http://localhost:8080/ PERF_NOTEBOOK_DISPOSABLE=1 npm
run perf:notebook-baseline
```
What I ran locally:
* Contract unit tests: 12/12 passed.
* Dry run (1 cold + 1 warm) passed before the real run; its output was not
committed.
* The real run passed and the imported note was deleted afterwards (the
notebook store was empty again).
* I recomputed the median and nearest-rank p95 from the raw samples. They
match the summary, and the raw and summary metadata are identical.
* Bundle SHA-256, raw bytes and `zlib` gzip bytes match the built `dist`
files.
* Fixture hash mismatch: changing one byte in the fixture made the command
fail with `Benchmark fixture SHA-256 mismatch`. The fixture was restored before
committing.
* Ready-condition mismatch was **not** exercised against a live server. It
relies on the existing ZEPPELIN-6668 spec and unit tests.
* No Playwright E2E suite run, since this PR changes no application or test
code.
Numbers from a different machine are not expected to match. Compare a later
run with this baseline only when it was recorded in the same environment.
### Screenshots (if appropriate)
N/A.
### Questions:
* Does the license files need to update? No. The baseline JSON is covered
by the existing RAT `**/*.json` exclusion.
* Is there breaking changes for older versions? No.
* Does this needs documentation? The benchmark README is updated in this PR.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Closes #5512 from kimyenac/ZEPPELIN-6722.
Signed-off-by: YONGJAE LEE <[email protected]>
---
zeppelin-web-angular/e2e/performance/README.md | 19 ++-
.../70eef3f8-b75c-427a-b8b4-bfcd65b71264.raw.json | 185 +++++++++++++++++++++
...eef3f8-b75c-427a-b8b4-bfcd65b71264.summary.json | 87 ++++++++++
3 files changed, 289 insertions(+), 2 deletions(-)
diff --git a/zeppelin-web-angular/e2e/performance/README.md
b/zeppelin-web-angular/e2e/performance/README.md
index f1f8b70e0d..4f01adbf3b 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 conf [...]
-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 [...]
+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 [...]
`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/<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.
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 0000000000..ec8db260e4
--- /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 0000000000..25b4c82c8e
--- /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
+ }
+ }
+ }
+}