mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-05 16:10:43 +00:00
77a4fc5f32e0bc1c8997dc508440bd59cdcf2c4d
974
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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> |
||
|
|
0be7644721 |
test: common data seed for real-issue verification (#13029)
Yesterday's real-bug proof-of-concept showed the pipeline plumbing works, but every real bug came back INCONCLUSIVE because the Tester (via Playwright MCP) opened pages on an **empty OpenObserve instance**. There was nothing to observe — no streams, no alerts, no pipelines, no traces. This PR adds a common data seed the engine runs before every dispatch. **Pairs with [o2-enterprise#XXXX](https://github.com/openobserve/o2-enterprise/pull/XXXX) — both must merge together.** ## Files added | File | Contents | |------|----------| | `seed/seed-common.sh` | Main orchestrator. POSTs everything via HTTP Basic auth (matches OSS Playwright's `data-ingestion.js` — header-based, no creds on CLI args). | | `seed/traces_seed.json` | 5-span OTLP payload (synthetic — OSS doesn't ship a static traces JSON; `trace-ingestion.js` generates programmatically) | | `seed/metrics_seed.json` | 3-metric OTLP payload (HTTP counter + latency gauge + memory gauge; synthetic for the same reason) | | `seed/alerts_seed.json` | 3 alerts (one scheduled, one real-time, one disabled) | | `seed/pipeline_seed.json` | 1 pipeline (default → ci_pipeline_out) | ## What runs (in order) 1. **Fixture logs** → `ci_seed_stream` (kept for fixture #90001 backward compat via existing `logs_seed.json`) 2. **Bulk logs** (~3.8k entries from existing `tests/test-data/logs_data.json`) → 4 streams: `default`, `e2e_automate`, `web_logs`, `k8s_logs`. **Same file** OSS Playwright's `globalSetup` uses. 3. **OTLP traces** → `default` trace stream 4. **OTLP metrics** → `default` metrics stream 5. **3 alert definitions** (POST /api/{org}/{stream}/alerts) 6. **1 pipeline** (POST /api/{org}/pipelines) Idempotent — all ingestion is best-effort; single-endpoint failures log the HTTP status code but don't abort the seed. Unpopulated areas still yield INCONCLUSIVE downstream (better than the whole engine failing at seed). ## Coverage for the 10 Needs-Testing bugs we're firing next | Bug | Data type needed | Seed step | |-----|------------------|-----------| | #12452 SQL editor overflow | logs | 2 | | #11700 Streams spacing | streams (auto-created via ingest) | 2 | | #5042 Include search cmd+enter | logs | 2 | | #12603 Traces page issues | traces | 3 | | #12820 Alerts UX | alerts | 5 | | #6750 Multi-window custom time | alerts | 5 | | #10530 Pipeline cron alignment | pipeline | 6 | | #12647 Pipelines popup overflow | pipeline | 6 | | #9252 Pipeline destination verbiage | pipeline | 6 | | #12803 Language translation | any page (no seed needed) | — | ## Validated end-to-end Fixture #90002 dispatched on the paired branches ([run 28657529004](https://github.com/openobserve/o2-enterprise/actions/runs/28657529004)) — all 26 pipeline steps completed successfully, including the new Seed step showing 6 sub-seeds with their HTTP status codes. ## What's NOT in this PR - The old `seed/seed.sh` stays for one merge cycle (deprecated in the README) — will delete once two clean real-bug batches confirm seed-common works - No `Test-Assist-CI-Verified` label changes - No qa-reports table updates ## Test plan - [x] Fixture #90002 with `source_ref=feat/test-assist-common-seed` — all 26 steps green - [ ] After merge (this + ENT PR): dispatch on any real bug — expect seed step to run before Scout, and Tester to find non-empty pages 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <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> |
||
|
|
da867fb16a |
fix: scoped scss styles removal (#12764)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: ktx-mihir <mihir.patel@kiara.tech> Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech> Co-authored-by: ktx-vaidehi <vaidehi.akhani@kiara.tech> Co-authored-by: ktx-vaidehi <134508096+ktx-vaidehi@users.noreply.github.com> Co-authored-by: Bhargav <BJP232004@GMAIL.COM> Co-authored-by: ktx-akshay <akshay.patil@kiara.tech> |
||
|
|
7ad182b167 |
test(test-assist-ci): vision-preprocessor fixture + caller filter fix (#12973)
Consolidated OSS-side changes for the vision preprocessor rollout. Two things bundled here — both small, both OSS-only, related by "unblocks test-assist real-issue verification." ## Change 1 — Caller filter fix (originally in #12972, now closed) **One-line fix** for `.github/workflows/test-assist-caller.yml`: ```yaml # BEFORE — broken (silently skipped every /verify-bug comment on real issues) github.event.issue.pull_request == null # AFTER — truthy negation, evaluates correctly for undefined fields !github.event.issue.pull_request ``` Yesterday: 5 `/verify-bug` comments on real issues (#12452, #12647, #12603, #12820, #11700 — all by @neha00290, MEMBER association) produced 5 caller runs with `conclusion: skipped` and empty steps arrays. Root cause: `== null` compared against an *undefined* field in GHA expression context returns unexpected results → the entire OR short-circuited to false. The council caller uses the truthy check in the opposite direction (`github.event.issue.pull_request` alone → *requires* a PR). We use the negation of the same pattern — proven, works. ## Change 2 — Vision preprocessor fixture (`bug-002-image-attachment.json`) Adds fixture #90002 whose repro info lives **entirely in an image attachment**: - body has `Steps to Reproduce: _No response_` - body embeds a stable github.com/user-attachments/... permalink (streams-page screenshot from real bug #11700) Pairs with the ENT-side vision preprocessor PR (adds extract-attachments + describe-via-GLM-4.6V-Flash steps before Analyst). Success = pipeline extracts the image, GLM describes it, Analyst uses the description → produces `area: Streams` + `testability >= MEDIUM` instead of skipping for "no repro steps." `expected-verdicts.json` updated with the pipeline-signal expectations for #90002. ## Why bundled Both changes unblock real-bug verification. The caller fix means `/verify-bug` starts dispatching; the fixture proves the vision preprocessor works on visual-only bugs. Reviewing them together is faster than in isolation. ## Test plan - [x] YAML parses; fixture JSON valid; expected-verdicts JSON valid - [ ] After merge (this + ENT PR): comment `/verify-bug` on any Needs-Testing issue → expect caller job to RUN (not skip) → engine dispatched - [ ] After merge: dispatch fixture 90002 via workflow_dispatch → confirm vision preprocessor produces non-empty `bug-90002-attachments.md` → confirm Analyst produces `area: Streams` + non-SKIP testability Closes #12972. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
9cf5cbbbb4 | chore: IAM roles & group ux fixes (#12958) | ||
|
|
275fcb6600 |
fix: error if no valid sourcemap file found in zip (#12962)
Fixes https://github.com/openobserve/openobserve/issues/12951 --------- Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com> Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com> Co-authored-by: Shrinath Rao <shnath@openobserve.ai> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
ea039d0940 |
ci: add test-assist-ci caller + fixture data (#12946)
## Summary Thin OSS caller for the upcoming **Test-Assist** automated bug-verification pipeline — first piece of a 3-PR rollout. Mirrors the existing [`docgen-caller.yml`](.github/workflows/docgen-caller.yml) and [`e2e-council-caller.yml`](.github/workflows/e2e-council-caller.yml) patterns: the heavy engine will live in `o2-enterprise`; this caller only gates the trigger and dispatches via `ORG_ADMIN_TOKEN`. - **`.github/workflows/test-assist-caller.yml`** — caller workflow with two doors (`workflow_dispatch` + `/verify-bug` issue comments by org members). Defaults to `fixture_mode=true` / `write_mode=false` so the engine can't post to real issues until explicitly flipped. - **`tests/test-data/test-assist-ci/`** — fixture issue (#90001) + log seed data + `expected-verdicts.json` contract. Lets the engine soak in `FIXTURE_MODE=true` against synthetic data without touching real `Needs-Testing` issues. - **`tests/ui-testing/.gitignore`** — adds `_ci_tmp/` for the throwaway specs the engine generates per run. ### Differences from docgen / e2e-council callers | Dimension | docgen / e2e-council | test-assist | |---|---|---| | Operates on | PRs | **Issues** (`.issue.pull_request` filter dropped) | | Comment trigger | `/docgen`, `/e2e` | `/verify-bug` | | Inputs | pr_number, dry_run | issue_number, **fixture_mode**, **write_mode** | | Default safety | dry_run=true on comment | write_mode=false on every door | ### Rollout sequencing 1. **This PR** — OSS caller + fixtures + gitignore (no engine yet → caller will 404 on dispatch; intentional) 2. **Follow-up ENT PR** — `o2-enterprise/.opencode/agents/test_assist_ci/` (6 opencode sub-agents + README) 3. **Follow-up ENT PR** — `o2-enterprise/.github/workflows/test-assist.yml` (the engine itself) ## Test plan - [ ] CI: workflow YAML parses (verified locally via `python3 -c "import yaml; yaml.safe_load(open(...))"` — passes) - [ ] After ENT engine PR merges: trigger via `workflow_dispatch` with default inputs (`issue_number=90001`, `fixture_mode=true`, `write_mode=false`) → expect engine ack + fixture verdict in job summary, **no** GitHub writes - [ ] After soak: trigger `workflow_dispatch` with `fixture_mode=false` on a hand-picked `Needs-Testing` issue, `write_mode=false` → verdict in summary only - [ ] After verdict accuracy is calibrated: org member comments `/verify-bug` on a real issue, `write_mode=true` flipped via repo vars → comment + labels post 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
cd634bae43 |
test: heal flaky logs field-values-cache regression test (readiness gate) (#12956)
## What Heals the flaky **\`should fetch fresh field values when switching streams\`** (`@fieldValuesCache @P1 @regression`) test in `RegressionSet/Logs/logs-bugs.spec.js`, which failed the `Logs-Regression` job in [o2-enterprise run 28454057830](https://github.com/openobserve/o2-enterprise/actions/runs/28454057830/job/84328391696). ## Root cause The test ingests a unique `service_name=svc-automate-<runId>` into the **shared** `e2e_automate` stream, then immediately drives the UI field-values panel — with **no readiness gate** confirming that value is searchable yet. Freshly-ingested data isn't queryable instantly (WAL → index lag), so the `_values` call returns `svc-automate-*` values from earlier runs/retries but misses the just-ingested one: ``` Error: Expected stream1 values to contain svc-automate-1782832273253, got: svc-automate-17828322504262 ``` Playwright retries amplify it — each retry adds another `svc-automate` value to the shared stream while still missing the current run's value, so all retries fail. > Note: the CI job's attempt-2 then crashed on a `jq: Cannot iterate over null` error in the rerun-detection step. That is a **separate, already-fixed** issue — current `main` already has `actions: read` on the job + jq guards; the failing run executed a stale pre-fix workflow snapshot (GitHub re-runs reuse the original attempt's YAML). No workflow change is needed here. ## Fix - Add `waitForFieldValueSearchable()` to `utils/data-ingestion.js` — polls `_search` until the exact field value is returned (the proven readiness-gate pattern, value-level rather than row-count level). - Gate both the stream1 and stream2 ingested values before the UI assertions. ## Verification Run locally against a local OpenObserve with `--repeat-each=3`: ``` Stream1 field values: ["svc-automate-...0702","svc-automate-...4762"] # accumulates (reproduces CI pollution) ✓ Stream1 shows correct value: svc-automate-1782833946762 # current value always present now ... 3 passed (1.0m) ``` The accumulating `svc-automate-*` values across repeats reproduce exactly the shared-stream pollution seen in CI, and the gate ensures the current run's value is always present. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
96e8dcd5c1 |
chore: improve iam service account ux per audit recommendations (#12944)
Closes openobserve/o2-enterprise#2060 --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> |
||
|
|
8f81d41a80 |
test: heal logs Bug #4426 wrap-toggle assertion (switch to Table tab) (#12937)
## What Heals the wrap-toggle assertion in the **Logs-Regression** shard — the `text wrap toggle should not cause column misalignment on saved view switch` test (Bug #4426) in `logs-bugs.spec.js`. ## Root cause The test opens the log detail sidebar and asserts the wrap toggle is visible. But the sidebar opens on the **JSON tab by default** (Bug #9724), and the wrap toggle only renders in the **Table tab**. So the assertion (`verifyWrapToggleVisibleInTableTab`) always waited out its full `expect` timeout against the hidden toggle, then fell into the `catch` and logged: ``` Wrap toggle not found in current log detail: Timed out 30000ms waiting for expect(locator).toBeVisible() Locator: locator('[data-test="log-detail-wrap-values-toggle-btn"]') Received: hidden ``` This is the `Wrap toggle not found` warning visible in the scheduled Logs-Regression run [28373343106](https://github.com/openobserve/openobserve/actions/runs/28373343106). The toggle assertion never actually verified anything and burned ~30s of the shard's wall-clock as noise. ## Fix Click the Table tab before asserting the toggle's visibility, so the toggle actually renders and the check is meaningful (and fast). ```js await pm.logsPage.clickLogDetailTableTab(); await pm.logsPage.verifyWrapToggleVisibleInTableTab(); ``` ## Verification - Targeted run against a local OpenObserve instance: **passes in 10.9s**, now logging `✓ Wrap toggle is visible in Table tab` instead of the timeout warning. - Full Logs-Regression shard (all 4 spec files, 67 tests) run locally beforehand: **67/67 passed** — no regressions. ``` npx playwright test playwright-tests/RegressionSet/Logs/logs-bugs.spec.js \ -g "text wrap toggle should not cause column misalignment" ✓ ...logs-bugs.spec.js:1818:3 › ... @bug-4426 (10.9s) 1 passed ``` ## Note The linked run's job-level failure was a runner **shutdown/cancel signal** (infra reclaim) on the Logs-Regression shard plus a separate failure in the `Merge Reports and Upload to TestDino` job — neither is a test-code failure (all 67 logs tests pass locally). This PR addresses the one genuine test-level defect surfaced in that run. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
44221da314 |
feat(alerts): contextual help side panels for Additional Settings (#12922)
## What
Adds a contextual **help side panel** to the alert **Additional
Settings** tab. Each control (Template Override, Additional Variables,
Row Template) gets a **"Learn more"** link that opens a right-side
`ODrawer` explaining the control and showing a live, honest preview of
the notification message.
## Why
The old one-line tooltips didn't tell users what was actually changing —
e.g. Template Override just listed templates without showing the current
vs. selected message. This panel teaches first-time users *what* each
control does, *why* they'd use it, and shows *what gets sent*.
## Highlights
- **`useTemplatePreview` composable** — display-only `{variable}`
substitution: live form values shown as "your data", mock runtime values
marked as samples, and context-sensitive tokens (`{rows}`, `{rows:N}`,
`{var:N}`, `{...rows}`) rendered as opaque "filled at notification time"
chips — never faked against the real server renderer.
- **Template Override** — shows each destination's current message vs. a
non-destructive template preview (Apply required to commit).
- **Additional Variables** — plain-language explanation, a before/after
"why use a variable", a worked example with rendered result, and a
collapsible built-in-variable reference (not an 18-chip wall). Removed a
phantom variable (`{alert_agg_value}`) the UI advertised but the backend
never substitutes; added the real `{alert_description}`.
- **Row Template** — explains how `row_template` + `{rows}` compose,
with a worked example.
- **Reordered** the Advanced tab: Additional Settings → Compare with
Past → Deduplication.
- **Editor scroll fix** — Monaco editors now release the mouse wheel to
the page once their own content has nothing left to scroll (was trapping
page scroll on hover). App-wide default via an opt-out prop on the
shared `CodeQueryEditor`.
## Implementation notes
- Styling uses the `.css` design-token layer (`--color-*`,
`--radius-*`), theme-aware (light/dark); reuses
`OBadge`/`ODrawer`/`OSelect` rather than hand-rolling. No `px` (except
1/2px borders), no inline styles, no hardcoded colors.
- Every section has an empty state — no blank preview boxes.
- i18n `{...}` braces escaped for vue-i18n so literal placeholders
render.
## Tests
- Unit: `useTemplatePreview` (token classification, live/mock/opaque,
context vars, stream fields stay opaque).
- Component: `AlertSettingsHelpDrawer` (per-topic content, current vs.
preview, collapsible built-ins, empty states, i18n-literal & phantom-var
regression guards).
- Wiring: `Advanced.spec.ts` (Learn-more triggers); editor:
`CodeQueryEditor.spec.ts` (scroll prop).
- E2E (Playwright): `alerts-help-drawer.spec.js` smoke — open drawer,
no-mutation-until-Apply, overlay close, collapsible built-ins. (Not
executed in this environment — no backend/creds.)
228 unit/component tests pass locally.
## Notes for reviewer
- Draft: please review the description and the UX copy.
- The Monaco scroll default change touches the shared `CodeQueryEditor`
(used app-wide); behavior is opt-out via
`:release-wheel-to-page="false"` if any full-page editor should own the
wheel.
|
||
|
|
51cb2c4ff4 |
test: heal enterprise-only GeneralTests specs surfaced by ENT matrix sync (2047) (#12916)
## What Heals the two GeneralTests specs that fail in the ENT playwright matrix (ENT PR #2047, `test/ent-matrix-sync-missing-specs`) but are **skipped on OSS**. Both cover **enterprise-only** features (Regex Patterns, AI Toolsets / CrossLink). Their `beforeEach` probes for the feature route and `test.skip()`s when absent — so on the OSS binary they never run. ENT PR #2047 adds them to the ENT matrix, running them against the enterprise build for the first time and exposing two assertions that were never actually exercised. Not regressions — untested assertions finally hitting a real enterprise build. ## Fixes 1. **regex-patterns-form-validation** — `AddRegexPattern.vue`'s ODrawer has no `:primary-button-disabled` binding, so the Create button stays enabled on an empty form (validation runs on submit via the OForm schema). Assert `toBeEnabled()` and trigger the required-field errors by submitting. 2. **ai-toolsets-form-validation (CrossLink)** — the streams page defaults to the "logs" type filter (`LogStream.vue selectedStreamType=ref("logs")`), so the traces stream named `default` never renders a row and `log-stream-schema-btn` is unreachable. Point the suite at `e2e_automate` (the logs stream global ingestion always creates; cross-linking is logs-only and gated by `ZO_ENABLE_CROSS_LINKING=true`, which CI sets). ## Verification Reproduced both failures and verified the fixes on a local **enterprise** build (`build_type=enterprise`, v0.91.0-rc2): - regex-patterns: all 4 tests pass. - CrossLink: stream-detail step (original failure point) now passes; the tab additionally needs `ZO_ENABLE_CROSS_LINKING=true` (off on local dev binary, on in CI). ## Note Branch name matches the ENT branch `test/ent-matrix-sync-missing-specs` so the ENT CI tree-merge picks up these fixes for PR #2047. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
68ff976565 |
test: heal Logs-Regression failures (log detail sidebar + stream race) (#12908)
## What Heals the **Logs-Regression** E2E shard failures from scheduled run [28227009440](https://github.com/openobserve/openobserve/actions/runs/28227009440/job/83622550234) (3 failed, 1 flaky). ## Root cause analysis | # | Test | Symptom | Cause | |---|------|---------|-------| | 1 | `logs-9754.spec.js:276` — log detail sidebar @P1 | `waitFor [data-test="log-table-column-0-source"]` 30s timeout in `openLogDetailSidebar` | First result cell renders as the FTS **body/message** column, not `source`, so the exact selector never appears | | 2 | `logs-regression.spec.js:1150` — JSON tab default (#9724) | Same `openLogDetailSidebar` selector, 45s click timeout | Same as #1 | | 3 | `logs-9754.spec.js:195` — preserve characters @P0 | `selectStream: Failed to find stream "e2e_highlighting_test" after 5 attempts` | **Cascade**: test #1 fails → serial block retries → `afterAll` `deleteStream` from the prior attempt is still settling → re-ingest returns `400 "stream [...] is being deleted"` → stream never re-appears | | 4 | `logs-regression.spec.js:60` — saved views (#9388) | `log-search-index-list-add-log-field-btn` not visible | Hover-revealed add button stayed below the fold; single re-hover missed | `openLogDetailSidebar` is the dominant root cause — it directly explains #1 and #2, and #1 triggers the serial-block retry that produces the #3 cascade. ## Fixes 1. **`openLogDetailSidebar`** — target any first-row cell via the `[data-test^="log-table-column-0-"]` prefix instead of the exact `...-source` cell. This mirrors the pattern already used by `clickLogTableColumnSource` and `waitForSearchResults`, which carry the same FTS-body-column note. 2. **`logs-9754` setup** — retry ingestion (up to 5×, 3s apart) when the response says the stream `is being deleted`, so a serial-block retry no longer cascades into "stream not found". 3. **`clickAddFieldToTableButton`** — `scrollIntoViewIfNeeded` + re-hover with retries so the hover-revealed add button reliably surfaces (#9388). ## Files - `tests/ui-testing/pages/logsPages/logsPage.js` - `tests/ui-testing/playwright-tests/RegressionSet/Logs/logs-9754.spec.js` ## Validation - `node --check` passes on both edited files. - Full Playwright run deferred to CI / local verification (changes are selector + retry hardening only; no production code touched). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
45793bf76c |
fix: persist theme selection by name with redesigned theme drawer (#12890)
Theme selection across light and dark modes is now persisted by name instead of numeric ID. A shared registry (constants/themes.ts) owns the single source of truth for all predefined theme definitions, and utils/themeManager.ts provides a central applyCurrentTheme() / applyThemeForMode() API that replaces scattered inline resolution logic in App.vue and PredefinedThemes.vue. Custom themes continue to store their hex color as the source of truth, marked with the CUSTOM_THEME_NAME sentinel. The theme drawer is redesigned: a segmented Light/Dark toggle replaces the tabs, each theme is a single clickable row (no per-row Apply button), the applied theme is highlighted with a primary ring plus an Applied badge, long names truncate instead of wrapping, and the custom color row opens the picker with an Apply/Cancel dialog. --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
702af87f0b |
test: add alert history and report bulk-ops E2E tests (main / UX revamp) (#12883)
## Summary Port of [#12882](https://github.com/openobserve/openobserve/pull/12882) (v0.80.0) adapted for main branch's UX revamp. **Alerts — `alerts-history.spec.js` (6 tests)** - All selectors identical to v0.80.0 — `AlertHistory.vue` data-test attrs unchanged in main - `expectDetailsDialogVisible()` updated to use `data-test="alert-history-details-dialog"` (ODialog) instead of `.alert-details-dialog` CSS class **Reports — `reports-bulk-operations.spec.js` (6 tests)** - Bulk pause/resume tests **omitted** — `report-list-pause-reports-btn` / `report-list-resume-reports-btn` do not exist in main's `ReportList.vue` (only row-level pause exists) - Bulk delete confirmation updated for `ConfirmDialog`'s new ODialog pattern: `[data-test="confirm-dialog"] [data-test="o-dialog-primary-btn"]` - `cancelBulkDelete` updated to use `o-dialog-secondary-btn` ## Key selector changes from v0.80.0 → main | Component | v0.80.0 | main | |---|---|---| | Alert details dialog | `.alert-details-dialog` (CSS class) | `[data-test="alert-history-details-dialog"]` | | Confirm button | `[data-test="confirm-button"]` | `[data-test="confirm-dialog"] [data-test="o-dialog-primary-btn"]` | | Cancel button | `[data-test="cancel-button"]` | `[data-test="confirm-dialog"] [data-test="o-dialog-secondary-btn"]` | ## Related PRs - v0.80.0 OSS: #12882 - v0.80.0 ENT: openobserve/o2-enterprise#2017 ## Test plan - [ ] CI passes on `main` - [ ] Alert history: 6 tests green - [ ] Report bulk operations: 6 tests green (move, delete, cancel ×2, hidden, select-all) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Shrinath Rao <shnath@openobserve.ai> |
||
|
|
f4ba2e2dd6 |
test(autoe2e): generated E2E tests for #12857 (fts-default-column) (#12902)
🤖 Auto-generated E2E tests for #12857 — **healed to passing** against a live OpenObserve before this PR was opened. - Branch `autoe2e/pr-12857` (stacked on `main`), so the tests run against the feature code and pass before it merges. - Spec: `tests/ui-testing/playwright-tests/Logs/ftsDefaultColumn.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 clear FTS selection on stream change and re-resolve for new stream` | extend | switching streams clears the carried-over FTS default selection, then re-resolves the FTS default column for the new stream on the next search | | `should clear FTS default on field reset and re-resolve on next search` | extend | clicking the field-list reset icon clears the auto-picked FTS default column from the table, then running a new search re-resolves it | --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Shrinath-O2 <214651540+Shrinath-O2@users.noreply.github.com> |
||
|
|
c178de4013 |
fix(test): SDR combined-field verification via search API (definitive fix for e2e/SDR flakes) (#12896)
## Problem
The 7 `@combined` SDR specs (`queryTime{Redaction,Drop,Hash}`,
`ingestionTime{Redaction,Hash,Drop}`, `multipleSDRPatterns`) fail
deterministically on `e2e / SDR` (ENT [run
28216495512](https://github.com/openobserve/o2-enterprise/actions/runs/28216495512))
with `Field <name> should be visible but was not found`, even after the
content-gate retry in #12893.
## Root cause (a logic bug, not timing)
Verification scraped the virtualized logs results table. Two structural
defects:
1. **Row-indexed selector misused as a count.**
`[data-test="log-table-column-0-source"]` — `TenstackTable.vue` renders
`log-table-column-{rowIndex}-source`, so it only ever matches **row 0**
(1 element). The combined path's `count >= 4` gate can never be met by
the reliable source locator.
2. **Dead fallback selector.** `.logs-result-table tbody tr[role="row"]`
references a class that **does not exist** in `web/src` → always 0.
So the fetch collapsed to whole-page `tbody tr` scraping whose text
never matched the field keys → the flat *"4 entries found but fields not
yet indexed"* across every retry. #12893's retry couldn't help because
the scraped data was structurally wrong, not late. Single-field tests
passed only because they read row 0 directly.
## Fix
Verify against the **Search API** — the actual source of truth for SDR.
Query-time redaction is applied server-side in `apply_regex_to_response`
(`ApplyPolicy::AtSearch`); the web only displays API output, so
`[REDACTED]` / `[REDACTED:<hash>]` / dropped-field semantics are all
present in the API hits.
- Each ingest tags records with a unique `sdr_test_id` marker and
returns it.
- Verification queries `_search` with `WHERE sdr_test_id = '<marker>'`,
polls only until the **known** record count is searchable, then asserts
on the JSON hits.
- Markers threaded through all 7 specs: query-time reuses one marker
(visible → transformed); ingestion-time uses distinct per-batch markers;
`multipleSDRPatterns` threads one per sequential ingest.
Net **−80 lines** — removes all brittle DOM scraping from SDR
verification.
## Validation
`node --check` passes on all changed files; every verify call confirmed
to thread a marker; root-cause selectors + server-side redaction path
confirmed against source. Live `e2e / SDR` run validated via a
matching-name ENT branch (CI tree-merge picks up this OSS branch).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
afd3758972 |
test: add schema evolution stress tests — scenarios 26–59 (diverge-then-converge + 9 scenario groups) (#12888)
## What Extends `tests/api-testing/tests/vortex/test_schema_evolution.py` with **34 new tests** across 10 new classes covering all realistic field drift scenarios for petabyte-scale schema evolution. Grows the schema evolution suite from 13 scenarios (14–25) to **46 scenarios (14–59)**. ## The scenario (shared across all groups) Think of a post office logbook. In January every letter has *From, To, Weight*. In February the form changes — Weight is dropped, Stamp Color is added. In March they go back plus add more fields. ``` Batch 1 [fa, fb, fc] — initial deployment Batch 2 [fa, fb, fd] — update: fc dropped, fd introduced Batch 3 [fa, fb, fc, fd, fe] — redeployment: fc back, fd kept, fe added ``` Each batch is flushed to a separate on-disk file before the next is ingested, forcing the query planner to reconcile three distinct schemas — the exact code path touched by `perf: Batch schema evolution checks` (v0.80.0). ## Test classes and scenarios added | Class | Scenarios | What it checks | |---|---|---| | `TestSchemaDivergenceConvergence` | 26–28 | Nullability per batch, cross-batch aggregation, field coexistence isolation | | `TestNullHandling` | 29–31 | IS NULL / IS NOT NULL exhaustive for absent fields | | `TestAggregationsOnPartialFields` | 32–36 | COUNT, SUM, MIN/MAX, COUNT DISTINCT on partial fields | | `TestGroupByOrderByEvolved` | 37–40 | GROUP BY / ORDER BY when grouped field is absent in some batches | | `TestTypeChangeOnReappearance` | 41–44 | Field returns as different type; OO type-preservation behavior documented | | `TestMultipleDivergenceCycles` | 45–46 | Field disappears and reappears multiple times | | `TestComplexQueriesEvolved` | 47–51 | SELECT *, CASE WHEN, subquery, HAVING on evolved schemas | | `TestTimeRangeEvolved` | 52–55 | Time-range filters correctly isolate individual batch windows | | `TestFTSEvolved` | 56–58 | Full-text search across batches with absent fields | | `TestHighFieldCountDivergence` | 59 | Wide schema: 20-field batch diverging to 10-field batch | ## Key findings documented in tests - **OO string-null behavior**: absent string fields are stored as `''` not SQL NULL — correct check is `IS NOT NULL AND != ''`; numeric fields use `IS NOT NULL` only - **OO type preservation**: when a field returns as a different numeric type, OO preserves the original type on disk; test_42 documents this behavior explicitly ## Code review fixes included - Added missing `fb` assertion in test_26 - Removed incorrect `!= ''` check on numeric `latency_ms` field (tests 27, 32–35) - Added comment in test_28 explaining the OO string-null quirk - Updated module docstring to list all 9 scenario groups - Added docstrings to all `_ingest` / `_ingest_three_batches` helper methods ## Why The v0.80.0 commit changed how OpenObserve batches schema reconciliation across multiple on-disk files. A bug in that path can: - Silently return fewer records than expected (data loss with no error) - Return wrong nullability for fields that reappear after being absent - Mis-count aggregations over fields that span only some of the files None of the 13 existing tests covered the diverge-then-converge pattern. This PR closes that gap across all query types. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
3b3f6b9df7 |
fix(test): harden SDR + Logs regression tests against CI render/index lag (#12893)
Two clusters of CI-only flakes — **every affected spec passes locally**;
all failures reproduce only under CI load (slow indexing /
re-rendering). All fixes are in test page-objects / setup — no product
or assertion changes.
## 1. SDR verification (o2-enterprise#2022, `e2e / SDR` — 7 failed)
`ingestionTime{Drop,Hash,Redaction}`, `queryTime{Drop,Hash,Redaction}`,
`multipleSDRPatterns` all died with `Field <name> should be visible but
was not found` (`foundLog === null`).
**Cause:** the verification helpers used **row count** as the readiness
signal for freshly-ingested logs. `fetchAllLogTexts` returned the moment
`minCount` rows rendered (the loose `tbody tr` fallback could even count
non-data rows), and `verifySingleFieldInLatestLog` broke on the first
non-null row — so under load they asserted against a partial/stale
result set before the fields were searchable. The per-field loop throws
on the first field, so the error always named the first field
(`website_url`/`user_email`/`multi_data`), masking the real cause.
**Fix (`sdrVerificationPage.js`):** make readiness content-aware —
`fetchAllLogTexts` takes `requiredFields` and retries until every
required field actually appears; `verifyMultipleFields` passes all
non-dropped fields; `verifySingleFieldInLatestLog` gates its retry loop
on field presence when expected.
## 2. Logs regression (scheduled Logs-Regression on `main` —
[OSS](https://github.com/openobserve/openobserve/actions/runs/28208045315)
/
[ENT](https://github.com/openobserve/o2-enterprise/actions/runs/28207989646),
3 failed + 1 flaky)
- **logs-9754** (`detail sidebar` / `unclosed brackets`): empty/late
table & `selectStream` not finding the stream — the setup only waited
for the stream to *exist*, not for its rows to be searchable. Gate the
setup on `waitForStreamData` (polls the search API).
- **#9724** (`detail sidebar JSON tab`): row resolved but the table was
still re-rendering → plain click timed out on "element not stable".
Harden `openLogDetailSidebar`: wait for a visible row, scroll into view,
click with a force fallback.
- **#9388** (`saved views stream switching`): the hover-revealed
add-field button was lost before the click. `clickAddFieldToTableButton`
now re-hovers the field row and waits again before failing.
## Verification (local, enterprise build `localhost:5080`)
| Suite | Result |
|-------|--------|
| 7 SDR specs | 14 passed |
| logs-9754.spec.js | 6 passed |
| logs-regression #9388 + #9724 | 2 passed |
```
npx playwright test playwright-tests/SDR/<spec>.spec.js --project=chromium
npx playwright test playwright-tests/RegressionSet/Logs/logs-9754.spec.js --project=chromium
npx playwright test playwright-tests/RegressionSet/Logs/logs-regression.spec.js -g "9388|9724" --project=chromium
```
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
f5a14afbe9 |
chore: logs page displays fts default columns (#12857)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Shrinath Rao <shnath@openobserve.ai> |
||
|
|
0afbe40fe4 |
test: fix flaky Alerts OSelect dropdowns (click trigger, not root div) (#12869)
## Problem The scheduled **main** Playwright Regression run failed in the **Alerts-Regression** shard ([run 28097849118](https://github.com/openobserve/openobserve/actions/runs/28097849118/job/83192928864)) with 2 tests failing on the **same** locator `[data-test$="-popover"] [data-test$="-option"]` (dropdown options never found): - `alerts-bugs.spec.js` › "Template should not appear twice in override template input" (`@bug-10110`) - `alerts-regression.spec.js` › "Bug #9967: PromQL alert creation" (`@bug-9967`) ## Root cause The alert form selects were migrated to the **OSelect** (reka-ui popover) component. OSelect forwards the consumer's `data-test` onto an **inner `<button data-test="...-trigger">`**, while the root element is a plain `<div>`. Both tests clicked the **root `<div>`**, which does **not** toggle the reka popover — `aria-expanded` stays `false`, the popover never opens, and the option locator times out. This is not caused by #12855; it reproduces on an older build too. The codebase already had the correct pattern elsewhere (group-by select clicks `[data-test$="-trigger"]`). ## Fix - New shared helper `openOSelectDropdown(page, rootLocator)` (`tests/ui-testing/pages/alertsPages/oselectHelpers.js`) that clicks the inner `-trigger` and **retries until `aria-expanded="true"`** — the reka trigger can open-then-close on a single Playwright click. - `alertsPage.openAdvancedTemplateOverrideSelect()` uses the helper; the spec now calls that page-object method (no raw locator in the spec). - Routed **all 8** destination-dropdown open sites in `alertCreationWizard.js` through the same helper (DRY; the same latent bug affected every one). ## Validation (local, against running o2) | Spec | Result | |------|--------| | `alerts-bugs.spec.js` | **4 passed** | | `alerts-regression.spec.js` | **5 passed** (incl. Bug #9967 PromQL) | Both originally-failing tests are green; no regressions across the changed destination sites. Passed a Sentinel code-quality review (0 critical). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
b0f4b0e46f |
test: expand query-agent suite from 672 to 1,000 queries (#12856)
## Summary Expands the query-agent regression test suite from **672 → 1,000 queries** by adding 328 complex queries (Q672–Q999) across all 13 categories. ## What changed - **`data_gen.py`**: `NUM_QUERIES` bumped from 675 → 1000 so `build_dataset()` generates records for all query IDs - **13 query JSON files**: 328 new queries appended, with DuckDB-computed expected results via `compute_counts.py` - **`gen_q672_q999.py`**: new generation script (idempotent — re-running skips all existing queries) ## New query patterns added Targets DataFusion-upgrade-fragile areas identified from past breakage: | Pattern | Examples | |---|---| | 3-stream JOINs + correlated EXISTS | Q672–Q677 | | FULL OUTER JOIN between streams | Q693–Q696 | | Window + DISTINCT (FIRST_VALUE, LAST_VALUE, NTH_VALUE) | Q717–Q730 | | Named WINDOW clauses | Q731–Q736 | | LAG/LEAD with CASE trend detection | Q742–Q751 | | match_all + GROUP BY + HAVING | Q792–Q796 | | INTERSECT/EXCEPT with CTEs | Q822–Q849 | | Deep CTE chains (3+ CTEs, self-joins) | Q757–Q791 | | Correlated scalar subqueries in SELECT | Q769–Q776 | | Histogram with JOIN between streams | Q901–Q905 | ## Issues fixed - **4 duplicate IDs** (Q545–Q548) existed in both `cte_subquery.json` and `full_text_search.json` — renumbered FTS copies to available gaps (Q025, Q611, Q631, Q1000) - **27 queries** using OO-specific functions (match_all, spath, regexp_like, window-inside-aggregate) annotated with `skip_sqllogictest: true` ## Final breakdown | Category | Before | After | |---|---|---| | cte_subquery | 89 | 124 | | aggregation | 71 | 99 | | string_functions | 70 | 92 | | combined | 73 | 88 | | full_text_search | 58 | 88 | | window | 48 | 88 | | basic_select | 71 | 86 | | histogram | 57 | 79 | | union | 34 | 62 | | cross_stream | 16 | 61 | | date_time | 37 | 60 | | pagination | 22 | 42 | | math_functions | 26 | 31 | | **Total** | **672** | **1,000** | - **956** queries use sqllogictest mode (DuckDB-verified results) - **44** use legacy assertion mode (OO-specific functions, histograms) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> |
||
|
|
6a3e36886b |
feat: dashboard table chart enhancement (#12531)
# feat: Dashboard Table Chart — per-column formatting ## 1. Entry point — config panel Column formatting lives in the panel **Config** panel, under a **Column Formatting** section. A **"Configure column formatting"** button opens the **Column Formatting** dialog. <img width="1920" height="907" alt="image" src="https://github.com/user-attachments/assets/21d05294-3d3e-4f84-893f-cf3b235adf0d" /> ## 2. Column Formatting dialog — empty state A 3-pane dialog. When nothing is configured yet it shows an empty state (`OEmptyState`) with a single **"+ Add field"** action. **Add field** is a dropdown listing the panel's columns (each with a **NUM / TEXT** type badge); the menu matches the trigger width. <img width="1920" height="907" alt="image" src="https://github.com/user-attachments/assets/866fb119-76f3-48b2-98b6-50df24660a8c" /> ## 3. Column Formatting dialog — editing a field - **Left** — "+ Add field" + the list of added fields (type badge, name, hover-to-remove ✕). - **Middle** — the shared controls for the selected field: - **Field Type** — `Auto` / `Num` / `Text` (Auto detects from the data; Num/Text force it). - **Value Formatting** — unit dropdown (numbers, bytes, durations, percentage, currency, custom) — numeric columns only. - **Alignment** — `Auto` / `Left` / `Center` / `Right` (Auto = type-based default). - **Styling** — Text color, Background color (curated swatches + custom), and a Unique-value-color toggle. - **Conditional Styling** — threshold rules (numeric columns only). - **Right** — a **live preview** of the column rendered with the current settings. <img width="1920" height="907" alt="image" src="https://github.com/user-attachments/assets/276289d8-f92d-46f2-a413-b58e840e2f6b" /> ## 4. Conditional styling Per-column rules read as a sentence: **If value** `[operator]` `[value]` **then text color** `[…]` **and background** `[…]`. Operators: `<`, `>`, `<=`, `>=`, `=`, `!=`. Add multiple rules — **the last matching rule wins**, so later rules override earlier ones (e.g. `> 1000` takes precedence over `> 400` for `2301`). <img width="1920" height="907" alt="image" src="https://github.com/user-attachments/assets/b47bde1c-11e4-4ec9-8d6b-03f702ae8902" /> **Example** — flag `count` when it's low: > Conditional Styling → **Add rule** → operator `<`, value `50` → Text `#b91c1c`, Background `#fef2f2`. Persists in `override_config` as: ```json { "field": { "matchBy": "name", "value": "count" }, "config": [ { "type": "conditional_styles", "rules": [ { "operator": "<", "threshold": 50, "textColor": "#b91c1c", "bgColor": "#fef2f2" } ] } ] } ``` ## 5. Rendered result in the live table Cells matching a rule render with the configured colors; non-matching cells stay normal. Thresholds may be decimals (e.g. `0.5`). <img width="1920" height="907" alt="image" src="https://github.com/user-attachments/assets/4c4146f9-b018-465e-81ae-fc04149cdc83" /> --- ## Data model Overrides persist as an array at `config.override_config`; each entry targets one column and carries typed config items. The discriminants (`tableConfigUtils.ts` `OVERRIDE_CONFIG_TYPES`) are kept in sync with the Rust v8 schema (`src/config/src/meta/dashboards/v8/mod.rs`): ``` field_type · unit · alignment · text_color · background_color · unique_value_color · conditional_styles ``` Unset values use `null` (inherit the panel default); `field_type` defaults to `auto`. Backward compatible: dashboards saved before this change load and render unchanged (the v8 `Config` enum has no `deny_unknown_fields` and no newly-required field). ## Architecture | Piece | File | | --- | --- | | Dialog (3-pane) | `web/src/components/dashboards/OverrideConfigPopup.vue` | | Shared sections | `web/src/components/dashboards/ColumnFormatControls.vue` | | Color picker | `web/src/components/dashboards/ColorSwatchPicker.vue` | | Model + (de)serialize | `web/src/composables/dashboard/useColumnFormatting.ts` | | Parse / apply / format | `web/src/utils/dashboard/tableConfigUtils.ts` | | Render (cell styling) | `web/src/components/dashboards/panels/TableRenderer.vue` | | Config-panel entry | `web/src/components/dashboards/addPanel/OverrideConfig.vue` | | Rust v8 schema | `src/config/src/meta/dashboards/v8/mod.rs` | ## Scope changes (vs the original proposal) - **Cell types removed** — the `Text / Bar / Spark` toggle, in-cell **progress bars**, and **sparklines** were prototyped and then dropped (frontend + the v8 `cell_type` variant). Formatting is type/unit/alignment/color/conditional only. - **Inline header popover removed** — formatting is reached via the config-panel dialog (no per-header tune-icon popover / "Edit all"). - **Conditional precedence** — last matching rule wins (was first-match). ## Notable correctness fixes - **Value-mapping ranges** — numeric values arriving as strings (e.g. `"5"`) again match range mappings (restored origin behavior; empty/null cells don't false-match a `0`-bounded range). - **Conditional threshold** — decimal thresholds (e.g. `0.5`) deserialize correctly on the Rust side (flexible `OrdF64` deserializer). - **Reset-on-type-change** — forcing a numeric column to `Text` clears its now-hidden unit/conditions (keyed by field, so removing a column never wipes a different one). --- # Column Filtering > Detailed design: [`table-filtering.md`](./table-filtering.md) In-table, multi-select, spreadsheet-style filtering for table panels. Each column header gets a filter button; its dropdown lists that column's **distinct values** as a checkbox list — tick/untick to narrow the rows. Filtering is **purely client-side** (no re-query). ## 1. Enable it A single **Column Filtering** toggle in the panel **Config** panel (`config.table_filtering`, an `Option<bool>` in the v8 schema). Off by default; when on, the table renderers receive `:enable-filtering` and the header filter buttons appear. (Filtering is suppressed in print/export mode.) <img width="1680" height="907" alt="image" src="https://github.com/user-attachments/assets/d834a916-c7eb-4dce-9984-95276e996e87" /> ## 2. Filter a column Click a header's filter button to open the dropdown: - **Distinct values** of the column as a checkbox list — pick any subset. - **Searchable** — a search box narrows the value list. - **Clear** a column's filter in one click. - Values display formatted (units/mappings) but match on the raw value. - Multiple column filters combine with **AND**; sorting preserves active filters. <img width="1680" height="907" alt="image" src="https://github.com/user-attachments/assets/0671b75e-e049-442f-bc56-53e861b9ff41" /> ## Architecture | Piece | File | | --- | --- | | Config toggle | `web/src/components/dashboards/addPanel/ConfigPanel.vue` (`table_filtering`) | | Renderer wiring | `web/src/components/dashboards/PanelSchemaRenderer.vue` (`:enable-filtering`) | | Filter UI + logic | `web/src/components/TenstackTable.vue` (gated by `enableColumnFilter`) | | v8 schema flag | `src/config/src/meta/dashboards/v8/mod.rs` (`table_filtering: Option<bool>`) | Implemented on the same branch as the formatting work; `enableColumnFilter` is a no-op when false, so non-table charts and filtering-off panels are unaffected. </content> Design At: dashboards/table-enhancement --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> |
||
|
|
8844a46863 |
test: fix Sankey 'No Data' edge test starved by textContent auto-wait (#12848)
## What Fixes the consistently-failing E2E test `Dashboards/dashboard-sankey.spec.js:400 › should show No Data when only Source field is configured` (surfaced by o2-enterprise run [28041876852](https://github.com/openobserve/o2-enterprise/actions/runs/28041876852/job/83025088903), `e2e / Dashboards-Charts`). ## Root cause With **only a Source field**, the Sankey config is incomplete, so clicking Apply triggers panel **validation errors** (`DashboardErrors`: "Add one field for the target / value") and never runs the query — the `[data-test="no-data"]` element is never rendered. The poll predicate called `noDataLocator.textContent()` **first**. `locator.textContent()` auto-waits for its element to attach, so it blocked for the full 12s timeout and the predicate **never reached** the `dashErrorLocator.isVisible()` fallback that would have passed. The failure trace confirms it: `textContent` on `no-data` called 1×, `isVisible` on `dashboard-error` called 0×. Deterministic, not flaky (failed all 4 CI attempts × 4 retries). ## Fix - Check the non-blocking `dashErrorLocator.isVisible()` **first**. - Guard the no-data text read with `count()` (instant, no auto-wait); only call `textContent()` once the element exists. - Comments/message updated to reflect that validation errors are the expected outcome for an incomplete Sankey config. No page-object changes needed. ## Verification Ran locally against `http://localhost:5080` **3× — all passed** (16.4s / 15.5s / 15.8s), with the validation error detected on the first poll iteration each time. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
744c648102 |
test(autoe2e): generated E2E tests for #12423 (prebuilt-template-management) (#12840)
🤖 Auto-generated E2E tests for #12423 — **healed to passing** against a live OpenObserve before this PR was opened. - Branch `autoe2e/pr-12423` (stacked on `main`), so the tests run against the feature code and pass before it merges. - Spec: `tests/ui-testing/playwright-tests/Alerts/alerts-template-prebuilt-guard.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 | |---|---|---| | `P0.1: Template List Renders with Tabs and Action Buttons` | new | template list core UI renders with tab toggle group, add/import buttons, and data table | | `P0.2: Prebuilt Template Guard — Delete Button Disabled & Badge Visible` | new | prebuilt templates show a distinguishing badge and have disabled delete buttons | | `P1.1: Template Tab Filtering — All / Prebuilt / Custom` | new | clicking tab toggles correctly filters visible rows to match the selected filter | | `P1.2: Edit (Update) a Custom Template` | new | opening a custom template in edit mode allows updating the body and persisting the change | | `P1.3: Clone a Custom Template` | new | cloning a template creates a Copy_of_ copy without overwriting the original | | `P1.4: Prebuilt Templates Excluded from Bulk Selection` | new | select-all checkbox excludes prebuilt rows so only custom rows get selected for bulk delete | | `P2.1: Empty Template Name Validation` | new | saving with an empty name triggers inline validation error | | `P2.2: Invalid Resource Name Validation` | new | names with spaces or disallowed characters are rejected with a descriptive error | --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> |
||
|
|
2675aa371c |
chore: dashboard styling changes (#12808)
Co-authored-by: ktx-vaidehi <vaidehi.akhani@kiara.tech> Co-authored-by: ktx-vaidehi <134508096+ktx-vaidehi@users.noreply.github.com> |
||
|
|
a0bdebb711 |
test: reduce e2e flakes — pipelines ingest keep-alive, dashboard chartJson popup, logs _o2_id (#12813)
Reduces three independent e2e flakes. All test-infra only; no product code. ## 1. Pipelines — `ingestData` "Premature close" (the original failure) `LogsPage.ingestData` failed all records with `Failed to ingest N out of N`. Server returned HTTP 200 and ingested every record, but node-fetch 2.7.0 reused a keep-alive socket the server closed during the 500ms inter-record gap → "Premature close" reading the body (0/384 succeeded). Fix: disable keep-alive (fresh connection per request, per-protocol agent) + per-record retry. Verified: Pipelines shard green. ## 2. Dashboards-Core — `dashboard-chartJson.spec.js` popup flake Custom-query tests (1 failed + 3 flaky) failed at the JSON/non-timestamp checkbox with "popper intercepts pointer events" / detached timeouts. Root cause (reproduced 100% locally): the field-property ODropdown auto-closes within ~300ms when opened right after the panel's first render — a late field-list re-render dismisses it. `toBeVisible()` passes at t=0 but the checkbox is gone by click time. Fix: `openFieldPropertyPopup` now opens, confirms the popup STAYS open, and re-opens if it auto-closed (throws if it never stays open — no masking). Verified locally across repeated runs. ## 3. Logs-Builder — `unflattened.spec.js` `_o2_id` readiness Failed with `Failed to find _o2_id field after 3 attempts`; CI log shows the UI detail was empty (`fields: []`) — re-ingested data wasn't search-visible yet on the contended runner. The readiness gate existed but its result was ignored, so the test fell through to a doomed UI scan and burned all 4 retries (~26 min). Fix: respect the gate's result (on timeout, wait once more and log), and widen the UI row scan 10→15. The final assertion is unchanged — a genuinely absent `_o2_id` still throws. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
5ea540c0d6 |
fix(test): extend keep-alive/compress fix to GeneralTests, Streams, Reports, SDR jobs (#12804)
## Summary Applies the same node-fetch v2 fix from PR #12799 (pipelines) to all remaining CI jobs that show \"Premature close\" / ECONNRESET failures: - **apiUtils.js** (`sendRequest`): adds `compress:false` + `noKeepAliveAgent` — fixes **Streams** job (`multiselect-stream.spec.js`, `streamname.spec.js`) - **apiCleanup.js** (`_fetch`): same fix on the node-fetch fallback path — fixes **Reports** job (dashboard/report API calls) - **model-pricing.spec.js**: wraps `node-fetch` with a local safe-fetch shim — fixes **GeneralTests** job (`/llm/models` premature close) - **streamsPage.js**: replaces four dynamic `node-fetch` imports with a shared `_nodeFetchSafe` helper - **ingestionPage.js**: adds `fetchWithRetry` around native fetch to handle transient `ECONNRESET`/premature close in `beforeEach` ingestion **SDR fix:** `regexPatternManagement.spec.js` — `AddRegexPattern.vue` migrated to `OForm` with submit-time Zod validation (`AddRegexPattern.schema.ts`). The `ODrawer` primary button is no longer disabled for empty fields; validation triggers on click and keeps the drawer open on error. Replaces stale `expect(isDisabled).toBeTruthy()` checks with click-then-expect-drawer-still-visible assertions. ## Root cause (same as #12799) `node-fetch` v2 defaults to `keepAlive: true` (connection pooling) and `compress: true` (Gunzip stream). When the server closes a pooled connection early, the Gunzip stream throws \"Premature close\". Because the dead socket stays in the pool, retries hit the same socket. `keepAlive: false` + `compress: false` eliminates both failure modes. ## Test plan - [ ] GeneralTests / `model-pricing.spec.js` — no more premature close on `/llm/models` - [ ] Streams / `multiselect-stream.spec.js` + `streamname.spec.js` — no more premature close on ingestion - [ ] Reports / `reportsScheduleNow.spec.js` — no more premature close during beforeEach ingestion - [ ] SDR / `regexPatternManagement.spec.js` — validation test passes with updated assertion 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
cc5ce31836 |
fix(test): disable keep-alive & compression in ingest fetch (#12799)
## Problem CI job **Pipelines-Regression** consistently fails on: > `[chromium] › pipeline-regression.spec.js:73 › should validate scheduled pipeline SQL query with metrics stream type` with `FetchError: Invalid response body … Premature close` on every attempt. PR #12793 added `fetchWithRetry` to handle transient network errors, but the underlying cause — **node-fetch v2 keep-alive pooling + gzip decompression** — can survive retries when every connection attempt picks up the same dead socket from the pool. ## Root cause `node-fetch` v2 defaults: - `compress: true` → sends `Accept-Encoding: gzip` and pipes response through `Gunzip` - Implicit HTTP agent with `keepAlive: true` → reuses connections across requests When the server closes a pooled connection before the response body is fully read, `Gunzip` throws "Premature close." Because the bad connection stays in the pool, retries can hit the same socket and fail identically. ## Fix - Use `keepAlive: false` agent → every fetch gets a fresh connection - Set `compress: false` → bypass the `Gunzip` stream where the error originates - Keep the retry wrapper as a safety net for any remaining transient faults ## Test plan - [ ] CI: `Pipelines-Regression` job passes (especially the metrics stream type test) - [ ] Full `pipeline-regression.spec.js` suite passes locally 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> |
||
|
|
ec68ea02d7 |
test: retry transient ingestion fetch errors in pipeline regression (#12793)
## Problem The **Pipelines-Regression** CI job was failing on the P0 test: > `[chromium] › RegressionSet/Pipelines/pipeline-regression.spec.js:73 › should validate scheduled pipeline SQL query with metrics stream type` Failure (all 4 attempts): ``` FetchError: Invalid response body while trying to fetch http://localhost:5080/api/default/ingest/metrics/_json: Premature close ``` The error originates in `beforeEach`, inside `pipelinesPage.ingestMetricsData()`. In the same setup, the global log ingestion, trace ingestion, and RUM ingestion all succeeded — only the metrics ingestion `fetch` threw. ## Root cause `Premature close` / `ECONNRESET` / `socket hang up` are **transient** `node-fetch` errors that happen when the server closes a keep-alive socket before the response body is fully read. They are not real ingestion failures. Because the throw happens in the `beforeEach` of a **serial** describe block, a single flaky socket error fails the whole suite. There was no retry on any of the ingestion `fetch` calls in `pipelinesPage.js`. ## Fix Add a small `fetchWithRetry()` helper and use it for the three ingestion calls (metrics, traces, bulk). It retries (with linear backoff) **only** on transient network errors; real HTTP failures (non-2xx) are untouched and still throw immediately. ## Verification Ran locally against `localhost:5080`: - Failing P0 test in isolation — **passed** (36.9s) - Full `pipeline-regression.spec.js` suite — **7 passed** (3.4m) ## Notes - Only `tests/ui-testing/pages/pipelinesPages/pipelinesPage.js` is changed. - The transient socket flake can't be reproduced against a healthy local server; the local runs confirm the retry wrapper is transparent on success (no regression). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
8b3bd75783 |
fix: ux revamp form validation migration v1 (#12747)
- Form with zod validation migration for dashboards , getstarted , createdestination(pipeline) , addregexpattern --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> |
||
|
|
50ff6fcbe6 |
fix: left nav menu (#12776)
Co-authored-by: ktx-vaidehi <vaidehi.akhani@kiara.tech> |
||
|
|
7d3e67903e |
ci: add single_node_opt matrix mode to query agent tests (#12756)
## Summary - Adds a matrix strategy to the query agent SQL regression suite jobs in both `api-testing.yml` and `query-agent.yml` - Each job now runs with `ZO_FEATURE_SINGLE_NODE_OPTIMIZE_ENABLED=false` and `ZO_FEATURE_SINGLE_NODE_OPTIMIZE_ENABLED=true` - Verifies both DataFusion physical optimizer paths produce identical query results - Matrix legs run in parallel with `fail-fast: false` - All artifact/log names include the matrix label to avoid collisions ## Test plan - [ ] PR CI shows two `api_query_agent` matrix legs (single_node_opt_false and single_node_opt_true), both pass - [ ] `/query-agent` PR comment triggers both modes and posts per-mode results comments 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> |