mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-05 16:10:43 +00:00
db1da2f09614bdfd8f3961ff06c9a5dcdfe1234c
756
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e0fe62a9a0 | fix: traces page default flame graph and drag-drop option added (#13347) | ||
|
|
21d0907342 |
fix(logs): redesign log patterns UI (#13337)
## What Redesign of the log patterns UI. - **`PatternCard`** reworked: template tokens, a badges row (trend / rarity / anomaly), and inline frequency + percentage replace the old fixed count and action columns. - **`PatternVolumeCell`** (new) + **`usePatternVolume`** (new) render per-pattern volume sparklines. - **`PatternDetailsDialog`** now owns the include / exclude / create-alert actions that previously lived on each card. - **`patternUtils`** / **`usePatternActions`** extended to back the above. ## Test plan - `web` unit tests for the touched areas: 356 passing, 0 failing (`plugins/logs/patterns`, `plugins/logs/data-table`, `SearchResult`, `FieldValuesPanel`). - New spec coverage for `PatternVolumeCell`, `usePatternVolume`, and `patternUtils`. - `npm run type-check` clean. - `lint:design`, `lint:tokens`, `lint:token-purity` all clean. ## Notes Rebased onto latest `main`. Five conflicts came from main's repo-wide type-check pass (#13174), which made `OIcon`'s `name` prop required. Main's fix (`name=""` + slot) was kept in `CodeQueryEditor.vue`, `FieldValuesPanel.vue`, and `CellActions.vue`; in `PatternCard.vue` the surrounding block was removed by this redesign, so the deletion stands. |
||
|
|
899bb681a8 |
test(e2e): optimize/fix alpha1 Alerts, SDR & Pipelines shards (operator select scoping + editor/nav/data-flow races + ingestion 5xx resilience) (#13336)
## What
Consolidated stabilization of the **Alerts**, **SDR** and **Pipelines**
shards of the
alpha1 cloud E2E suite (`playwright_alpha1.yml`) to green — the shards
still failing
after the earlier per-module stabilization PRs merged. Rebased on
`main`.
Across these shards the original run had: **Alerts** 1 hard fail,
**SDR** 1 hard fail +
1 flake, **Pipelines** 1 hard fail + several flakes. Root causes were an
ambiguous
operator-select selector plus cloud data/UI-readiness races (editor &
node-sidebar mount,
hover-flyout nav, freshly-ingested destination streams lagging their
list/table) and
transient backend 5xx on ingestion.
**No `waitForTimeout` added as a fix, no `force:true`, no
`.first()`/`.nth()` band-aids,
no retry-count bumps to hide failures, no weakened assertions. No
worker-count,
parallelism, playwright-config or CI/yml changes** — test code only.
## Root cause & fixes
**Alerts**
1. **Operator select — strict-mode violation** (`alerts-e2e-flow`, state
management).
The operator control is an OSelect that renders an aria-hidden native
`<select><option>=</option>` alongside the visible popover item, so the
unscoped
`getByText('=', {exact})` matched **two** nodes. Scope the option click
to
`[data-test="alert-conditions-operator-select-popover"]` +
`getByRole('option')`
(excludes the aria-hidden native select, mirrors the working
`alertCreationWizard.js`
pattern), and gate on the popover open/close instead of the trailing
`waitForTimeout`s.
(`alertManagement.js`)
**SDR**
2. **Stream Detail button — 45s timeout under load**
(`multipleSDRPatterns` @slow,
`ingestionTimeHash`). `openStreamDetail` resolved the button by the
icon's title text,
which the OTable can render after the name cell, and the retry only
re-clicked a
possibly-detached row without re-fetching the list. Resolve by the
stable
`data-test="log-stream-schema-btn"` and reload + re-search the streams
list between
attempts, keyed to the real "detail sidebar open" signal
(`schema-update-settings-button`). (`streamAssociationPage.js`)
**Pipelines**
3. **Editor / node-sidebar mount race** (`selectStream`, all pipeline
flows). A bare click
on the stream-input button dead-waited the 45s action timeout when the
VueFlow editor +
NodeSidebar missed the first render under concurrent load. Moved a
**non-destructive**
mount guard into `addPipeline`: after clicking Add, if the button hasn't
rendered and
we're still on the list (add button visible), re-click to re-trigger
navigation — no
`page.reload()` (a reload of the editor route re-runs the auth callback
on cloud and
stalls the shard). (`pipelinesPage.js`)
4. **`openPipelineMenu` — hover-flyout nav timeout.** Routed through the
left-nav hover
flyout, which self-closes on settle and, under load, burned ~30s
retrying to open before
its goto fallback fired — tipping long condition tests over the 180s
test timeout.
Promoted the already-proven `goto` to the primary path and skipped the
flyout (it adds
no coverage here). (`pipelinesPage.js`)
5. **Destination-stream data-flow / render latency**
(`pipeline-dynamic`, query-source
flow). Extended `openTimestampMenu`'s re-search loop (destination stream
indexing can
lag past the old budget) and `waitForQueryNodeVisible` 30s→45s
(query-node canvas render
lags under full-shard load) — both within the CI test timeout, both exit
early on the
real signal. (`pipelinesPage.js`)
**Ingestion resilience (Pipelines + shared helper)**
6. **Transient backend 5xx aborted ingestion.** `fetchWithRetry` only
retried thrown
network errors; a `503`/`502` is a "successful" fetch, so ingestion
threw on the first
one when the env returned transient 5xx during load spikes. Retry 5xx
with backoff in
both ingestion helpers — a persistent 5xx still surfaces after
`maxRetries`, so genuine
outages aren't masked. (`pipelinesPage.js`, `ingestionPage.js`)
## Validation
- **CI — Alerts / SDR / Pipelines green (alpha cloud):**
[Pipeline](https://github.com/openobserve/o2-enterprise/actions/runs/29809833252).
[SDR,
Alerts](https://github.com/openobserve/o2-enterprise/actions/runs/29771293789)
- **Original failing run:**
https://github.com/openobserve/o2-enterprise/actions/runs/29720987587
- **Local (real alpha cloud, `playwright-alpha1.config.js`):** each
previously-failing test
re-run to green — `pipeline-conditions.spec.js` @ `--workers=3` 6/6,
`pipeline-dynamic`
72 & 97, `pipelines:180` (query source) solo; Alerts operator flow and
SDR
`openStreamDetail` verified against alpha. 5xx-retry control flow
verified (2xx/4xx
unchanged, transient 503 recovers, persistent 503 still surfaces).
## Notes
- 4 files change (3 page objects + the shared ingestion helper). No
specs, shared
cleanup/setup, config, or workflow files touched.
- Any residual Pipelines tail is cloud latency / env backend health
(e.g. runs where the
env returns sustained 503s) — not test code; the durable lever there is
cross-shard
concurrency / env capacity, out of scope for this PR.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
b1604cc7b6 |
test(workflows): e2e + API tests for Workflows (#13318)
Adds automated test coverage for the Enterprise-only **Workflows** feature (now merged to main). Clean branch off `main` — test files only, no feature-code churn. **UI (Playwright · `tests/ui-testing`)** - `pages/workflowsPages/workflowsPage.js` — page object (verified `data-test` selectors, Save-tooltip JS-click workaround, slow-list waits, enterprise-availability probe). - `playwright-tests/Workflows/workflows-crud.spec.js` — build/name validation, list + search. - `playwright-tests/Workflows/workflows-negative.spec.js` — negative + NFR sweep (long/unicode/emoji names, list latency, console/network hygiene). - `pages/page-manager.js`, `pages/apiCleanup.js` (`cleanupWorkflows()` + cascade), `playwright-tests/cleanup.spec.js` (`wf_auto_*` prefixes). - `.github/workflows/playwright.yml` — `Workflows` testfolder in the matrix. **API (pytest · `tests/api-testing`)** - `tests/workflows/test_workflows.py` — full REST surface (create/list/update/enable/test/history/errors/retry/delete) + validation, auth (401), cross-org. **Behaviour**: Enterprise-gated (skips on OSS where the feature is off); self-cleaning (`wf_auto_*`). Verified live: **11 Playwright + 13 pytest passing**. Paired with the ENT matrix PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
6dfcb8a44a |
ci: remove TestDino from e2e workflows (#13326)
## What Removes **all TestDino integration** from the Playwright e2e CI workflows. ### Removed - **Reporting/upload to TestDino** — the `upload_testdino` job, the `UPLOAD_TO_TESTDINO` env/var, and all `TESTDINO_API_TOKEN` usages. - **Rerun optimization** — the `check_rerun` step and the `tdpw last-failed` `RERUN_MODE` dispatch. ### Files - `.github/workflows/playwright.yml` (−444) - `.github/workflows/playwright_regression.yml` (−350) - `.github/workflows/playwright-auto-rerun.yml` (stale notice line) - `tests/ui-testing/playwright.config.js` (comment reword only) ### Behavior change "Re-run failed jobs" no longer targets only the previously-failed tests — a re-run now runs the **full matrix job**. Native GitHub re-run-failed-*jobs* still works. ### Kept `report.json` / merge-reports generation is untouched — still consumed by the Kinora and OpenObserve reporters. ### Follow-up (after merge) Revoke `TESTDINO_API_TOKEN` (repo secret) + delete the `UPLOAD_TO_TESTDINO` repo variable, and revoke the token in the TestDino dashboard. Paired ENT PR uses the same branch `test/remove-testdino`. ### Validation `actionlint` clean (no new findings) and zero TestDino references remain. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
784459fcf4 | fix: login form migration (#13334) | ||
|
|
79c524c7f9 |
test: heal dark-mode detection and logs scroll-container selectors after design-token migration (#13316)
## Why The 2026-07-21 scheduled Playwright Regression runs failed on **both** OSS ([run 29801668855](https://github.com/openobserve/openobserve/actions/runs/29801668855)) and ENT ([run 29801639539](https://github.com/openobserve/o2-enterprise/actions/runs/29801639539)) — same 4 tests, same shards (Traces-Regression, Logs-Regression). Root cause: the design-token migration (#13173, `f15e27e5fd`, merged 2026-07-20 evening — the only code change between the last green scheduled run and the failing one) removed Quasar entirely, breaking two page-object seams: | Failing test | Broken seam | |---|---| | `traces-bugs.spec.js` › trace values should be visible on hover in dark mode (@bug-4151) | `homePage.isDarkMode()` read the retired Quasar `body--dark` class on `<body>`. Dark mode is now the `.dark` class on `<html>` (set by `utils/theme.ts`). `themePage.js` was already migrated inside #13173 — `homePage.js` was missed. | | `logs-9044-7354.spec.js` › all 3 scroll-retention tests (#9044) | `getScrollContainerPosition()` / `scrollToResultsBottom()` navigated `pagination → .search-list → [class*="overflow-y-auto"]` — both hooks are gone. The results scroller is now the combined scroll area (`ref="scrollContainerRef"` in `logs/SearchResult.vue`). Helpers returned the `-1` "not found" sentinel, so `expect(scroll).toBeGreaterThan(10)` failed. | ## What Test-side only (no `web/` changes): - `homePage.isDarkMode()` → checks `document.documentElement.classList.contains('dark')`. - Logs scroll helpers → walk up from the `logs-search-result-pagination` anchor and pick the sibling child whose **computed** `overflow-y` is `auto`/`scroll`, so future utility-class renames don't break it again. Pagination helpers (`-page-N`, `-next`, `aria-current="page"`) already matched the new OPagination markup and needed no change. ## ENT ENT overrides none of these files — its regression workflow checks out OSS tests (`cp -r o2-enterprise/tests/* openobserve/tests/` overlays only ENT-owned files). The ENT scheduled run heals automatically once this merges; verified pre-merge by dispatching ENT `playwright_regression.yml` with `oss_branch: test/heal-dark-mode-scroll-selectors`. ## Verification All 4 previously-failing tests pass locally against a post-migration build (`main` @ `c523d0034c`, enterprise features): - `logs-9044-7354.spec.js` — 3 passed (49s) - `traces-bugs.spec.js -g "trace values should be visible on hover in dark mode"` — 1 passed (18s) OSS + ENT regression runs seeded against this branch (links in comments). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
fd85566742 |
feat: workflows version 1 (#13156)
This PR introduces workflows design at: https://github.com/openobserve/designs/blob/main/infrastructure/workflows/design.md --------- Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com> Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com> 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>
|
||
|
|
ba57f76e9d |
test(e2e): stabilize alpha1 Traces & Pipelines shards (error-toggle data seeding + flyout-nav / loading-button / indexing races) (#13246)
## What Stabilizes the **Traces** and **Pipelines** shards of the alpha1 cloud E2E suite (`playwright_alpha1.yml`) to green. Rebased on `main` — builds on #13191's protocol-aware ingestion agent (`selectAgent`), so no duplicate transport fix here. The failing run had 1 hard failure + 1 flake in Traces and 7 failures + 1 flake in Pipelines. Root causes: a data dependency (error traces not guaranteed), hover-flyout navigation force-clicks that miss, a refresh button disabled while loading, and logs indexing latency. All fixed with deterministic data/waits — no `waitForTimeout` as a fix, no `force:true`, no retry-count bumps, no weakened assertions. ## Root cause & fixes **Traces** 1. **`tracesAnalyzeDimensions` "P0: Error-only toggle filters trace results"** (hard fail, both attempts). The error-only toggle is the error-count badge in `SearchResult.vue`, rendered `v-if="errorCount != null && errorCount > 0"` — it exists only when the search returns an error span. The shared `default` trace stream has no guaranteed error traces (global-setup ingests only logs), so the badge was present or absent by luck of the window (hence the intermittent CI greens). Fix: `beforeAll` seeds guaranteed error traces via a new `ingestTraces(page, n, { forceScenario: 'error' })` option in `trace-ingestion.js`, and `tracesPage.waitForErrorBadgeAfterSearch()` re-runs the search until the seeded errors are indexed — a bounded wait for backend processing, not a sleep. 2. **`traceQueryEditor` "P2: View error spans and their details"** (flaky). `clickFirstErrorTrace()` used a blind `waitForTimeout(2000)` that raced the trace-details render before the test asserted on it. Now waits for `trace-details-tree` to be visible. **Pipelines** (`pipelinesPage.js`) 3. **`pipeline-section-tab-streamPipelines` 45s timeout** (5 tests: `pipeline-core:56/159/238`, `pipelines:479`, `pipeline-conditions:297`). `openPipelineMenu()` / `navigateToStreams()` navigate via `openNavFlyoutChild`, which hovers a nav group tile and force-clicks the teleported flyout child. The flyout self-closes on settle, so the click can miss and the page never navigates — the follow-up tab/refresh click then dead-waits the 45s action timeout. Both now verify the target page rendered (`pipeline-list-page` / `log-stream-table`) and fall back to a direct `page.goto()` of the route otherwise. (A failure screenshot showed exactly this: the Data flyout open over a blank page.) 4. **`log-stream-refresh-stats-btn` 45s timeout** (3 tests: `pipeline-dynamic:72/97/113`). The refresh button is an `OButton` with `:loading` bound to the stream-stats fetch, and `OButton` renders `:disabled="disabled || loading"`. Clicking during the (slow, on loaded alpha) stats load waited on actionability until timeout. `refreshStreamStats()` now waits `toBeEnabled()` before clicking; `navigateToStreams()` waits for the table instead of a blind 1s. 5. **`openTimestampMenu` empty-table dead-wait.** After exploring the destination stream, a bare `.click()` on the first logs row timed out 45s when the freshly-ingested rows weren't indexed yet (high indexing latency on loaded envs) — a latent flake exposed once fix 3 let the test reach this step. Now re-runs the logs query until a row appears, then clicks. ## Validation - **CI — both shards green (workers=3, alpha cloud):** https://github.com/openobserve/o2-enterprise/actions/runs/29563931877 (`alpha1-e2e / Traces` ✅ · `alpha1-e2e / Pipelines` ✅) - **Original failing run:** https://github.com/openobserve/o2-enterprise/actions/runs/29481437880 - **Local (alpha, CI conditions):** each previously-failing test re-run to green — Traces error-toggle & error-spans; `pipeline-core:56/159/238`; `pipeline-dynamic:72`. ## Notes - Only 4 files change (`pipelinesPage.js`, `tracesPage.js`, `tracesAnalyzeDimensions.spec.js`, `trace-ingestion.js`). The https-ingestion agent fix these depend on already landed on `main` in #13191 — this branch relies on it rather than re-adding it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
fddf2cf264 |
test(e2e): stabilize alpha1 SDR, GeneralTests & Metrics shards (stream/pattern-readiness + langTranslation OOM + Reka-table & editor races) (#13259)
## What
Stabilizes the **SDR**, **GeneralTests** and **Metrics** shards of the
alpha1 cloud
E2E suite (`playwright_alpha1.yml`) to green — the last three shards
remaining after
the rest of the suite was greened. Rebased on `main`.
The original failing run had, across these shards: **SDR** 1 hard fail +
1 flake,
**GeneralTests** 21 fails + 2 flakes, **Metrics** a load-sensitive
query-persistence
flake. Root causes were cloud data/UI-readiness races (freshly-created
streams &
regex patterns lagging their list/table; browser OOM under parallelism;
revamped Reka
UI re-rendering mid-interaction), all fixed with deterministic waits on
real signals.
**No `waitForTimeout` as a fix, no `force:true`, no `.first()`/`.nth()`
band-aids, no
retry-count bumps to hide failures, no weakened assertions. No
worker-count,
parallelism, playwright-config or CI/yml changes** — test code only.
## Root cause & fixes
**SDR**
1. **`scrollIntoViewIfNeeded` 45s timeout** (`multipleSDRPatterns`,
`queryTimeDrop`).
The revamped Reka streams/schema table re-renders rows mid-animation, so
the
scroll's stability polling spun to the 45s action timeout even though
the element
was visible. Guard with `expect(el).toBeVisible()` + an instant native
`scrollIntoView`; removed the trailing sleeps.
(`streamAssociationPage.js`)
2. **Stream Detail `click()` 45s timeout.** One-shot JS-then-Playwright
click raced the
re-rendering row. Replaced with a `toPass` retry that re-resolves the
button fresh,
fires a native DOM click, and verifies the detail sidebar opened.
3. **Regex-pattern create→list eventual consistency** (6 combined tests:
`ingestionTime*`,
`queryTime*`). Create is accepted (`verifyPatternCreatedSuccess` passes)
before it
propagates to the list read-replica, so the UI text-count check threw
"not found in list". Gate on the backend source of truth:
`waitForPatternCreated`
polls `GET /re_patterns` until present then confirms the UI rendered;
`waitForPatternDeleted` fixes the symmetric "Unable to delete … Reason:
unknown"
delete race. (`sdrPatternsPage.js`)
4. **Freshly-ingested stream lags the `/streams` table**
(`multipleSDRPatterns` @slow).
`openStreamDetail` reloads + re-searches until the stream's row appears
(bounded),
instead of a one-shot 5s wait. (Local-caught gotcha:
`isVisible({timeout})` does
**not** auto-wait — switched to `waitFor({state:'visible'})`.)
5. Transient cloud-gateway **connection timeouts** on `page.request`
pattern calls wrapped
in a connection-error-only retry.
**GeneralTests**
6. **cipherKeys ×6 — tab never visible.** Cipher Keys shares the exact
`visible: isEnt`
gate as Regex Patterns (`settings/index.vue`), and SDR's regex
management passes on
this same cloud env — so the tab **does** render; the test was clicking
the Settings
menu, which lands on the SectionHub where per-tab data-tests aren't
rendered. Fixed
by a **direct `goto('/web/settings/cipher_keys')`**, mirroring the
working regex page.
(Not skipped — that would have masked a real, fixable nav bug.)
7. **enrichment ×7 — `pipeline-section-tab-enrichmentTables` 45s
force-click.** The tab
only mounts after the pipelines page header renders; the
flyout→pipelines→section-tab
nav is fragile under load. Replaced with direct SPA nav to the
enrichment-tables route
+ `goto` fallback + a `toPass` settle-retry Add-button click.
(`pipelinesPage.js`)
8. **languageTranslation ×8 + landingPage ×1 — browser OOM cascade**
("Target page/context/
browser has been closed"). 10 exhaustive ~27-page full-app crawls ran
`mode:parallel`
under `--workers=5`; a worker's browser was OOM-killed and every test
after it
cascaded. **Kept parallel** (serializing overran the shard timeout) —
the crawl now
navigates `waitUntil:'domcontentloaded'` + a bounded settle instead of
waiting up to
10–30s for `networkidle` on chart/websocket-heavy pages, cutting each
heavy page's
peak-memory dwell ~10s→~3s (so 5 concurrent crawls no longer spike
together) and making
each crawl ~3–4× faster. Added fail-fast on a closed page/context so any
residual crash
surfaces at its true origin instead of being swallowed/retried.
9. **schema ×2 — `selectStream` can't find just-created
`test1`/`test3`.** Local reproduction
proved the root cause: the **fixed** stream names hit `400 "stream is
being deleted"`
(a prior run's cleanup still finishing) → the stream got no data → never
listed. Fixed
with **unique per-invocation stream names**; also hardened the ingestion
helper
(status-check + transient retry) and added a streams-API readiness gate
before
`selectStream`. (`schema.spec.js`)
10. **enrichment `@upload` ×2 — `_search` `waitForResponse` timeout.**
The 30s search wait
was armed **before** the up-to-120s `selectStream`, so it expired
mid-selection. Re-armed
it (200-gated) immediately before `applyQuery`, plus a streams-API
readiness gate for
`e2e_automate`. `schemaload` gated on the `streams?type=logs` response
before reload.
**Metrics**
11. Replaced `waitForTimeout`s in `metricsPage.js` with real signals
(`data-selected="true"`,
`data-state="on"`) and fixed a reka `OToggleGroupItem` state-detection
bug (active state
is `data-state="on"`, not a `selected` class).
12. **`metrics-promql-query-persistence` load-sensitive flake.**
`selectFirstStream` returned
before the async auto-populate finished, and persistence tests read the
query editor
before Monaco re-rendered after tab switches. Added editor-readiness
gates on real
signals (auto-populated query present; Monaco mounted + laid out) in
`metricsQueryEditorPage.js`; assertions unchanged.
## Validation
- **CI — SDR / GeneralTests / Metrics green (alpha cloud):**
https://github.com/openobserve/o2-enterprise/actions/runs/29633444186
- **Original failing run:**
https://github.com/openobserve/o2-enterprise/actions/runs/29481437880
- **Local (alpha cloud, CI conditions, single-worker):** each
previously-failing test re-run
to green — `schema.spec.js` 3/3, `multipleSDRPatterns.spec.js` 2/2.
## Notes
- 21 test files change (8 page objects + 13 specs). No shared
cleanup/setup, config, or
workflow files touched.
- RegressionSet was unaffected by this branch — a transient hang in the
workflow's
"pre-test cleanup" step (before any test runs), unrelated to these
changes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
96bbed8a6e |
test(alerts): stabilize alpha1 Alerts shard on cloud — robust empty-name validation + hardened self-seeded stream registration (#13270)
## What Follow-up to #13209. In the full-suite alpha1 CI (runs 29576418415 → 29655287388) the **Alerts** shard was failing on two independent issues. This PR makes both deterministic so the shard goes green. Test-infra / page-object only — **no product code**. ✅ Green: alpha1-e2e / Alerts — 20 passed, 4 flaky (recovered on retry), 3 skipped, 0 failures https://github.com/openobserve/o2-enterprise/actions/runs/29655287388/job/88116296475 ## Root cause & fixes ### 1) `alerts-ui-operations:191` — empty-name validation assertion **Root cause:** the check asserted an inline field-error element (`add-alert-name-input-error`) that isn't reliably rendered for the topbar name input, so the assertion timed out even though the empty-name Save is correctly blocked. Verified against alpha with a live session: on empty-name Save the app surfaces the block as a **toast — "Alert name is required."** **Fix:** assert the toast (the app's actual, visible signal), keeping the inline field error as an `.or()` fallback so the check stays robust regardless of which surface renders. Validated locally against alpha (PASS) and green in CI. ### 2) `alerts-e2e-flow:106/160` + `alerts-import:52/165` — self-seeded stream registration **Root cause:** these specs seed a unique per-test stream (`alert_e2e_*` / `alert_import_*`) with custom columns, then wait for it to register in `GET /api/{org}/streams?type=logs` before opening the wizard. On the shared cloud alpha org under full multi-shard concurrency, that registration **intermittently takes minutes, not ~1s**, to reflect in the list — reproduced with both Playwright `page.request` and a raw HTTP client, so it is **not** a test-auth issue. The wizard's stream dropdown reads the same list, so the stream is absent there too. The old poll waited only 15/60s and **threw**, hard-failing in `beforeEach`. **Fix:** widen the registration poll to **90s** (matches global-setup's indexing budget) and make it **non-fatal** — warn and proceed instead of throwing. The stream is already ingested, and the point-of-use dropdown selection already retries (in-place ×4 + wizard re-entry ×2); with `retries: 2` those slow-to-register streams now recover as *flaky* rather than hard-fail. In the green run, 6 streams hit the 90s warning and all recovered. ## Known follow-up (infra, not test-fixable here) The deeper cause of the stream flakes is a **server-side streams-list propagation lag with session-sticky routing** on the shared cloud alpha org — a freshly-ingested stream can take minutes to appear in `/streams` for a given session (some sessions land on a stale node). No test-side wait fully resolves it; the retries absorb it. Flagged for infra investigation. ## Scope / safety - 2 files: `pages/commonActions.js`, `pages/alertsPages/alertsPage.js`. No product code. - No tests added/deleted/skipped, no `.only`, no assertions weakened (191 asserts the real user-facing signal; the `.or()` keeps inline-error coverage). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
eaba77fa34 |
fix(i18n): DeepSeek translation pipeline, BCP-47/en-US locales, +ru/pl/vi, full backfill (#13263)
## Summary
Replaces the AWS Translate i18n pipeline with a DeepSeek (LLM) backend,
standardizes locale files to BCP-47 naming with an `en-US` base, adds
new languages, and backfills **every locale to 100%**.
## What changed
### Translation engine (DeepSeek)
- Swap AWS Translate → DeepSeek via its OpenAI-compatible API
(`scripts/translations/`). Auth via the `DEEPSEEK_API_KEY` secret;
per-request 60s timeout.
- **Batched** translation (50/call) with **per-string validation**:
interpolation placeholders (`{count}`, `%s`, `@:key`), vue-i18n
**pluralization pipes** (`{n} Day \| {n} Days`), and literal escapes
(`{'@'}`, `{'{'}`, `{'\|'}`) are preserved or the string is rejected and
retried.
- Robust recovery: index-aligned batches, split-on-mismatch to isolate a
single bad string, temperature-perturbed retries, and rejection of
empty/whitespace output (never blanks a label). Removed the old
`TRANSLATION_MAX_KEYS` safety cap.
### Locale naming + base language
- All 15 locale files renamed to **BCP-47 hyphen** form (`en-US.json`,
`zh-CN.json`, `zh-TW.json`, `fr-FR.json`, …) — matching
`navigator.language` / `Intl` / HTML `lang`.
- **English base switched `en-gb` → `en-us`** (app code,
`fallbackLocale`, BCP-47 map, selector, defaults). British-Pound
currency and date-formatting `en-GB` usages left untouched. Existing
`en-gb` cookies fall back cleanly to English — no migration needed.
### New languages
- **Russian (`ru`), Polish (`pl`), Vietnamese (`vi`)** — fully generated
and wired into `localeFileMap`, `APP_LOCALE_TO_BCP47`, and the language
selector.
- **Traditional Chinese (`zh-TW`)** now maintained by the translator
alongside Simplified (`zh-CN`).
- RTL languages (`ar`, `fa`) intentionally **deferred** until the app
has `dir="rtl"` support.
### Full backfill (one-time)
- Every pre-existing locale filled from ~5.9k up to the full **8,269
keys** (~26.9k strings). `.translation_state.json` rebuilt complete, so
future runs are incremental.
### Nav i18n bug fix
- The **Dashboards** and **Data** nav group labels were hardcoded
English (bypassing i18n) and stayed English in every locale. Now
resolved via `t()` (`menu.dashboard`, new `menu.data`), localized and
re-resolving on language change.
## Verification
- Full web unit suite: **39,035 passed / 414 skipped / 0 failed** (1,167
files).
- `type-check` clean (0 TS errors).
- Locale registry sync spec green; all 15 files = 8,269 leaves.
- Translation engine verified live against `deepseek-v4-flash`.
## Notes
- Since all locales are now 100%, the post-merge `update-translations`
workflow will find nothing pending (no follow-up translation PR).
- `ar`/`fa` to be added with RTL support in a follow-up.
|
||
|
|
21cd5ca977 |
fix: standardize service account credential terminology in web UI (#13255)
## What Cleans up the wording and i18n coverage around **service accounts** in the web UI so the credential is consistently called a **token**, and fixes a mislabeled toast. ### Changes - **Standardized credential wording** — `en.json` service-account labels drifted between "Service Token", "Service Account Token", and "Token". Unified on **"Token"** (kept "Service Account Token" only as the standalone reveal-dialog title). - **Localized hardcoded strings** — moved all `ServiceAccountsList.vue` toasts (create / update / delete / rotate / loading / copy / bulk-delete) into a new `serviceAccounts.toast.*` namespace; localized the tab labels in `EditRole.vue` / `EditGroup.vue` and the search placeholder in `GroupServiceAccounts.vue` (added `iam.permissions`). - **Fixed a mislabeled toast** — the org-passcode flow in `Ingestion.vue` showed `"API Key not found."`; it's the org **passcode** (sibling button is "Update Passcode"), so it now reads `"Passcode not found."` (spec updated to match). ### Notes - `en.json` is updated as the source of truth; the other locale files sync via the normal translation flow. - Dead `apikeyLabel` / `copyapikey` / `deleteAPIKeyMessage` keys (no component references) were left untouched — out of scope for this change. ## Testing - `vitest` unit suite for the touched files passes (134/134, incl. updated `Ingestion.spec.ts` assertions). ## Related - Docs counterpart (new Service Accounts page + credential comparison): openobserve/openobserve-docs PR. |
||
|
|
d9d128d61c |
fix: Serviceaccount1 (#13257)
Improve UI for creating service accounts. Improve UI for accessing MCP server. |
||
|
|
eaebff9e57 |
fix: alerts module migration with zod (#13227)
- alert module migration with zod --------- Co-authored-by: ktx-vaidehi <134508096+ktx-vaidehi@users.noreply.github.com> |
||
|
|
30b736e6e4 |
test: stabilize alpha1 Logs-Queries & Logs-Features shards on cloud (monolithic download-test split + share-link redirect hydration + SQL-commit reliability) (#13241)
## What Stabilizes the **Logs-Queries** and **Logs-Features** shards of the alpha1 cloud E2E suite to green. Test-infra + page-object changes only; **no product code** (5 files under `tests/ui-testing/`). > **Stacked on #13240** (Logs-Core). Base is `fix/logs-core-alpha1-e2e` — please merge > #13240 first; GitHub will then retarget this PR to `main`. The diff here is only the > Logs-Queries/Features work (5 files). ## Root causes & fixes ### Logs-Queries **`logsDownloads.spec.js` — monolithic test exceeded the test timeout (hard failure).** All 14 download scenarios ran sequentially in **one** `test()` (each a full `page.reload` + re-setup), needing ~7–8 min against a 360s budget. It hit 360s mid-run, Playwright tore the page down, and the remaining scenarios failed with **"Target page/context closed"** (a cascade, not a download bug). A `try/catch` wrapper also swallowed per-scenario errors and rethrew an aggregate, hiding the real stack. → **Split into 14 isolated per-scenario tests.** The `beforeEach` already yields a fresh, query-loaded page, so no per-scenario reload is needed; each test is short, isolated (one failing download can't close the page for the others), and parallelizes. Removed the error-swallowing wrapper; `@downloadAll` tag preserved. **`searchpartition.spec.js` — Reka OSwitch state asserted within a hardcoded 5s (flaky).** `verifyHistogramState` waits for the histogram OSwitch `data-state="unchecked"` element, but the Reka switch animates the checked→unchecked transition and the settled state can appear >5s after the toggle+execute under CI load. → Raised the poll ceiling to 15s (still asserts the real end-state, no sleep). ### Logs-Features All the share-link failures were **flaky, not product bugs** — the redirect fully restores every param; the tests raced the SPA under CI load. **Reading UI/URL state before the short-URL redirect finished hydrating.** `getQueryEditorText()` returned `""` (lazy Monaco visible but not yet pre-filled) and `captureCurrentState()` read `show_histogram=null` (the SPA rewrites URL params in stages). → New page-object helpers `waitForQueryEditorContent`, `waitForUrlParam`, and URL-stabilization inside `waitForRedirectComplete` (`_waitForUrlStable`). No fixed `waitForTimeout`. **Bare `clickRefresh()` cancelled the in-flight SQL-mode auto-search** ("Running query cancelled" toast), so `sql_mode`/query never committed to the short URL → empty editor after redirect. → Commit via `runQueryAndWaitForResults()` (waits for the Cancel state to clear first), then confirm `sql_mode` is in the URL before sharing. **SQL setup itself was unreliable.** `enableSqlModeIfNeeded` (Vue `meta.sqlMode` flag) didn't always stick, and `clearAndFillQueryEditor`'s focus-sensitive `Ctrl+A` select-all silently appended in headless CI (**doubled query**). → New `setupSqlQueryForShare(query)`: sets the Vue flag + writes the exact query via Monaco `executeEdits` (verified) + `runQueryAndWaitForResults`, then confirms `sql_mode` committed to the URL — **retries once, then strict-asserts** (writing SELECT text alone does **not** flip `meta.sqlMode`; the flag is what the app serializes to `sql_mode`). `waitForUrlParam` gained a `required` mode that throws instead of silently letting a bad state through to the share. **Residual Monaco lazy-mount race after the short-URL hop** — the editor occasionally mounted without applying the query from the (resolved) URL. → `waitForRedirectedQueryEditorContent` self-heals with **one** reload of the resolved URL (the reliable URL-param prefill path). **Share success toast strict-mode violation** — the "Link Copied Successfully!" toast coexisted with the cancelled-query info toast, so the broad selector matched 2 elements. → Match the share-result toast by message with `.first()` in the share helpers. **`searchPatterns.spec.js` — async pattern extraction still empty/timeout after 60s** under alpha indexing load. → `setupPatternsView` re-runs the query and waits once more before giving up (resilience for the data dependency; callers still assert the returned state). ## Scope / safety - **5 files:** `pages/logsPages/logsPage.js` + specs `logsDownloads`, `monaco-query-prefill`, `shareLink`, `searchPatterns`. **No product code.** - **No tests deleted, no `.only`, no unconditional skips, no assertions removed.** - Every fix replaces a fixed sleep / wrong assumption with a deterministic wait on the real condition — no `waitForTimeout`, no `force`, no retry-based masking. ## Validation - Local on cloud alpha (`retries:0`, stricter than CI's `retries:1`): - `logsDownloads` **14/14** (`--workers=3`) — no timeouts, no "Target page closed". - Previously-flaky share-link / SQL / searchpartition tests **12/12** under `--repeat-each=3` (`sql_mode` committed on the first attempt every time; retry never needed). - Full `shareLink` + `monaco-query-prefill` files **15/15** — no regressions. - alpha1 Logs-Queries + Logs-Features CI: green — https://github.com/openobserve/o2-enterprise/actions/runs/29539009573 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
9c32b03b34 |
test: stabilize alpha1 Logs-Core shard on cloud (quick-mode detection + search-toolbar sync + scheduler-list hidden-button recovery) (#13240)
## What
Stabilizes the **Logs-Core** shard of the alpha1 cloud E2E suite to
green, running
**fully parallel** (`--workers=5`). Test-infra + page-object changes
only; **no product
code** (7 files under `tests/ui-testing/`).
## Root causes & fixes
### Quick mode / interesting fields (7 tests)
- **`enableQuickModeIfDisabled` treated the wrong element as the
quick-mode signal.** It
returned early whenever the field-list **user-defined-schema toggle
group** was visible —
but `FieldListPagination` renders that group whenever a stream exposes a
UDS (always true
on cloud), independent of `searchObj.meta.quickMode`. The per-field
interesting (star)
buttons are gated purely on `quickMode`, so they never rendered and
every
`ensureFieldIsInteresting` call timed out. Now verifies the **actual**
Quick Mode switch
state via the utilities menu and confirms by waiting for a per-field
interesting button.
- **`sqlModeOrderBy` hung on `waitForLoadState('networkidle')`** —
streaming keeps the
network busy so it never settles; switched to `domcontentloaded` (the
editor assertion is
the real readiness gate).
### Search-toolbar synchronization (logspage / histogram flakes)
- **`clickRefreshButton` / `clickRefresh` clicked the refresh button
mid-state-swap.** The
Run-query button swaps to a "Cancel query" variant (and briefly
detaches/disables) while a
prior/auto search is in flight; clicking then cancelled that search or
hit a
not-visible/detached node (`element is not visible`), and a subsequent
`waitForResponse('/_search')` never fired (60s timeout). Both now wait
for the run-mode
button to be **visible AND idle** (not Cancel, not disabled/`aria-busy`)
before clicking —
no `force`.
- **`clickLiveMode5Sec` + `clickRelative6WeeksButton` popovers shifted
mid-click.** The
refresh-interval dropdown and the date picker are popovers anchored to
the toolbar; while a
search is in flight the toolbar reflows and the popover repositions, so
the target never
reaches Playwright's "stable" state (~45s click timeout) or the click
misses (date range
stayed "Past 15 Minutes"). Both now wait for the toolbar to settle
(`_waitForQueryButtonIdle`) first; the date preset additionally verifies
its trigger label
and retries once.
### Histogram error-handling
- **Query-propagation race** — `clearAndFillQueryEditor` fills Monaco
but the value reaches
the store on a debounce, so `clickRefresh()` could run the **previous**
query and the
no-events/error state never appeared. Now waits for the Monaco model to
reflect the new
query (`waitForQueryEditorValue`) before running.
### Logs-table field management
- **Fixed `waitForTimeout(2000)` in `beforeEach` →
`waitForFieldListReady()`** — the
expandable field rows only render once the stream's fields have indexed
**values**, and
cloud indexing after ingestion lags under parallel load, so the sidebar
was empty
(`fieldCount === 0`, "field expand button not found"). Gates on the
data-backed field list
(60s, matching the global-setup indexing budget).
- **Severity-colors** read status bars after a fixed 3s → poll until
they render.
- **Case-insensitivity** counted matching fields after a fixed 500ms →
`expect.poll`.
- **Persist-after-refresh (app timing)** — the added column survives
reload only via the
`logFilterField` localStorage entry, written **after** the column
renders; reloading before
that commit lost it (now waits for the localStorage write). The restore
is then
intermittently slow/dropped on the first reload under cloud load, so it
reloads up to 2×
and polls for the restored column.
### jobSearch — scheduler-list hidden button (app defect, worked around)
- **App defect:** the scheduler list renders under
`v-show="showSearchScheduler"`, and the
logs page **resets that flag whenever the URL query loses the
`action=search_scheduler`
param** (`updateUrlQueryParams` strips it after a search). The "Get
Jobs" button is then in
the DOM but `display:none` and never recovers — the whole jobSearch CRUD
suite timed out.
`_getJobRowIndex` now **re-navigates to the scheduler-list URL**
(restores the param →
re-shows the list) and retries; validated firing and recovering live on
alpha. Written up
for a frontend fix (`fix/search-scheduler-job-issue`).
- **`validateAddJob` "Job added successfully" toast made best-effort** —
it's transient and
`searchSchedulerSubmit` already awaited the POST (returned the jobId),
so the toast can
auto-dismiss before the assertion runs; creation is already confirmed by
the jobId + the
scheduler-list lookup. Same re-open recovery applied to its Get-Jobs
click.
## Scope / safety
- **7 files:** `Logs` page-objects (`logsPage`, `logsQueryPage`,
`logsPageEP`,
`jobScheduler`) + Logs specs (`logshistogram`, `logsquickmode`,
`logstable`). **No product
code.**
- **No tests deleted, no `.only`, no unconditional skips, no assertions
removed.**
- Every fix replaces a fixed sleep / wrong assumption with a
deterministic wait on the real
condition — no `waitForTimeout`, no `force` in the touched paths.
## Validation
- Local on cloud alpha: `logsquickmode` 8/8, `logshistogram` 5/5,
`logspage` 23/23,
`logstable` field-management + persist (`--repeat-each` clean),
jobSearch scheduler-list
recovery observed firing and recovering live.
- alpha1 Logs-Core CI: green —
https://github.com/openobserve/o2-enterprise/actions/runs/29471282407
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
|
||
|
|
3906bdc296 |
test: stabilize alpha1 Alerts shard on cloud (fix auto_playwright_stream being-deleted race + concurrency hardening) (#13209)
## What
Stabilizes the **Alerts** shard of the alpha1 cloud E2E suite to green,
running **fully
parallel** (`workers:3`, `fullyParallel:true`) — no serialization.
Test-infra +
page-object changes only; **no product code**. The one product-side
defect surfaced (the
prebuilt destination form unmounts its fields on template auto-load) is
worked around in
the test layer and written up separately for a frontend fix.
## Approach change since the first revision
The first version serialized the contended tests (`@serialAlpha1` + a
dedicated
`chromium-serial` project). Per review feedback ("solve it in
parallel"), that was
**removed** — the shard now runs **fully parallel**, and the flakiness
is fixed at the
source (fixture / registration / render races) instead of by
serializing.
## Root causes & fixes
### Streams / fixtures
- **`auto_playwright_stream` "being deleted" race** — the 3
`alerts-ui-operations` tests
now use the shared, always-protected **`e2e_automate`** stream
(pre-ingested by
global-setup, never deleted by cleanup), eliminating the shared
fixed-name delete race
entirely. `cleanup.spec.js` no longer deletes `auto_playwright_stream`;
`commonActions.ingestTestData` checks `response.ok()`, retries the "is
being deleted"
race, and polls the streams API until the stream is registered before
the wizard opens.
### Alert wizard
- **Dedup alert blocked at save** —
`createScheduledAlertWithDeduplication` typed its SQL
into the Monaco editor without clearing the default `SELECT * FROM
"<stream>"`, producing
malformed SQL → "Please fix the SQL error before saving." Now clears the
editor first.
- **Stream-select ordering + registration poll** — drive the stream
dropdown only after its
list fetch resolves; poll registration; page-reload recovery when the
cached list is stale.
### Prebuilt destinations (the deep one)
- **App defect:** on a *reused* form (2nd+ destination), selecting a
prebuilt type
intermittently **unmounts the credential/name fields ~0.5 s later**
(template auto-load
re-render) and they stay gone. Confirmed via DOM timeline (`count:0` for
25 s+). Since a
wait can't recover an unmounted element, `selectDestinationType` clicks
the card once,
waits for the template network to settle, confirms the fields are
**stable** (not just
present), and — if they unmount — **remounts the form** (cancel+reopen →
full page reload)
and re-selects. Written up separately for a frontend fix.
- **List verifications raced the OTable loading skeleton** —
`expectDestinationInList` / `verifyDestinationExists` /
`verifyAlertCreated` now wait for
`o2-table-skeleton-body` to clear and poll the **list** endpoint the UI
actually reads
(not just the single-GET) before asserting the row.
### Form-validation specs
- `alerts-form-validation` + `anomaly-detection-form-validation` flipped
serial→parallel and
made self-sufficient: `beforeAll` seeds a worker-scoped
template+destination via API (the
"Add Alert" button is hard-disabled with zero destinations), `afterAll`
removes them,
cleanup patterns registered.
### Misc
- Cloud-correct (https) ingestion agent; alert search-input +
`updateAlert` edit-form wait
hardening for shared-org load.
## Cloud environment gates (legitimate — not coverage drops)
`test.skip(isCloudEnvironment())` (dedup validation), `if
(!isCloudEnvironment())` (import
trigger round-trip), and external destination URLs — all because cloud's
**SSRF guard**
blocks self-referencing destinations by design. All still run fully on
OSS/self-hosted.
## Scope / safety
- 15 files: Alerts page-objects, alpha1 config + global-setup, Alerts
specs, cleanup. **No product code.**
- **No tests deleted, no `.only`, no unconditional skips, no assertions
removed.**
- The temporary Alerts-only playwright matrix (added for faster
iteration) has been
**reverted** — the full OSS e2e matrix is restored.
## Validation
- Prebuilt P1 validated locally on cloud alpha (repeated clean passes;
every field-unmount
recovered by the remount).
- alpha1 Alerts CI:
https://github.com/openobserve/o2-enterprise/actions/runs/29391293698
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
|
||
|
|
3c8f106425 |
test(e2e): stabilize alpha1 cloud E2E — shared https-ingestion fix + Streams revamp/cloud-race/CI-flake fixes (#13191)
## What Stabilizes the **Streams** shard of the alpha1 cloud E2E suite (`playwright_alpha1.yml`) to green after the UX revamp — plus a shared node-fetch protocol fix that unblocks ingestion for several non-Streams shards too. Rebased on `main` (no longer stacked on #13155). Un-skips the multistream **interesting-fields** test, and rewrites the **extended-retention** flow for the revamped UI (page-object retained, but the test itself is currently re-skipped — see fix 8). ## Root cause & fixes 1. **https ingestion rejected in shared fetch helpers.** `apiUtils.js`, `apiCleanup.js`, `pipelinesPage.js`, `streamsPage.js`, `model-pricing.spec.js` still forced an `http.Agent` on node-fetch → `Protocol "https:" not supported` against alpha's https ingestion URL, killing every multiselect / streamname / streaming ingestion. Replaced the single `http.Agent` with a protocol-selecting agent (an `http.Agent` for `http://` and an `https.Agent` for `https://`), passed as a function so node-fetch picks per-URL. Same fix as #13155's `ingestionPage.js`. 2. **Add Stream dialog selectors** (`streamsPage.js`). The revamped form is an `ODialog`: the panel is `add-stream-dialog`; save/cancel/close are the ODialog-owned `o-dialog-primary/secondary/close-btn` ids (scoped under the panel). The old `add-stream-title` / `save-stream-btn` / `add-stream-cancel/close-btn` no longer exist on the dialog. 3. **Streams-page navigation** (`streamsFormValidationPage.js`). The `/streams` left-nav tile is now a hover-flyout group — navigate by URL (`/web/streams?org_identifier=…`) and wait for the Add Stream button (rendered only after zoConfig loads, `v-if="isSchemaUDSEnabled"`) before clicking. 4. **Casing-preservation test skipped on cloud** (`streamname.spec.js`). Alpha runs the server default `ZO_FORMAT_STREAM_NAME_TO_LOWERCASE=true` (local CI sets it `false`), so stream names are always lowercased there — the feature under test is off. `test.skip(isCloudEnvironment(), …)`. 5. **TC002 cloud async-delete race** (`streamsPage.js`). A just-deleted stream lingers "being deleted" server-side after it leaves the streams list, so the recreate POST 400s; the create eventually goes through, so a follow-up "already exists" is treated as created. Also re-clicks Save when no POST fires (submit occasionally doesn't reach the form under parallel load), asserts name/retention values stick before saving, and adds `_waitForStreamGoneCloud` so `deleteStreamViaAPI` polls the streams list until the stream is actually gone. Success is now signalled by the dialog closing (the toast auto-dismisses), and both create and retention saves capture the API response so a server-side failure shows in the test log. 6. **streaming field-list waits** (`streamsPage.js`). `kubernetesContainerName` filters the field list and waits for the expand toggle before clicking — the cloud field list populates slowly. 7. **`managementPage.goToManagement` retry.** Under parallel-worker load the first settings-nav click can land before the nav is interactive; retry (`expect().toPass`) until the settings page renders. 8. **Un-skipped / rewritten for the revamped UI:** - **interesting-fields** (`multiselect-stream.spec.js`): **un-skipped.** Enable quick mode and hover the field row so the (ⓘ) toggle renders. Locators live in the page object (`logsPage.hoverAndClickInterestingFieldLast()` + reused `clickLogTableColumnSource()`), not in the spec. - **extended-retention** (`stream-settings.spec.js`): the page-object flow was rewritten for the new date-range calendar (`daterangecalendar-cell-*`), OTable row checkbox, and shared `ConfirmDialog` — **but the test is currently `test.skip`ed.** Clicking the Extended Retention tab collapses the entire Stream Detail drawer on alpha's deployed build (DOM elements drop 274 → 2), so the picker never renders. Verified by live DOM diff; sibling Settings-tab tests still pass, so it's a deployed-frontend regression, not test flakiness. Skipped with a documented reason; re-enable once the tab renders its panel again. 9. **CI-flake stabilization pass** (`logsPage.js`, `streamsPage.js`) — from alpha1 Streams CI run 29504364410: - **`clickInterestingFields`** (`logsPage.js`): an instant `isVisible()` check raced the field list re-rendering after the query completed, then toggled quick mode (already on) which churned the utilities menu. Now asserts quick mode on once (idempotent) and waits deterministically (20s + fallback) for the interesting buttons to render. - **`navigateToExtendedRetention`** (`streamsPage.js`): replaced fixed `waitForUI(2000)/(1000)` sleeps with real waits — schema dialog tab bar visible, then the date-picker button visible — so "date-time-btn not visible" can't recur. - **`navigateToStreamExplorer` / `searchStream` / `clickAddStreamButton`** (`streamsPage.js`): wait for the streams search input / add-stream button to actually render before interacting instead of a fixed 1s wait, removing the 45s click timeouts on slow CI. ## Validation - **Local (alpha, CI conditions — 3 workers):** Streams shard green (30 passed / 2 skipped / 0 failed; TC002 stable 3/3) prior to the extended-retention re-skip. With extended-retention now skipped (fix 8), that test moves to the skipped column. - **CI:** https://github.com/openobserve/o2-enterprise/actions/runs/29328193145 · flake triage from run 29504364410. ## Notes - `pipelinesPage.js` / `model-pricing.spec.js` receive the same shared protocol fix as collateral, so a couple of non-Streams shards benefit too. - The extended-retention page-object rewrite (calendar / OTable / ConfirmDialog) is kept and correct; only the test invocation is skipped pending the alpha drawer fix. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Shrinath Rao <shnath@openobserve.ai> |
||
|
|
9e67c98622 |
test: fix flaky Functions "create with valid VRL" save (empty body race) (#13222)
## Issue
The Functions e2e test `should create function successfully with valid
VRL code` (`functions-form-validation.spec.js`) flakes on slow CI
runners, failing all retries with a timeout waiting for the success
toast.
From the failing run's trace, the create request went out with an
**empty function body**:
```
POST /api/default/functions → {"name":"test_fv_vrl_001","function":"","params":"row",...}
400 Bad Request → {"code":400,"message":"Function body cannot be empty"}
```
The backend is behaving correctly (it should reject an empty body). The
bug is in the test's editor-injection helper.
## Root cause
`typeInVrlEditor()` set the Monaco editor content via `executeEdits()`
and then waited a fixed `500ms` before clicking Save. Two problems
compound:
- `executeEdits()` writes the model value but does **not** drive the
editor's `onDidChangeModelContent` commit.
- The editor's `@update:query` emit that syncs `formData.function` is
**debounced by 500ms** (`CodeQueryEditor.vue`).
The fixed `500ms` wait sat exactly on the debounce boundary, so under CI
contention Save fired before `formData.function` was populated —
submitting an empty body. Because it is a deterministic timing gap on a
slow machine, all retries failed together, which reads as flakiness.
## Fix
Make the helper deterministic instead of sleep-based:
- Poll until Monaco has loaded and the function editor is registered
(scoped to its container) instead of a fixed sleep before injection.
- Type real keystrokes into the visible `.view-lines` surface (the
`textarea.inputarea` is a 1px hidden input Playwright cannot click), so
the editor's change listener actually fires.
- Verify the content landed in the Monaco model before proceeding.
- Blur the editor to flush the debounced emit so `formData.function`
updates immediately, rather than racing the debounce timer.
App code is unchanged — this is a test-only fix.
## Verification (local)
- Target test: **4/4 passed** on `--repeat-each=4`.
- Full `functions-form-validation.spec.js`: **11 passed, 3 skipped, 0
failed**.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
75b824f29a |
fix: cipherkeys module form migration with zod (#12971)
- form migration with zod schema for cipher keys module --------- Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com> |
||
|
|
54fdbad0d8 |
fix: reports module form migration with zod (#12949)
- form migration with zod schema for reports module --------- Co-authored-by: ktx-vaidehi <vaidehi.akhani@kiara.tech> |
||
|
|
38e944529d |
test: unblock alpha1 cloud E2E suite — shared setup fixes + Functions (#13155)
## What Repairs the shared setup + ingestion path that was failing **every** module of the alpha1 cloud E2E suite (`playwright_alpha1.yml`) after the UX revamp, **and stabilizes the first full test shard — Functions — to green** (validated in CI, run link below). No changes to the test matrix. Per-module fixes for the remaining shards land in separate follow-up PRs. ## Root cause — shared setup (blocked all 13 modules) 1. **Automation login user routes through Okta.** After the revamp, `@openobserve.ai` logins on alpha redirect to Okta SSO and 404 — automation can't complete login. The local-auth `e2etest@o2-qa.com` user still uses the Dex password flow. 2. **Org-switch selectors changed** (`global-setup-alpha1.js`). The org dropdown now opens via a dedicated trigger button; the old inline `arrow_drop_down` text is an SVG icon, the search box's `data-test` moved to the `OSearchInput` wrapper `<div>`, and rows carry a `data-test-org-identifier`. 3. **Ingestion helper rejected https.** `ingestionPage.js` hardcoded an `http.Agent` for node-fetch — throws `Protocol "https:" not supported` against alpha's https ingestion URL (killed ~27 tests/run across modules). ## Root cause — Functions shard 4. **Tests created enrichment tables in the wrong org.** `navigateToBase` passes `?org_identifier=` on the root URL; the redirect to `/web/` **drops the query param**, so the app fell back to the user's default org and enrichment tables were created there. Fixed by deep-navigating to the enrichment page with the org param and asserting the active org stuck (same pattern js-transform tests already use). 5. **Backend bug (reported separately): enrichment URL-jobs fail for table names starting with `schema`.** 100% reproducible, org/session/timing-independent: the job's save step fails with `Failed to save batch 1: not an ingester` (`schema_probe1` ❌ / `view_probe1` ✅, same request otherwise). Test tables renamed `schema_view_*` → `view_schema_*` and `schema_mismatch_*` → `mismatch_schema_*`; cleanup patterns cover both prefixes. The product bug itself still needs a backend fix — it affects any user naming a table `schema…`. Plus hardening while there: URL-job completion is now decided from the backend status API instead of inferring from row-button counts (which misread a failed job as success), the job's `error_message` is logged on failure, and the create form verifies field values + Save enabled + create-API response before proceeding. ## Validation - **CI (this PR's branch): [run #168](https://github.com/openobserve/o2-enterprise/actions/runs/29315765982) — Cloud ✅ (3m31s) + Functions ✅ (13m14s), `playwright_summary` ✅** - Local (alpha, CI conditions): previously-failing schema-view + schema-mismatch tests 2/2 green; earlier full-shard run 24/25 with the same single failure now fixed. ## Notes - `ALPHA1_USER_*` secrets: CI already uses a working non-Okta user (Cloud job green). - Follow-ups: backend `schema`-prefix bug (separate report), per-module PRs for remaining shards. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
4a0fa604b6 |
fix: stream module form migration with zod (#12978)
- form migration with zod schema for stream module --------- Co-authored-by: ktx-vaidehi <134508096+ktx-vaidehi@users.noreply.github.com> Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com> Co-authored-by: Huaijin <haohuaijin@gmail.com> |
||
|
|
e3927ef5d3 |
fix: fuctions module form migration with zod (#12970)
- form migration with zod schema for functions module --------- Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com> |
||
|
|
00b910a382 | fix: remove quasar leftovers (#13180) | ||
|
|
81cc0f2255 |
refactor: extract application core crate (#13168)
## Summary Extract the application core (`src/common`, `src/service`, `src/job`, `src/cipher`) out of the root binary crate into a new workspace crate `src/core` (package `openobserve-core`). The root crate keeps the binary entrypoints and edges: `cli`, `handler`, `router`, `migration`, and `super_cluster_queue`. This builds on #13162 (remove service → handler dependencies), which made the extraction possible. > Naming note: the directory is `src/core` but the package stays `openobserve-core` — a Cargo dependency literally named `core` shadows Rust's built-in `core` crate and breaks the `::core::` paths emitted by derive macros (thiserror, serde, ...). ## What moved - `src/common`, `src/service`, `src/job`, `src/cipher` → `src/core/src/...` (467 files moved; 385 of them byte-identical, the rest only needed `pub(crate)` → `pub` widening and clippy fixes required by the new crate boundary) - `ua_regex/regexes.yaml` → `src/core/ua_regex/` (same content, consumer moved with it) - `src/handler/grpc/request/search/mod.rs` → `src/core/src/service/search/grpc_server.rs` (byte-identical; old path kept via `pub use ... as search`) - `impl From<MetricsQueryRequest> for cluster_rpc::MetricsQueryRequest` moved from `handler/grpc/mod.rs` into `service/promql` (orphan rule; field-for-field identical) - The `impl From<XError> for Response` blocks scattered across HTTP handler files (alerts, dashboards, reports, folders, pipeline, eval_jobs, providers, ratelimit) are consolidated into `src/core/src/service/http.rs` with unchanged status-code mappings ## Compatibility `src/lib.rs` re-exports the moved modules (`pub use openobserve_core::{common, job, service}`, and `cipher` under the `enterprise` feature), so all existing `crate::service::...` / `openobserve::common::...` paths keep working — handlers, tests, and downstream code need no changes. ## Enterprise dependency resolution `openobserve-core` optionally depends on `o2_enterprise` / `o2_dex` / `o2_openfga` / `vortex` behind features. So that the OSS repo resolves on its own, workspace deps point at empty stub packages under `src/enterprise-stubs/` (never compiled into default builds). Enterprise builds replace the workspace manifest with `Cargo.toml.openobserve`, which points these at the real crates. ⚠️ Must be merged together with openobserve/o2-enterprise#2162 (same branch name) — merging either PR alone breaks the enterprise build. ## Feature forwarding Root `enterprise` / `cloud` / `vectorscan` / `vortex` features forward to the corresponding `openobserve-core` features; the core crate forwards to `config` / `infra` / `o2_enterprise` exactly as the root crate did before. ## Unit-test fix The `service::sourcemaps` tests relied on the workspace root being the test cwd (shared zip fixture via a relative path, sqlite db dir/tables created by `init-db` from `coverage.sh`). Unit tests of a sub-crate run with the crate dir as cwd, so they now read the fixture via `CARGO_MANIFEST_DIR` and create the db dir + the tables they touch themselves; `src/core/data` is cleaned between the postgres and sqlite CI passes and gitignored, mirroring `src/infra/data`. ## Cleanup The extracted crate's manifest is pruned to what core actually uses (45 dependency entries copied from the root crate plus a dead `profiling` feature removed), and the stale `roaring` dependency (unused since the tantivy result cache rewrite in #7890) is dropped from the root manifest. All new files carry the standard AGPL header. ## Testing - `cargo check --workspace --all-targets`, `cargo clippy -D warnings`, and `cargo fmt --check` pass - `service::sourcemaps` unit tests pass under `--test-threads=1` (the CI setting; they share one db group and are not parallel-safe, same as before) - No logic changes anywhere: the diff is moves + visibility widening + clippy appeasement; error-to-HTTP-response mappings verified variant-by-variant - e2e label kept so Playwright runs --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
e381236fad | fix: crosslink and aws,azure button disable e2e (#13176) | ||
|
|
3f03b77320 |
feat: Revamp metrics explorer (#13144)
Revamp the metrics explorer to enable faster visualization and exploration of metrics. Design at: metrics_cards_prd.md file --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech> Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com> |
||
|
|
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>
|
||
|
|
b689bfb507 |
test(e2e): fix flaky pipeline tests and cut Pipelines shard runtime ~50% (14.3m → ~6.5–7m) (#13118)
## Summary The Pipelines E2E shard had **2 flaky tests** (`pipeline-core` → `deletePipelineByName` timing out) and ran in **~14.3 minutes**. This PR **fixes the flakiness** and **cuts the shard runtime by ~50%** — with **zero loss of test coverage** (every assertion and test step is preserved). ## 🎯 What we achieved | Metric | Before | After | |---|---|---| | **Shard runtime** | ~14.3m | **~6.5–7.1m (~50% faster)** | | **Flaky tests** | 2 | **0** | | Tests passing | 83 | 85 | | Test coverage | baseline | **unchanged** | ## 🔧 What we did ### Fixed the flakiness - **Scoped pipeline cleanup** — `beforeEach` no longer runs a **pool-wide cleanup** that deleted sibling tests' in-flight pipelines under parallel execution. **Each test now frees only its own source stream.** - **Worker-suffixed streams** — each test uses **`_w${parallelIndex}` stream names** so concurrent workers can **never collide** on shared streams. - **List-scan race guard** — the `openFirst*` helpers **re-check the row count each iteration** instead of clicking a row a concurrent test deleted (**was a 45s hang**). ### Reduced runtime - **Fixed the `dragStreamToTarget` phantom wait** — it waited **10 full seconds** on a selector that only exists for Stream nodes, so **every query/condition/function drag burned the full timeout**. Now it races all four node-form dialogs → **each resolves in ~1s**. → **`scheduled` dropped 1.6m → ~37s from this fix alone.** - **Trimmed `openPipelineMenu`** — replaced blind 1s+2s sleeps with a **`waitFor` on a real condition**. - **Parallelized the slow serial files** — flipped `pipeline-metrics`, `pipeline-traces`, and `pipelines-form-validation` from **`serial` → `parallel`** (each **verified parallel-safe** first). ## ⚠️ What we intentionally did NOT do - **No test steps, assertions, or validations were removed** — assertion counts are **identical before/after**. Only **redundant `waitForTimeout` idle**, stream-name scoping, and serial→parallel config changed. - **Load-bearing waits left untouched** — VueFlow canvas connects, realtime-pipeline activation, and intentional dwells are **preserved**. - **slowMo removal was tried and reverted** — **no reliable speedup** (the suite is wait-bound, not action-bound) and it added a deployed-env dependency. ## 📉 Slow-file poles — before vs after | File | Before | After | |---|---|---| | pipeline-metrics | 6.5m (serial) | **off slow list** | | pipeline-traces | 5.5m (serial) | **off slow list** | | pipelines-form-validation | 1.9m (serial) | **off slow list** | | scheduled-pipeline-query-builder | 1.6m | **~42s** | --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
e483e26b9d |
fix: pipeline module form migration with zod (#13077)
- form migration with zod schema for pipeline module --------- Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com> |
||
|
|
44866b482e |
fix: billing and others form migration with zod (#12905)
- form migration with zod schema for billing , marketplaces and other module --------- Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com> |
||
|
|
13c0c77703 |
feat: sso user blocklist (#13119)
Design at: security/domain-management |
||
|
|
12f8e134ff |
test(autoe2e): generated E2E tests for #11813 (logs-visualize-persistence) (#13010)
🤖 Auto-generated E2E tests for #11813 — **healed to passing** against a live OpenObserve before this PR was opened. - Branch `autoe2e/pr-11813` (stacked on `main`), so the tests run against the feature code and pass before it merges. - Spec: `tests/ui-testing/playwright-tests/Logs/logsVisualizePersistence.spec.js` The repo Playwright CI re-validates here. Review is for **quality + coverage** — the tests already pass. _Generated by the E2E Council pipeline._ **Test cases added / changed:** | Test case | Type | What it verifies | |---|---|---| | `should persist live mode / auto-run toggle across navigation` | extend | live-mode toggle state-guard added before navigation to catch silent no-op when auto_query_enabled is false | --------- Co-authored-by: Shrinath-O2 <214651540+Shrinath-O2@users.noreply.github.com> Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com> |
||
|
|
232642bef2 |
fix: form migration with zod for management module (#12877)
- form migration with zod schema for management module --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com> |
||
|
|
205d77f007 |
fix: dashboard form migration with zod (#12906)
- form migration with zod schema for dashboard module --------- Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com> |
||
|
|
39c1d8ae83 |
test: reduce Logs-Builder-Basic e2e runtime by removing dead waits and duplicate setup (#13080)
## Reduce `Logs-Builder-Basic` e2e shard runtime — ~10 min → ~5 min
### 🎯 Result (measured on CI)
| Metric | Before | After | Saved |
|--------|--------|-------|-------|
| **`Logs-Builder-Basic` shard** | **10m 05s** | **5m 12s** | **~4m 53s
(≈48% faster)** |
The shard runtime is cut roughly in half. Most of the old time was fixed
sleeps, waits that always ran their full timeout, and duplicated
per-test setup — not actual test logic. **No test cases, steps, or
assertions were removed.**
### What we changed
| # | Area | Before | After | Saving |
|---|------|--------|-------|--------|
| 1 | `initQueryBuilderTest` setup | Logs page loaded twice (helper
`goto` + `selectStream` navigates again) | Navigate once | 1 page load ×
~41 tests |
| 2 | `waitForBuildTabLoaded` | Always waited up to 10s for editor to
fill, even when it's meant to be empty | Skip when SQL mode is off |
~10s dead wait on many tests |
| 3 | `enableSqlModeIfNeeded` | 2s watcher wait + 500ms sleep, even
where the watcher never fires | Gated to Build tab; waits on real signal
| ~2.5s × ~35 tests |
| 4 | `disableSqlModeIfNeeded` | Fixed 500–600ms sleeps | Deterministic
wait on editor update | Blind sleeps removed |
| 5 | `applyQueryButton` | Clicked Run blindly | Waits for button ready
first | Fewer early-click retries |
| 6 | `pagination.spec` | Fresh stream ingest + index-wait per test (9×)
| One ingest per worker, reused | 8 redundant ingests + waits |
| 7 | `pagination.spec` | Dead `waitForTimeout(2000)` per streaming test
| Removed | ~2s × 5 tests |
| 8 | `unflattened.spec` | Search run twice with 3s + 1s sleeps | Single
run | ~5s × ~8 calls |
| 9 | `unflattened` row scan | Fixed 3s sleep per row | Wait for content
to render | 15-row scan: ~97s → seconds |
| 10 | `unflattened.spec` | Blind sleep after ingest | Poll until stream
queryable | No over-waiting |
### Bonus
Items 2–5 live in the shared `logsPage` page object, so
`Logs-Builder-Advanced`, `Logs-Core`, and `Logs-Features` shards get
faster for free too.
### Notes
| Item | Detail |
|------|--------|
| `playwright.yml` | Unchanged — shard layout stays as-is |
| Assertions | Preserved everywhere (e.g. pagination still checks the
same record counts) |
| Validation | All 52 tests still discovered by `playwright --list`;
shard confirmed green on CI at 5m 12s |
|
||
|
|
37a92fa87b | chore: service graph fixes (#13070) | ||
|
|
a7b46e989a |
chore(deps-dev): bump esbuild from 0.24.2 to 0.28.1 in /tests/ui-testing/fixtures/rum/npm-app (#13072)
Bumps [esbuild](https://github.com/evanw/esbuild) from 0.24.2 to 0.28.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/evanw/esbuild/releases">esbuild's releases</a>.</em></p> <blockquote> <h2>v0.28.1</h2> <ul> <li> <p>Disallow <code>\</code> in local development server HTTP requests (<a href="https://github.com/evanw/esbuild/security/advisories/GHSA-g7r4-m6w7-qqqr">GHSA-g7r4-m6w7-qqqr</a>)</p> <p>This release fixes a security issue where HTTP requests to esbuild's local development server could traverse outside of the serve directory on Windows using a <code>\</code> backslash character. It happened due to the use of Go's <code>path.Clean()</code> function, which only handles Unix-style <code>/</code> characters. HTTP requests with paths containing <code>\</code> are no longer allowed.</p> <p>Thanks to <a href="https://github.com/dellalibera"><code>@dellalibera</code></a> for reporting this issue.</p> </li> <li> <p>Add integrity checks to the Deno API (<a href="https://github.com/evanw/esbuild/security/advisories/GHSA-gv7w-rqvm-qjhr">GHSA-gv7w-rqvm-qjhr</a>)</p> <p>The previous release of esbuild added integrity checks to esbuild's npm install script. This release also adds integrity checks to esbuild's Deno install script. Now esbuild's Deno API will also fail with an error if the downloaded esbuild binary contains something other than the expected content.</p> <p>Note that esbuild's Deno API installs from <code>registry.npmjs.org</code> by default, but allows the <code>NPM_CONFIG_REGISTRY</code> environment variable to override this with a custom package registry. This change means that the esbuild executable served by <code>NPM_CONFIG_REGISTRY</code> must now match the expected content.</p> <p>Thanks to <a href="https://github.com/sondt99"><code>@sondt99</code></a> for reporting this issue.</p> </li> <li> <p>Avoid inlining <code>using</code> and <code>await using</code> declarations (<a href="https://redirect.github.com/evanw/esbuild/issues/4482">#4482</a>)</p> <p>Previously esbuild's minifier sometimes incorrectly inlined <code>using</code> and <code>await using</code> declarations into subsequent uses of that declaration, which then fails to dispose of the resource correctly. This bug happened because inlining was done for <code>let</code> and <code>const</code> declarations by avoiding doing it for <code>var</code> declarations, which no longer worked when more declaration types were added. Here's an example:</p> <pre lang="js"><code>// Original code { using x = new Resource() x.activate() } <p>// Old output (with --minify)<br /> new Resource().activate();</p> <p>// New output (with --minify)<br /> {using e=new Resource;e.activate()}<br /> </code></pre></p> </li> <li> <p>Fix module evaluation when an error is thrown (<a href="https://redirect.github.com/evanw/esbuild/issues/4461">#4461</a>, <a href="https://redirect.github.com/evanw/esbuild/pull/4467">#4467</a>)</p> <p>If an error is thrown during module evaluation, esbuild previously didn't preserve the state of the module for subsequent module references. This was observable if <code>import()</code> or <code>require()</code> is used to import a module multiple times. The thrown error is supposed to be thrown by every call to <code>import()</code> or <code>require()</code>, not just the first. With this release, esbuild will now throw the same error every time you call <code>import()</code> or <code>require()</code> on a module that throws during its evaluation.</p> </li> <li> <p>Fix some edge cases around the <code>new</code> operator (<a href="https://redirect.github.com/evanw/esbuild/issues/4477">#4477</a>)</p> <p>Previously esbuild incorrectly printed certain edge cases involving complex expressions inside the target of a <code>new</code> expression (specifically an optional chain and/or a tagged template literal). The generated code for the <code>new</code> target was not correctly wrapped with parentheses, and either contained a syntax error or had different semantics. These edge cases have been fixed so that they now correctly wrap the <code>new</code> target in parentheses. Here is an example of some affected code:</p> <pre lang="js"><code>// Original code new (foo()`bar`)() new (foo()?.bar)() <p>// Old output<br /> new foo()<code>bar</code>();<br /> new (foo())?.bar();</p> <p></code></pre></p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/evanw/esbuild/blob/main/CHANGELOG-2024.md">esbuild's changelog</a>.</em></p> <blockquote> <h1>Changelog: 2024</h1> <p>This changelog documents all esbuild versions published in the year 2024 (versions 0.19.12 through 0.24.2).</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/evanw/esbuild/commit/bb9db84c02433fbe37b3509f53f9f3e3cc48725e"><code>bb9db84</code></a> publish 0.28.1 to npm</li> <li><a href="https://github.com/evanw/esbuild/commit/9ff053e53b8eeb990f59355dbea365277ac45ee2"><code>9ff053e</code></a> security: add integrity checks to the Deno API</li> <li><a href="https://github.com/evanw/esbuild/commit/0a9bf2135b67c7e28989a5ba19f0f000805a5ab5"><code>0a9bf21</code></a> enforce non-negative size in gzip parser</li> <li><a href="https://github.com/evanw/esbuild/commit/e2a1a7132058ee067fe736eac15f695861b8654e"><code>e2a1a71</code></a> security: forbid <code>\\</code> in local dev server requests</li> <li><a href="https://github.com/evanw/esbuild/commit/83a2cbfc35809f4fd5152da59572d7bed7739d78"><code>83a2cbf</code></a> fix <a href="https://redirect.github.com/evanw/esbuild/issues/4482">#4482</a>: don't inline <code>using</code> declarations</li> <li><a href="https://github.com/evanw/esbuild/commit/308ad745d824c77bc607603451b257d0f2fd9a38"><code>308ad74</code></a> fix <a href="https://redirect.github.com/evanw/esbuild/issues/4471">#4471</a>: renaming of nested <code>var</code> declarations</li> <li><a href="https://github.com/evanw/esbuild/commit/f013f5f99a015bce92ec48d49181d4ad3177b29b"><code>f013f5f</code></a> fix some typos</li> <li><a href="https://github.com/evanw/esbuild/commit/aafd6e48b1088336a5f5a17e930be7e840d43d8c"><code>aafd6e4</code></a> chore: fix some minor issues in comments (<a href="https://redirect.github.com/evanw/esbuild/issues/4462">#4462</a>)</li> <li><a href="https://github.com/evanw/esbuild/commit/15300c30b5e22f7cfcbed850c246d35095658386"><code>15300c3</code></a> follow up: cjs evaluation fixes</li> <li><a href="https://github.com/evanw/esbuild/commit/1bda0c31d7697c0af44b3ab39b81e599e559a395"><code>1bda0c3</code></a> fix <a href="https://redirect.github.com/evanw/esbuild/issues/4461">#4461</a>, fix <a href="https://redirect.github.com/evanw/esbuild/issues/4467">#4467</a>: esm evaluation fixes</li> <li>Additional commits viewable in <a href="https://github.com/evanw/esbuild/compare/v0.24.2...v0.28.1">compare view</a></li> </ul> </details> <details> <summary>Maintainer changes</summary> <p>This version was pushed to npm by <a href="https://www.npmjs.com/~GitHub%20Actions">GitHub Actions</a>, a new releaser for esbuild since your current version.</p> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/openobserve/openobserve/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com> |
||
|
|
816e920cf4 |
test: add E2E coverage for dashboard table column formatting & filtering (#13057)
## Test Coverage — Dashboard Table Column Formatting & Filtering (PR #12531) ### Column Formatting | # | Test | Coverage | |---|------|----------| | 1 | Field type override | Auto-detected numeric column shows Value Formatting + Conditional Styling sections; forcing "text" hides them; forcing "num" restores them | | 2 | Custom unit | Custom unit input appears when unit = Custom; value persists after save + reopen | | 3 | Text/background color | Configured text & background color render correctly on the table cell | | 4 | Conditional styling | Two rules with non-overlapping thresholds prove genuine per-row, order-sensitive, last-match-wins rule evaluation | | 5 | Alignment | Changing alignment (Center) updates the cell's content justification | | 6 | Auto/unique color | Distinct column values render with distinct auto-assigned background colors | ### Column Filtering | # | Test | Coverage | |---|------|----------| | 7 | Filtering toggle | Enabling "Filtering" shows a filter icon in every column header | | 8 | Filter by value | Selecting a value narrows the table to matching rows; filter icon shows active state | | 9 | Clear filter | Clearing restores all rows and resets the filter icon | | 10 | Filter search | Typing in the search box narrows the value list to a "no matches" placeholder | | 11 | Filtering persistence | `table_filtering` toggle state survives save + reopen | ### Additional Changes - Extended `dashboard-panel-configs.js` / `dashboard-table-helpers.js` with reusable page-object methods for column formatting and filtering - Added `Dashboards-Charts` CI matrix entry in `.github/workflows/playwright.yml` |
||
|
|
6422c7fdb6 |
fix: form migration with zod for iam module (#12841)
- form migration with zod schema for iam module - https://github.com/openobserve/o2-enterprise/issues/2080 --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Bhargav <BJP232004@GMAIL.COM> Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com> |
||
|
|
2a3416ee35 |
fix: Rum automation (#13064)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
5229a8d1e3 |
fix:tw prefix removal (#13017)
Co-authored-by: ktx-riya <riya.kukadiya@kiara.tech> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
62a8f3f30b |
ci: gate Playwright + API tests behind an 'e2e' label + auto-bypass non-code changes (#13014)
## What Gate the full **Playwright (UI)** and **API** test suites on PRs behind a single **`e2e` label**, and **auto-bypass** PRs that only touch files which can't affect those suites. Covers `playwright.yml` and `api-testing.yml`. ## Behaviour (both suites) | Situation | build/test jobs | summary check (`playwright_summary` / `api_tests_summary`) | Mergeable? | |---|---|---|---| | PR with `e2e` label | full suite runs | green if tests pass | ✅ if green | | PR, no label, relevant code changed | skipped | **fails** ("add `e2e` label") | ❌ blocked | | PR, no label, docs/meta only | skipped | **passes** (auto-bypass) | ✅ | | Remove the `e2e` label | skipped (fresh run) | **fails** again | ❌ until re-added | | push to `main` / merge queue / dispatch | full suite runs | green if tests pass | n/a | One `e2e` label runs **both** UI + API. `push`, `merge_group`, and `workflow_dispatch` are never label-gated. ## Why the gate lives in the summary job A job that `if:`-skips reports `skipped`, which branch protection treats as **pass**. So a no-label PR can't be blocked by merely skipping jobs — the summary job **actively fails** when the change is relevant and the `e2e` label is absent. ## Auto-bypass (`check_changes`) No label needed for: `*.md/.mdx/.markdown/.rst/.adoc`, `docs/`, images/media, `LICENSE/NOTICE/AUTHORS/CONTRIBUTORS/CHANGELOG/.mailmap`, `CODEOWNERS`, GitHub issue/PR/funding templates, `dependabot`/`renovate`, `.gitignore/.gitattributes/.editorconfig/.gitkeep/.husky/.vscode/.idea`. The **API** workflow additionally bypasses `web/` + UI-test dirs (frontend changes don't affect API tests). **Not** bypassed (still trigger): `.github/workflows/**` (incl. these workflow files), source, `package*.json`/lockfiles, configs, `*.txt`. ## Rollout prerequisites - Create the **`e2e`** label in this repo. - Required status checks = **`playwright_summary`** and **`api_tests_summary`** — the individual shard jobs must NOT be required (they legitimately skip and would auto-pass). Sibling PR on the other repo uses the same branch `ci/e2e-label-gate`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
ffb50b8345 |
test(autoe2e): generated E2E tests for #11814 (report-csv-media-type) (#13008)
🤖 Auto-generated E2E tests for #11814 — **healed to passing** against a live OpenObserve before this PR was opened. - Branch `autoe2e/pr-11814` (stacked on `main`), so the tests run against the feature code and pass before it merges. - Spec: `tests/ui-testing/playwright-tests/Reports/reportCsvMediaType.spec.js` The repo Playwright CI re-validates here. Review is for **quality + coverage** — the tests already pass. _Generated by the E2E Council pipeline._ **Test cases added / changed:** | Test case | Type | What it verifies | |---|---|---| | `CSV option is visible in the Report Type dropdown` | new | the CSV (Data) option appears in the report type OSelect dropdown | | `Selecting CSV hides Attachment Type and Custom Dimensions` | new | selecting CSV hides the email attachment type dropdown and custom dimensions section | | `Save a report with CSV type succeeds` | new | a full create-report flow with CSV type completes and the report appears in the list | | `Switching from CSV back to PDF restores Attachment Type and Custom Dimensions` | new | toggling from CSV to PDF re-displays the attachment type and custom dimensions controls | | `Selecting PNG type shows PNG warning banner` | new | selecting PNG as the report type displays the PNG deprecation warning banner | | `Edit mode: a previously saved CSV report shows CSV as selected and controls hidden` | new | editing a CSV report reflects CSV as selected and keeps attachment type + dimensions hidden | --------- Co-authored-by: Shrinath-O2 <214651540+Shrinath-O2@users.noreply.github.com> |
||
|
|
81e2d7a42f |
test: heal E2E regressions + ENT shard failures from scoped SCSS removal (#12764) & OTag refactors (#12999)
## What this fixes The scheduled **regression suite** started failing on `main` after **#12764 (scoped scss styles removal)**, and validating the fix on the **enterprise build** surfaced several more failures in the same family (plus a couple unrelated ones). This PR heals **all of them**. Every fix is either a page-object selector update or a small, inert `data-test` hook — **no product behaviour changes**. ## Everything fixed | Area | Test | Root cause | Fix | Verified | |---|---|---|---|---| | **Streams** regression | `query expand icon #9337` | #12764 replaced `.editor-fullscreen` class with inline classes on `isFocused` | `data-fullscreen` hook on the container + detect via it | ✅ local | | **Alerts** regression | `Bug #9967 PromQL alert` | #12764 turned the PromQL operator into `<OSelect data-test="alert-threshold-operator-select">`, dropping `.alert-v3-select` | data-test + popover-option pattern (+ fail-fast fallback) | ✅ local | | **RUM** (ENT) | 3× `sourcemap-ui` | #12764 moved `.error-viewer-container` → data-test and dropped `.tags-title` | rumPage selectors + `data-test="error-tags-title"` hook | ✅ local | | **Logs-Features** (ENT) | `searchPatterns … wildcard chips` | chip moved from `.wildcard-chip` class to `<OTag data-test="pattern-card-wildcard-chip">` | target the data-test hook | ✅ local | | **Traces** (ENT) | `service-graph` user/search-service status | health badge moved from `.health-badge.<status>` classes to `<OTag data-test="service-health-badge">` | read status from the badge's text | ⚙️ ENT CI¹ | | **Dashboards-Core** | `line chart … camelCase zero values` | *(not #12764)* a line chart whose series are entirely zero renders "No Data" | one series counts all rows so the chart always renders | ✅ local | ¹ Traces service-graph needs an enterprise daemon that isn't available locally; validated against the component's own unit spec (`ServiceGraphNodeSidePanel.spec.ts`), confirmed on ENT CI. ## Root-cause themes 1. **#12764 (scoped SCSS removal)** deleted/renamed CSS classes that E2E page objects targeted. It added `data-test` hooks to *some* elements but not others — so tests anchored on bare `.class` selectors broke. The fix everywhere is to move those anchors to durable `data-test` hooks. 2. **`OTag`/`OSelect` component migrations on `main`** continued this: the components gained `data-test` hooks but the (enterprise-only) page objects were never updated. Because those specs are `@enterprise`, OSS CI never runs them — so they merged broken and only surfaced on the enterprise build. ## Product-code touched (test hooks only, inert) - `SearchBar.vue` — `data-fullscreen` attribute (no CSS/JS/snapshot consumers; styling still driven by the existing `isFocused` class binding) - `ErrorTags.vue` — `data-test="error-tags-title"` Everything else is under `tests/ui-testing/`. ## Verification Verified locally against a fresh frontend build (all green): Streams `#9337`, Alerts `#9967`, RUM (3), Dashboards-Core, Logs-Features searchPatterns. Traces service-graph is validated via its component unit spec + the enterprise CI run (it can't run locally without the service-graph daemon). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
8645ae3201 |
fix: incident page ui improvement (#12927)
- incident page ui improvements - play/resume button green across application - pause button red across application - Chip/Badge migration |
||
|
|
de5f4037c9 |
feat: FE shortcut support (#12460)
Design at: https://github.com/openobserve/designs/blob/main/ux/keyboard-shortcuts/design.md --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |