mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-06 16:09:41 +00:00
### **PR Type** Enhancement, Tests ___ ### **Description** - Add robust alerts cleanup utilities - Improve UI flows and resiliency - Support deployed env testing delays - Add CI cleanup and health checks ___ ### Diagram Walkthrough ```mermaid flowchart LR UI["Playwright UI flows hardened"] API["APICleanup cascade (Alerts→Folders→Destinations→Templates)"] CI["CI workflow targets deployed env"] Delay["Configurable test step delay"] Data["Global ingestion more robust"] UI -- "uses" --> API CI -- "runs cleanup.spec" --> API CI -- "health checks + env vars" --> Data Delay -- "slows page ops" --> UI Data -- "ingest logs with parsing" --> UI ``` <details> <summary><h3> File Walkthrough</h3></summary> <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><details><summary>7 files</summary><table> <tr> <td><strong>alertDestinationsPage.js</strong><dd><code>Add search, cascade-safe delete, bulk prefix cleanup</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-57e5c53b4ef998b3d8708149620ff94dcc46807927f1a3a9e9f28ed3ebe25b0a">+178/-0</a> </td> </tr> <tr> <td><strong>alertTemplatesPage.js</strong><dd><code>Add template search, in-use handling, prefix cleanup</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-f4ebd248b2140051e74dbbbd1aabe344f01c80704ce5857e9c28a04350e018f3">+177/-2</a> </td> </tr> <tr> <td><strong>alertsPage.js</strong><dd><code>Harden alert actions, bulk deletion, search across folders</code></dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-79ee01d6d7f145f19207b93b87143b545a1188cfc6a82bc8c45fecfbf68f8a1d">+280/-9</a> </td> </tr> <tr> <td><strong>apiCleanup.js</strong><dd><code>New API-based cascade cleanup utility</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-537fe76c0d8e26e81c5f77c83bd0ee35daaa973822105c809bf83171a26b33c5">+399/-0</a> </td> </tr> <tr> <td><strong>page-manager.js</strong><dd><code>Wire APICleanup into PageManager</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-565eab8b3c767ae50c9d05e591621d14f66b81af84d6b5ea6efe136c1c3933df">+4/-0</a> </td> </tr> <tr> <td><strong>baseFixtures.js</strong><dd><code>Add configurable test step delay hooks</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-c4c5ee7fbb248d1ab14d3d4e33ffb9626f9aab74c9e0207fcfc08051c8c3c7ee">+46/-0</a> </td> </tr> <tr> <td><strong>global-setup.js</strong><dd><code>Harden login and ingestion with diagnostics</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-06323dad7214f86b41b62e121e716eeea0054bc4d950c6bcf4a0efe53894acc8">+61/-22</a> </td> </tr> </table></details></td></tr><tr><td><strong>Bug fix</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>commonActions.js</strong><dd><code>Fix ingestion URLs to use org variable</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-4d726dd2bdb34b2c90a31798ff49b6df5bc952bd049b7c38bebb18b6db0076e2">+4/-4</a> </td> </tr> </table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>4 files</summary><table> <tr> <td><strong>alerts-e2e-flow.spec.js</strong><dd><code>Pre-move folder cleanup and stabilization</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-32972e38c1fe0e8bb887f9f254b3130916a36f96ea924f9987493d44efefeab9">+13/-3</a> </td> </tr> <tr> <td><strong>alerts-import.spec.js</strong><dd><code>Use dedicated invalid import test data</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-62b6ec4818685eacc0a934d68aaadfd73b512ef4f4be25fcd5135b97c2844912">+1/-1</a> </td> </tr> <tr> <td><strong>cleanup.spec.js</strong><dd><code>New pre-test API cleanup spec</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+29/-0</a> </td> </tr> <tr> <td><strong>invalid-alert.json</strong><dd><code>Add invalid alert sample for import tests</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-c695f71048e9393a45d3e3e3e415696559fecf3ba85712e7c3f366092f53f424">+24/-0</a> </td> </tr> </table></details></td></tr><tr><td><strong>Configuration changes</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>playwright.yml</strong><dd><code>Target deployed env; add cleanup job and health checks</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/8839/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+123/-65</a></td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___
91 lines
2.8 KiB
JavaScript
91 lines
2.8 KiB
JavaScript
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
import * as crypto from 'crypto';
|
|
import { test as baseTest } from '@playwright/test';
|
|
const testLogger = require('./utils/test-logger.js');
|
|
|
|
const istanbulCLIOutput = path.join(process.cwd(), '.nyc_output');
|
|
|
|
export function generateUUID() {
|
|
return crypto.randomBytes(16).toString('hex');
|
|
}
|
|
|
|
/**
|
|
* Global test step delay for deployed environment testing
|
|
* Helps with network latency and eventual consistency issues
|
|
*/
|
|
const TEST_STEP_DELAY_MS = parseInt(process.env.TEST_STEP_DELAY_MS || '0', 10);
|
|
|
|
/**
|
|
* Adds a configurable delay between test steps
|
|
* Use this when testing against deployed environments to allow for:
|
|
* - Network latency
|
|
* - Data ingestion delays
|
|
* - UI state synchronization
|
|
*/
|
|
export async function slowDown(customDelay) {
|
|
const delay = customDelay !== undefined ? customDelay : TEST_STEP_DELAY_MS;
|
|
if (delay > 0) {
|
|
await new Promise(resolve => setTimeout(resolve, delay));
|
|
}
|
|
}
|
|
|
|
export const test = baseTest.extend({
|
|
context: async ({ context }, use) => {
|
|
await context.addInitScript(() =>
|
|
window.addEventListener('beforeunload', () => {
|
|
try {
|
|
(window).collectIstanbulCoverage(JSON.stringify((window).__coverage__))
|
|
} catch (error) {
|
|
testLogger.error('Failed to collect coverage on page unload', { error });
|
|
}
|
|
}),
|
|
);
|
|
await fs.promises.mkdir(istanbulCLIOutput, { recursive: true });
|
|
await context.exposeFunction('collectIstanbulCoverage', async (coverageJSON) => {
|
|
if (!coverageJSON) return;
|
|
const filename = path.join(istanbulCLIOutput, `playwright_coverage_${generateUUID()}.json`);
|
|
try {
|
|
await fs.promises.writeFile(filename, coverageJSON);
|
|
} catch (error) {
|
|
testLogger.error('Failed to write coverage data', { error });
|
|
}
|
|
});
|
|
await use(context);
|
|
await Promise.all(context.pages().map(async (page) => {
|
|
try {
|
|
await page.evaluate(() => (window).collectIstanbulCoverage(JSON.stringify((window).__coverage__)))
|
|
} catch (error) {
|
|
testLogger.error('Failed to collect final coverage for page', { error });
|
|
}
|
|
}));
|
|
},
|
|
|
|
page: async ({ page }, use) => {
|
|
// Only add delays if TEST_STEP_DELAY_MS is set (for deployed env testing)
|
|
if (TEST_STEP_DELAY_MS > 0) {
|
|
const originalGoto = page.goto.bind(page);
|
|
const originalClick = page.click.bind(page);
|
|
const originalFill = page.fill.bind(page);
|
|
|
|
page.goto = async (...args) => {
|
|
await slowDown();
|
|
return originalGoto(...args);
|
|
};
|
|
|
|
page.click = async (...args) => {
|
|
await slowDown();
|
|
return originalClick(...args);
|
|
};
|
|
|
|
page.fill = async (...args) => {
|
|
await slowDown();
|
|
return originalFill(...args);
|
|
};
|
|
}
|
|
|
|
await use(page);
|
|
}
|
|
});
|
|
|
|
export const expect = test.expect; |