mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-05 16:10:43 +00:00
fd2306ffaa3ec2d760f05df3fcf3791efb1ff991
12
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
82d14e8458 |
test(sentinel): POM compliance across Playwright suite (non-Dashboards) (#13727)
## What & why Sentinel (Council of Agents) audit-driven **Page Object Model compliance** across the Playwright suite. Many specs (a lot added recently, some AI-generated) had raw `page.locator(...)` / `page.getBy*(...)` selectors directly in spec files — including inside `expect(...)` — which the Sentinel flags as CRITICAL. This PR relocates those selectors into their page objects and calls page-object methods/getters instead. A full audit of **all 256 specs** was generated first (stored locally under `tests/ui-testing/MD_Files/sentinel-audit-2026-08-10/`, which is gitignored). Original totals: **1,609** raw selectors, **190** inside assertions, plus console/testLogger items. ## Scope of THIS PR (non-Dashboards) Every non-Dashboards spec is now **100% raw-selector clean** (verified: 0 occurrences). Shards covered: - **GeneralTests, Logs (Core/Builder-Advanced/Features/Regression), Traces (+Reg), Streams (+Reg), Metrics (+Reg), Pipelines, Reports (+Reg), Anomaly, Login/auth, auth-warm, and the unmatched Alerts specs.** - `console.*` → `testLogger` where it was Node-context (kept `console.*` **inside `page.evaluate()`** — that's browser context; `testLogger` doesn't exist there). - `testLogger` import/use added where missing. - **`waitForTimeout` intentionally left as-is** (logged in the audit, not rewritten — per direction). ## Deferred to a follow-up PR The **heavy Dashboards shards** (Variables 693, Config-Settings 255, Tables 127, Charts 81, Core 79, Visualize 65, Settings 52, Panel-DateTime 55, Dashboard-Regression 52 raw selectors) are **not** in this PR — they're the bulk of the work and will be a separate, focused pass. (dashboard-streaming console cleanup is included here.) ## Verification Fixes were applied and executed **shard by shard** against a local env, gated green before commit where the env allowed: | Group | Local result | |-------|--------------| | GeneralTests (edited specs) | 52 passed / 11 skipped / 0 failed | | Logs (shareLink, logsQuickPick, indexquery) | 21 passed | | Traces / Streams / Metrics | 49 passed / 2 skipped / 0 failed | | Pipelines | 56 passed / 17 skipped / 0 failed | | logs-bugs :548, dashboard-streaming | verified not regressed (isolation) | **Alerts create-wizard specs** (Alerts shard, Alerts-Regression, unmatched Alerts) could not be gated locally — the alert-creation wizard's stream popover times out on this env **on unmodified code too** (reproduced on original, test `:363`), so those refactors are 1:1 selector→method mappings, syntax-clean (`node --check`), and rely on CI to gate. Every changed `.js` passes `node --check`. `waitForTimeout` unchanged; no behavior changes intended. ## Stats 51 files changed. Selectors moved into page objects, not deleted. |
||
|
|
087e1498ab |
feat(slos): add SLO burn-rate alerts (#13704)
design at /slo ## What Adds **SLO burn-rate alerts** — an alert family that fires off an SLO's error budget rather than a raw query — and finishes the SLO surface around it: navigation entry, detail-page fixes, and the flag removal now that SLOs have shipped. ## Changes **SLO burn-rate alerts (backend)** - New burn-rate evaluation (`config/src/meta/slo/burn.rs`, `condition.rs`) with multi-window burn conditions, and `core/src/slo/evaluate.rs` extended to evaluate them on the SLO job. - Alerts carry an `slo_id`; `infra/src/table/alerts` gains the column, filtering, and query support so an SLO's alerts can be listed and deleted with it. - Alert levels (`meta/alerts/level.rs`) and tags extended for the SLO family; scheduler handlers route SLO alerts through the same notification path. **SLO alert UI** - `SloAlertForm` + `AlertDetailSlo`: create, edit and view burn-rate alerts from the SLO detail page and the alert list. - Payload/routing helpers (`utils/alerts/sloAlertPayload.ts`, `sloAlertRouting.ts`, `alertPayload.ts`) with unit tests. - `AlertDestinationsField` extracted as the complete Destination form field — side label, tooltip, combined destinations/workflows picker, inline error, refresh, and create-in-new-tab. It replaces two verbatim copies in the generic alert form and is reused by the SLO form and synthetics `CheckAlerts` (which sets `supportsWorkflows: false`, since a check has no workflow routing). Fixes the SLO form's previously unwired refresh and Add Destination buttons. **SLO detail page fixes** - Burndown and burn-rate charts drew as bare axes when coverage was sparse: `showSymbol: false` means an isolated measured bucket between gaps has no segment and paints nothing. Symbols are now sized per point, and a sparse-coverage note states how many buckets actually recorded events. - Nothing scrolled below ~700px of viewport height — `OPageLayout`'s fixed flex body plus `OTabPanels` `scroll="none"` clipped the panels. Panels now grow and scroll; the stat strip and tab bar stay pinned. Verified at 1024x500, 1280x620, 1512x945. **Other** - `ZO_SLO_ENABLED` removed — SLOs have shipped, so the flag and its status/route gating are gone. - SLOs surfaced in the main nav. - Dashboard chart panel header gets its own tint via new `--color-panel-bar-bg` / `--color-panel-bar-border` tokens, and the bar is extracted into `PanelBar.vue` (it existed as five hand-copied class strings that had already drifted). - `tsconfig.vitest.tsbuildinfo` untracked; third-party vendor name removed from comments and test names. ## Testing - New Rust tests across `meta/slo/burn.rs`, `condition.rs`, `core/src/alerts/alert.rs` and `infra/src/table/alerts`. - New frontend suites: `sloAlertPayload.spec.ts`, `sloAlertRouting.spec.ts`, `alertPayload.spec.ts`, `AlertDetailSlo.spec.ts`, `SloDetailAlerts.spec.ts`, `SloListDelete.spec.ts`, `SloTimeSlicePreview.spec.ts`. - `cargo clippy --all-targets` and `web` `lint:ci` clean. |
||
|
|
98e03bca15 |
test(e2e/alpha1): stabilize the alpha1 cloud suite — auth self-heal, infra, and per-test heals (#13626)
## Stabilize the Alpha1 (cloud) e2e suite + regression carryover Root-caused and fixed the failures surfacing on the Alpha1 cloud runs — investigated live via Playwright MCP against alpha and, where possible, a local build. Grouped by theme. Every fix is non-masking (still fails if the underlying is genuinely broken). Pairs with ENT #2351 (`max-parallel` + Logs-SelectStar `quick_mode`). ### Runtime / infra resilience (whole-suite) - **Auth self-heal on 401 / session expiry** — the shared cloud session + per-org passcode are minted once and reused all run; on load/contention they expire mid-run (`User not authenticated`, `HTTP 401 Unauthorized`). `cloud-auth.authedRequest` refreshes the passcode and retries on 401 (escalating to a full Dex re-login if the session is dead); `navigateToBase` re-authenticates and resumes instead of throwing. Also routed the alert **template-creation** API through it (401 there cascaded into "Failed to navigate to templates"). Gated on `isCloudEnvironment()` — no self-hosted change. - **`--disable-dev-shm-usage`** on the alpha1 Chromium launch — the EKS pods used the default 64MB `/dev/shm`; under 5 workers on long/heavy shards Chromium exhausted it and the pod OOM-killed → "runner lost communication" (frozen step + 404 logs). Route shared memory to /tmp; eliminates the infra deaths. - **Service graph queries a wide window** (`period=6h`) — the tab defaulted to Past 15 Minutes and rendered "No service graph data" before the daemon-processed topology fell inside the window. ### Pipelines - `queryStream(stream, expectedMinCount)` **polls until the record count lands** (pipeline output arrives async) — was single-shot ("Expected 5, got 3"). - `openPipelineForEdit` **searches + polls-with-reload** for the edit button (list not refreshed after save → 45s click timeout). - `exploreStreamAndNavigateToPipeline` **reloads the streams list** while polling for Explore, and **falls back to a direct logs URL** when a freshly-ingested source stream never surfaces in the list (stream-stats lag). ### Alerts - Alert-destination URL → **public `example.com` webhook** (self-host URL hit the cloud **SSRF guard** → form never closed). - **Force-click the virtualized folder item** (#9484) — the row re-rendered mid-click → 45s "not stable". - **Export button readiness** — it's rendered only on selection; wait for visible+enabled (re-selecting if needed) before clicking. - **`deleteAlertByRow` cleanup readiness** — the just-created alert's more-options kebab needs longer than 5s under load. ### RegressionSet - **Use the shard's org** (`getOrgIdentifier()`), not hardcoded `org_identifier=default`, in `logs-bugs` — on cloud the data lives in `auto_org_N`, so the logs page never rendered. - **Unique stream names** for `logs-9754` / `logs-bugs:1419` — fixed names collided with concurrent shared-org runs ("stream is being deleted"). ### Traces / correlation - **Migrated `logs-bugs:995` (bug-11469)** to the redesigned correlation UI — the old `log-correlation-btn` / `correlation-dashboard-close` are gone; repointed to the inline `correlated-traces-tab`, assertion (`expectNoContextMenuVisible`) unchanged and **verified live on alpha** (no fake-pass). ### Workflows (ENT-only) + misc - **Healed the workflows destination flow** and forced-type Connection-step assertion; alert/report list-readiness hardening. - **Enrichment tables list** readiness (30s + re-nav retry) — "slow under load". ### Notes - Validated live via MCP (alpha) and a local build where the feature exists. - Alpha1 config already runs `retries: 2`; the remaining first-attempt flakes are shared-env load, addressed on the ENT side via `max-parallel`. |
||
|
|
1daa36b0f8 |
fix(logs): preserve restored SQL query on shared-link open + align log-detail default-tab test (13368) (#13414)
> **This PR contains two independent logs changes:**
> **(A)** a product fix for the shared-link SQL-query restore race, and
> **(B)** the log-detail default-tab test alignment (original scope of
this PR).
---
# (A) fix(logs): preserve restored SQL query on shared-link open
(fullSQLMode watcher race)
## The bug
Opening a **shared link** to an SQL search **sometimes lands on an empty
query editor** ("SQL query is missing or invalid") instead of the shared
search. Intermittent, worse under load — it's the recurring
Logs-Features alpha flake (`monaco-query-prefill` P0 "query editor never
contained SELECT").
**Not the short-URL mechanism** — the short URL correctly carries
`sql_mode=true` + the base64 query. The loss happens in the browser
during restore.
## Root cause — a watcher race
`restoreUrlQueryParams()` raises `shouldIgnoreWatcher`, flips
`meta.sqlMode = true`, then writes the decoded query into the editor.
Flipping `sqlMode` fires the **`fullSQLMode`** watcher in `Index.vue`,
whose two branches were **asymmetric**:
- **switch OFF** branch → already checks `shouldIgnoreWatcher` ✅
- **switch ON** branch → **did not** ❌ — it called `setQuery()`,
rebuilding a *default* `SELECT … FROM stream` over the value the restore
was mid-writing.
Under load the watcher wins the race; the editor briefly empties, SQL
mode auto-detects back **off**, and the editor is cleared entirely.
## The fix
Make the "switch ON" branch honour `shouldIgnoreWatcher` too — symmetric
with "switch OFF". During any programmatic restore the watcher **stands
down** and the restored query is the last word. (`shouldIgnoreWatcher`
is raised only by programmatic-state paths whose purpose is to suppress
watcher side-effects, so honouring it here is consistent.)
## Verification (A)
- ✅ **New unit test**: with `shouldIgnoreWatcher` set, flipping
`sqlMode` ON does **not** call `setQuery`/`updateUrlQueryParams`, and
the restored `SELECT` query is preserved.
- ✅ Existing `fullSQLMode` watcher test still passes; full
`Index.spec.ts` green (**69 passed**).
- ✅ Reproduced the failure on **alpha under CI-load** beforehand
(share-link P0 flaky, "query editor never contained SELECT").
- ⚠️ The race is only observable against a **deployed** frontend (the
alpha e2e suite runs against alpha's frontend, not a local build), so
the final "flake gone on alpha under load" check requires this deployed
to alpha, then re-running the Logs-Features share-link tests.
Files: `web/src/plugins/logs/Index.vue`,
`web/src/plugins/logs/Index.spec.ts`.
---
# (B) test(logs): align log-detail default-tab test with Table default
(13368)
## What
Updates the log-detail sidebar default-tab regression test (originally
Bug #9724) to match the **intentionally shipped** behavior from [PR
#13368](https://github.com/openobserve/openobserve/pull/13368) — *"logs
sidebar table will be default view and draggable tabs"*.
## Why
#13368 changed the log-detail sidebar default from the **JSON** tab to
the **Table** tab (`SearchResult.vue` — `detailTableInitialTab.value =
"table"`). The Bug #9724 test still asserted JSON-as-default, so it
fails on `main`: the JSON tab's `data-state` stays `inactive` for the
full timeout across all retries, on both OSS and ENT Logs-Regression.
Not a flake and not a product bug — the test expectation was simply out
of date after a deliberate default-view change.
## Changes
- Rename test → **"Log detail sidebar opens with Table tab by default
(#13368)"**.
- Add `verifyTableTabSelectedByDefault()` page-object helper
(auto-retrying `toHaveAttribute('data-state','active')`); remove the
now-invalid `verifyJsonTabSelectedByDefault()`.
- Reorder switch steps: assert Table default (+ wrap toggle, which
renders only on the Table tab), switch to JSON and back to Table, reopen
and confirm Table default persists.
## Note on #13407
Supersedes the earlier heal
[#13407](https://github.com/openobserve/openobserve/pull/13407), which
misdiagnosed the failure as a `data-state` timing flake. A
locally-hosted stale pre-#13368 build had masked the change.
Files: `tests/ui-testing/pages/logsPages/logsPage.js`,
`tests/ui-testing/playwright-tests/RegressionSet/Logs/logs-regression.spec.js`.
```
npx playwright test playwright-tests/RegressionSet/Logs/logs-regression.spec.js \
-g "Table tab by default" --project=chromium
```
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
f15e27e5fd |
refactor: design token migration + CI guards (#13173)
# Design System Unification — one visual language, enforced end-to-end
Establishes **one source of truth for every visual decision**, wires the
whole app to it, and **locks it in with CI** so it can't drift back.
### Foundations
- **Design-token system ("one knob per decision").** Every colour, text
size, spacing, corner radius, and shadow is a named token defined in
exactly one place — change the token, every screen updates. Collapsed
hundreds of near-duplicate definitions and removed "fake" duplicates
that pretended to be different but weren't.
- **Shared component library (O2).** Buttons, tables, dialogs, drawers,
form fields, badges, etc. already know the correct colours, spacing, and
dark-mode behaviour; new screens compose them instead of hand-styling.
Added new primitives on this branch (`OContent`, `KpiCard`) and
standardized existing ones.
- **One page structure everywhere** (`PageLayout` / `AppPageHeader` /
`AppPage` / `OContent`) — titles, breadcrumbs, spacing, and content
edges line up identically across every screen.
- **One table implementation** — all tabular data uses the same table
(sorting, density, sticky headers, empty states).
- **Styling consolidated onto Tailwind; old systems removed** —
hand-written CSS driven to the practical minimum, the legacy **Quasar**
framework fully removed, surviving stylesheets required to justify
themselves.
- **Two-tier corner radius** — a tight **4px** for controls and a soft
**12px** for surfaces (dialogs, cards, the app shell), plus a
full-circle option — replacing five radius names that all secretly meant
the same thing.
### Detailed improvements across screens
**Page structure & alignment** — unified page shell rolled across ~40+
screens (IAM, Settings, Alerts, Dashboards, Functions, Pipelines, RUM,
Metrics, Synthetics, Billing, editors, lists); one header height; one
page-edge grid driving headers, tables, rails, and tabs; unified
side-rail widths; inset rail selection/hover pills; every tab strip on
the grid line; tightened title/subtitle spacing.
**Tables (cross-screen)** — action columns consistently centered (incl.
Organizations); unified row-number column with no "#" truncation;
non-standard tables restyled to match; loading skeletons made
geometrically identical to the loaded table; symmetric edge inset; IAM
first-column grid alignment fixed.
**Traces** — flame graph + span-detail correlation panel fixes;
correlated logs/metrics placeholder fit; sticky headers; removed a
double scrollbar + a 1px sliver; aligned table fonts/badges; polished
the service detail drawer; stream-selector + correlation alignment;
aligned loading spinners; floating overlay arrows for the
disabled-services strip.
**Logs** — field-list controls aligned (focus ring no longer clipped);
detail-drawer spacing + metrics-tab overflow fixed; Run Query toolbar
tidied; listing sizing + stray border fixed.
**Metrics** — search added to the "Type" facet rail and aligned with the
other rails; proper empty states for the explorer and facet rail.
**Dashboards** — removed inconsistent card shadows; tightened
borders/resizers/field-list spacing; aligned View Dashboard chrome to
the grid; chart colours via the token helper.
**Home** — redesigned the Usage tab; added reusable KPI stat cards so
summary strips stop drifting.
**Dark mode** — new theme-switch animation; fixed a 1px content shift on
toggle and a white flash on load; fixed AI-chat text and assorted
light/dark mismatches; completed the token-driven dark migration.
**Empty states, controls & small polish** — restored 3 broken
empty-state animations; adopted the standard empty state; added the
sliding indicator to the toggle control; fixed the Quality-page inset +
drawer badge; refreshed Search History / Schedulers; fixed the
alert-history drawer scrollbar + timeline hover; removed a stray
menu-bar border.
### Dead code & cruft removal
- **Deleted the entire legacy `utilities.css`** global stylesheet (well
over a thousand lines) — evacuated in waves, roughly half of it dead
once traced.
- **Removed Quasar entirely**, including dead `.q-*` styles and ~25
phantom `--q-*` variables that were silently breaking bits of the UI.
- Stripped hundreds of **dead CSS classes and tokens that compiled to
nothing** — e.g. 46 uses of a colour class with no backing token, a
no-op shadow class on 51 elements, dead layout/utility classes, a
leftover `card-container` block, a dead table-actions token, and a
mis-registered gradient that rendered nothing.
- Cut **unused keyframe animations (19 → 3)** and removed **unused
components** + a stray build artifact.
- Net effect: a much smaller, leaner styling surface — less to maintain,
fewer dead ends to copy.
## Safety & verification
Large but low-risk: this is overwhelmingly a **styling and structure**
change, not product behaviour or data. Guarded by the
design-token/consistency/type checks above plus the existing test suite,
and reviewed screen-by-screen.
---------
Co-authored-by: Kirtan Thakkar <kirtan@kiara.tech>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: ktx-mihir <mihir.patel@kiara.tech>
|
||
|
|
00b910a382 | fix: remove quasar leftovers (#13180) | ||
|
|
15541e3c1a |
fix(ci): stop rerun-detection crash + logs-9754 delete/re-ingest race (#13167)
Fixes two separate regression-suite CI failures observed in the
scheduled Playwright Regression run (surfaced on both OSS and ENT).
## 1. `Check if this is a rerun` step crashes on reruns
On a rerun the step queries the jobs API and iterates `.jobs[]`. When
the API returns a body **without** a `.jobs` key (rate-limit / error
response), jq hits `Cannot iterate over null`, exits 5, and under `bash
-e` the whole step dies — **skipping the entire test run**.
```
jq: error (at <stdin>:5): Cannot iterate over null (null)
##[error]Process completed with exit code 5.
```
`playwright.yml` was already hardened (`:-0` defaults + `2>/dev/null`),
but the fix was never backported to `playwright_regression.yml` — the
workflow that actually failed. This guards the jq with `(.jobs // [])` +
`2>/dev/null || echo "0"` and adds an explicit fallback to
`rerun_type=all` (run all tests — safe) when the counts aren't usable,
so the step can never abort the run.
## 2. `logs-9754.spec.js` delete → re-ingest race
The primary failure is a transient `expectLogsTableVisible()` timeout on
the `@P0 @highlighting` test. What turned that flake into a hard
failure: the describe runs in `serial` mode, so a failed test retries
the **whole block**. `afterAll` deletes the shared
`e2e_highlighting_test` stream but returns immediately, so the retry's
setup re-ingests into a still-deleting stream:
```
{"code":400,"message":"Error# stream [e2e_highlighting_test] is being deleted"}
```
The 5×3s setup retry window couldn't outlast the deletion, cascading
every retry to failure. `afterAll` now blocks on the existing
`waitForStreamDeletion()` helper so the next attempt starts from a clean
slate and Playwright's built-in retry becomes effective again.
## Changes
- `.github/workflows/playwright_regression.yml` — harden rerun-detection
jq + explicit fallback
-
`tests/ui-testing/playwright-tests/RegressionSet/Logs/logs-9754.spec.js`
— `afterAll` waits for stream deletion to settle
The ENT side of the workflow fix is in a companion PR. The spec fix
lives only here (the test folder is merged into ENT at CI time).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com>
|
||
|
|
cd634bae43 |
test: heal flaky logs field-values-cache regression test (readiness gate) (#12956)
## What Heals the flaky **\`should fetch fresh field values when switching streams\`** (`@fieldValuesCache @P1 @regression`) test in `RegressionSet/Logs/logs-bugs.spec.js`, which failed the `Logs-Regression` job in [o2-enterprise run 28454057830](https://github.com/openobserve/o2-enterprise/actions/runs/28454057830/job/84328391696). ## Root cause The test ingests a unique `service_name=svc-automate-<runId>` into the **shared** `e2e_automate` stream, then immediately drives the UI field-values panel — with **no readiness gate** confirming that value is searchable yet. Freshly-ingested data isn't queryable instantly (WAL → index lag), so the `_values` call returns `svc-automate-*` values from earlier runs/retries but misses the just-ingested one: ``` Error: Expected stream1 values to contain svc-automate-1782832273253, got: svc-automate-17828322504262 ``` Playwright retries amplify it — each retry adds another `svc-automate` value to the shared stream while still missing the current run's value, so all retries fail. > Note: the CI job's attempt-2 then crashed on a `jq: Cannot iterate over null` error in the rerun-detection step. That is a **separate, already-fixed** issue — current `main` already has `actions: read` on the job + jq guards; the failing run executed a stale pre-fix workflow snapshot (GitHub re-runs reuse the original attempt's YAML). No workflow change is needed here. ## Fix - Add `waitForFieldValueSearchable()` to `utils/data-ingestion.js` — polls `_search` until the exact field value is returned (the proven readiness-gate pattern, value-level rather than row-count level). - Gate both the stream1 and stream2 ingested values before the UI assertions. ## Verification Run locally against a local OpenObserve with `--repeat-each=3`: ``` Stream1 field values: ["svc-automate-...0702","svc-automate-...4762"] # accumulates (reproduces CI pollution) ✓ Stream1 shows correct value: svc-automate-1782833946762 # current value always present now ... 3 passed (1.0m) ``` The accumulating `svc-automate-*` values across repeats reproduce exactly the shared-stream pollution seen in CI, and the gate ensures the current run's value is always present. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
8f81d41a80 |
test: heal logs Bug #4426 wrap-toggle assertion (switch to Table tab) (#12937)
## What Heals the wrap-toggle assertion in the **Logs-Regression** shard — the `text wrap toggle should not cause column misalignment on saved view switch` test (Bug #4426) in `logs-bugs.spec.js`. ## Root cause The test opens the log detail sidebar and asserts the wrap toggle is visible. But the sidebar opens on the **JSON tab by default** (Bug #9724), and the wrap toggle only renders in the **Table tab**. So the assertion (`verifyWrapToggleVisibleInTableTab`) always waited out its full `expect` timeout against the hidden toggle, then fell into the `catch` and logged: ``` Wrap toggle not found in current log detail: Timed out 30000ms waiting for expect(locator).toBeVisible() Locator: locator('[data-test="log-detail-wrap-values-toggle-btn"]') Received: hidden ``` This is the `Wrap toggle not found` warning visible in the scheduled Logs-Regression run [28373343106](https://github.com/openobserve/openobserve/actions/runs/28373343106). The toggle assertion never actually verified anything and burned ~30s of the shard's wall-clock as noise. ## Fix Click the Table tab before asserting the toggle's visibility, so the toggle actually renders and the check is meaningful (and fast). ```js await pm.logsPage.clickLogDetailTableTab(); await pm.logsPage.verifyWrapToggleVisibleInTableTab(); ``` ## Verification - Targeted run against a local OpenObserve instance: **passes in 10.9s**, now logging `✓ Wrap toggle is visible in Table tab` instead of the timeout warning. - Full Logs-Regression shard (all 4 spec files, 67 tests) run locally beforehand: **67/67 passed** — no regressions. ``` npx playwright test playwright-tests/RegressionSet/Logs/logs-bugs.spec.js \ -g "text wrap toggle should not cause column misalignment" ✓ ...logs-bugs.spec.js:1818:3 › ... @bug-4426 (10.9s) 1 passed ``` ## Note The linked run's job-level failure was a runner **shutdown/cancel signal** (infra reclaim) on the Logs-Regression shard plus a separate failure in the `Merge Reports and Upload to TestDino` job — neither is a test-code failure (all 67 logs tests pass locally). This PR addresses the one genuine test-level defect surfaced in that run. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
68ff976565 |
test: heal Logs-Regression failures (log detail sidebar + stream race) (#12908)
## What Heals the **Logs-Regression** E2E shard failures from scheduled run [28227009440](https://github.com/openobserve/openobserve/actions/runs/28227009440/job/83622550234) (3 failed, 1 flaky). ## Root cause analysis | # | Test | Symptom | Cause | |---|------|---------|-------| | 1 | `logs-9754.spec.js:276` — log detail sidebar @P1 | `waitFor [data-test="log-table-column-0-source"]` 30s timeout in `openLogDetailSidebar` | First result cell renders as the FTS **body/message** column, not `source`, so the exact selector never appears | | 2 | `logs-regression.spec.js:1150` — JSON tab default (#9724) | Same `openLogDetailSidebar` selector, 45s click timeout | Same as #1 | | 3 | `logs-9754.spec.js:195` — preserve characters @P0 | `selectStream: Failed to find stream "e2e_highlighting_test" after 5 attempts` | **Cascade**: test #1 fails → serial block retries → `afterAll` `deleteStream` from the prior attempt is still settling → re-ingest returns `400 "stream [...] is being deleted"` → stream never re-appears | | 4 | `logs-regression.spec.js:60` — saved views (#9388) | `log-search-index-list-add-log-field-btn` not visible | Hover-revealed add button stayed below the fold; single re-hover missed | `openLogDetailSidebar` is the dominant root cause — it directly explains #1 and #2, and #1 triggers the serial-block retry that produces the #3 cascade. ## Fixes 1. **`openLogDetailSidebar`** — target any first-row cell via the `[data-test^="log-table-column-0-"]` prefix instead of the exact `...-source` cell. This mirrors the pattern already used by `clickLogTableColumnSource` and `waitForSearchResults`, which carry the same FTS-body-column note. 2. **`logs-9754` setup** — retry ingestion (up to 5×, 3s apart) when the response says the stream `is being deleted`, so a serial-block retry no longer cascades into "stream not found". 3. **`clickAddFieldToTableButton`** — `scrollIntoViewIfNeeded` + re-hover with retries so the hover-revealed add button reliably surfaces (#9388). ## Files - `tests/ui-testing/pages/logsPages/logsPage.js` - `tests/ui-testing/playwright-tests/RegressionSet/Logs/logs-9754.spec.js` ## Validation - `node --check` passes on both edited files. - Full Playwright run deferred to CI / local verification (changes are selector + retry hardening only; no production code touched). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
3b3f6b9df7 |
fix(test): harden SDR + Logs regression tests against CI render/index lag (#12893)
Two clusters of CI-only flakes — **every affected spec passes locally**;
all failures reproduce only under CI load (slow indexing /
re-rendering). All fixes are in test page-objects / setup — no product
or assertion changes.
## 1. SDR verification (o2-enterprise#2022, `e2e / SDR` — 7 failed)
`ingestionTime{Drop,Hash,Redaction}`, `queryTime{Drop,Hash,Redaction}`,
`multipleSDRPatterns` all died with `Field <name> should be visible but
was not found` (`foundLog === null`).
**Cause:** the verification helpers used **row count** as the readiness
signal for freshly-ingested logs. `fetchAllLogTexts` returned the moment
`minCount` rows rendered (the loose `tbody tr` fallback could even count
non-data rows), and `verifySingleFieldInLatestLog` broke on the first
non-null row — so under load they asserted against a partial/stale
result set before the fields were searchable. The per-field loop throws
on the first field, so the error always named the first field
(`website_url`/`user_email`/`multi_data`), masking the real cause.
**Fix (`sdrVerificationPage.js`):** make readiness content-aware —
`fetchAllLogTexts` takes `requiredFields` and retries until every
required field actually appears; `verifyMultipleFields` passes all
non-dropped fields; `verifySingleFieldInLatestLog` gates its retry loop
on field presence when expected.
## 2. Logs regression (scheduled Logs-Regression on `main` —
[OSS](https://github.com/openobserve/openobserve/actions/runs/28208045315)
/
[ENT](https://github.com/openobserve/o2-enterprise/actions/runs/28207989646),
3 failed + 1 flaky)
- **logs-9754** (`detail sidebar` / `unclosed brackets`): empty/late
table & `selectStream` not finding the stream — the setup only waited
for the stream to *exist*, not for its rows to be searchable. Gate the
setup on `waitForStreamData` (polls the search API).
- **#9724** (`detail sidebar JSON tab`): row resolved but the table was
still re-rendering → plain click timed out on "element not stable".
Harden `openLogDetailSidebar`: wait for a visible row, scroll into view,
click with a force fallback.
- **#9388** (`saved views stream switching`): the hover-revealed
add-field button was lost before the click. `clickAddFieldToTableButton`
now re-hovers the field row and waits again before failing.
## Verification (local, enterprise build `localhost:5080`)
| Suite | Result |
|-------|--------|
| 7 SDR specs | 14 passed |
| logs-9754.spec.js | 6 passed |
| logs-regression #9388 + #9724 | 2 passed |
```
npx playwright test playwright-tests/SDR/<spec>.spec.js --project=chromium
npx playwright test playwright-tests/RegressionSet/Logs/logs-9754.spec.js --project=chromium
npx playwright test playwright-tests/RegressionSet/Logs/logs-regression.spec.js -g "9388|9724" --project=chromium
```
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
85a0e8d8a7 |
test: restructure RegressionSet/ into feature subdirectories (#12664)
## Summary - Moves 17 spec files from flat `RegressionSet/` into 8 feature folders: Alerts, Dashboards, General, Logs, Metrics, Pipelines, Streams, Traces - Merges `logs-regression-bugs-2.spec.js` (9 tests) into `Logs/logs-bugs.spec.js` (36 tests total), removing the duplicate file - Drops the redundant `-regression` suffix from filenames (e.g., `alerts-regression-bugs.spec.js` → `alerts-bugs.spec.js`) - Updates `.github/workflows/playwright_regression.yml` matrix with new subdirectory paths - Adds missing `logs-ent.spec.js` and `traces-ent.spec.js` to CI shards ## Test plan - [ ] CI: Logs-Regression shard runs all 5 Logs files (merged bugs file + ent) - [ ] CI: All 8 shards resolve correct file paths under `RegressionSet/<Feature>/` - [ ] No file references the deleted `logs-regression-bugs-2.spec.js` 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> |