From 78523e7063afed9e549f936387a0eaa93c7c6a9e Mon Sep 17 00:00:00 2001 From: Melove Date: Sun, 10 May 2026 02:43:52 +0530 Subject: [PATCH 1/2] derived versions at runtime, fixed collector URL, and asserted no error pages --- .github/workflows/screenshots-capture.yml | 2 ++ .../scripts/take-screenshots.mjs | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/.github/workflows/screenshots-capture.yml b/.github/workflows/screenshots-capture.yml index b31f4e721..59161d710 100644 --- a/.github/workflows/screenshots-capture.yml +++ b/.github/workflows/screenshots-capture.yml @@ -45,6 +45,8 @@ jobs: - name: Build the frontend run: bun run build + env: + VITE_FEATURE_FLAG_COLLECTOR_PAGE: "true" - name: Create screenshots directory run: mkdir -p screenshots diff --git a/ecosystem-explorer/scripts/take-screenshots.mjs b/ecosystem-explorer/scripts/take-screenshots.mjs index 75e6138b1..cb86a3f8c 100644 --- a/ecosystem-explorer/scripts/take-screenshots.mjs +++ b/ecosystem-explorer/scripts/take-screenshots.mjs @@ -24,9 +24,23 @@ const SCREENSHOTS_DIR = path.resolve("screenshots"); const PORT = 4173; const BASE_URL = `http://localhost:${PORT}`; -// Pick an instrumentation known to have telemetry and configuration data -const DETAIL_VERSION = "2.25.0"; +// Resolve latest versions at runtime from the generated data files. +// This prevents the script from going stale when new versions are released. +function resolveLatestVersion(indexPath) { + const index = JSON.parse(fs.readFileSync(indexPath, "utf-8")); + const latest = index.versions.find((v) => v.is_latest); + if (!latest) throw new Error(`No latest version found in ${indexPath}`); + return latest.version; +} + +const DETAIL_VERSION = resolveLatestVersion( + path.resolve("public/data/javaagent/versions-index.json") +); const DETAIL_NAME = "spring-webmvc-6.0"; +const COLLECTOR_VERSION = resolveLatestVersion( + path.resolve("public/data/collector/versions-index.json") +); +const COLLECTOR_DETAIL_ID = "core-receiver-otlpreceiver"; // Viewport sizes captured for each page. Edit here to add, remove, or resize. const VIEWPORTS = [ @@ -104,6 +118,16 @@ async function clickTab(page, name) { } } +async function assertNoError(page, url) { + const errorHeading = page.getByRole("heading", { name: /error/i }); + const notFound = page.getByRole("heading", { name: /not found/i }); + const hasError = await errorHeading.isVisible().catch(() => false); + const has404 = await notFound.isVisible().catch(() => false); + if (hasError || has404) { + throw new Error(`Screenshot aborted: error page detected at ${url}`); + } +} + async function takeScreenshots() { const server = await startServer(); let browser; @@ -164,6 +188,7 @@ async function takeScreenshots() { const detailUrl = `${BASE_URL}/java-agent/instrumentation/${DETAIL_VERSION}/${DETAIL_NAME}`; await page.goto(detailUrl, { waitUntil: "domcontentloaded", timeout: 10000 }); await settle(page); + await assertNoError(page, detailUrl); await page.screenshot({ path: p("detail-details"), fullPage: true }); // 4. Telemetry tab (skipped gracefully if tabs aren't present in this branch) @@ -183,11 +208,13 @@ async function takeScreenshots() { await page.screenshot({ path: p("collector-list") }); // 7. Collector detail - await page.goto(`${BASE_URL}/collector/components/latest/receiver-otlp`, { + const collectorDetailUrl = `${BASE_URL}/collector/components/${COLLECTOR_VERSION}/${COLLECTOR_DETAIL_ID}`; + await page.goto(collectorDetailUrl, { waitUntil: "domcontentloaded", timeout: 10000, }); await settle(page); + await assertNoError(page, collectorDetailUrl); await page.screenshot({ path: p("collector-detail"), fullPage: true }); logTime(`${viewport.name} done`); From ecea63f71a3c730cbc87b2942b9650e0ba9153fb Mon Sep 17 00:00:00 2001 From: Melove Date: Mon, 11 May 2026 14:45:55 +0530 Subject: [PATCH 2/2] add assertNoError before every screenshot to catch all error pages --- ecosystem-explorer/scripts/take-screenshots.mjs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ecosystem-explorer/scripts/take-screenshots.mjs b/ecosystem-explorer/scripts/take-screenshots.mjs index cb86a3f8c..b09dbc562 100644 --- a/ecosystem-explorer/scripts/take-screenshots.mjs +++ b/ecosystem-explorer/scripts/take-screenshots.mjs @@ -174,6 +174,7 @@ async function takeScreenshots() { // 1. Home page await page.goto(BASE_URL, { waitUntil: "domcontentloaded", timeout: 10000 }); await page.waitForSelector("h1", { state: "visible", timeout: 5000 }); + await assertNoError(page, BASE_URL); await page.screenshot({ path: p("home") }); // 2. Java agent instrumentation list @@ -182,6 +183,7 @@ async function takeScreenshots() { timeout: 10000, }); await settle(page); + await assertNoError(page, `${BASE_URL}/java-agent/instrumentation`); await page.screenshot({ path: p("instrumentation-list") }); // 3. Java agent instrumentation detail - Details tab @@ -193,10 +195,12 @@ async function takeScreenshots() { // 4. Telemetry tab (skipped gracefully if tabs aren't present in this branch) await clickTab(page, "Telemetry"); + await assertNoError(page, detailUrl); await page.screenshot({ path: p("detail-telemetry"), fullPage: true }); // 5. Configuration tab (skipped gracefully if tabs aren't present in this branch) await clickTab(page, "Configuration"); + await assertNoError(page, detailUrl); await page.screenshot({ path: p("detail-configuration"), fullPage: true }); // 6. Collector list @@ -205,6 +209,7 @@ async function takeScreenshots() { timeout: 10000, }); await settle(page); + await assertNoError(page, `${BASE_URL}/collector/components`); await page.screenshot({ path: p("collector-list") }); // 7. Collector detail