Commit Graph
974 Commits
Author SHA1 Message Date
ktx-mihirandAbhay Padamani 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>
2026-07-13 12:03:24 +00:00
ktx-mihirandAbhay Padamani 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>
2026-07-13 11:38:38 +00:00
Subhra264 13c0c77703 feat: sso user blocklist (#13119)
Design at: security/domain-management
2026-07-13 08:01:02 +00:00
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>
2026-07-10 10:12:34 +00:00
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>
2026-07-09 06:59:45 +00:00
ktx-mihirandAbhay Padamani 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>
2026-07-08 11:32:35 +00:00
ktx-akshay 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 |
2026-07-08 09:47:08 +00:00
Ashish Kolhe 37a92fa87b chore: service graph fixes (#13070) 2026-07-08 05:49:13 +00:00
dependabot[bot]andHengfei Yang 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 />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=esbuild&package-manager=npm_and_yarn&previous-version=0.24.2&new-version=0.28.1)](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>
2026-07-07 11:59:23 +00:00
ktx-akshay 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`
2026-07-07 11:16:10 +00:00
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>
2026-07-07 10:54:32 +00:00
BhargavandClaude Opus 4.8 2a3416ee35 fix: Rum automation (#13064)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 10:09:16 +00:00
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>
2026-07-06 08:51:22 +00:00
Neha PandClaude Opus 4.7 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>
2026-07-03 15:37:05 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-07-03 08:41:01 +00:00
Shrinath RaoandShrinath-O2 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>
2026-07-03 06:22:38 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-07-02 14:40:10 +00:00
Abhay Padamani 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
2026-07-02 11:43:40 +00:00
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>
2026-07-02 07:18:36 +00:00
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>
2026-07-02 06:21:33 +00:00
Neha PandClaude Opus 4.7 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>
2026-07-01 14:46:20 +00:00
Ashish Kolhe 9cf5cbbbb4 chore: IAM roles & group ux fixes (#12958) 2026-07-01 10:34:15 +00:00
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>
2026-07-01 08:43:00 +00:00
Neha PandClaude Opus 4.7 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>
2026-07-01 05:24:27 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-30 16:26:30 +00:00
Ashish Kolheandgithub-actions[bot] 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>
2026-06-30 11:23:45 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-29 16:31:34 +00:00
Ashish Kolhe 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.
2026-06-29 12:15:05 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-27 20:10:14 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-26 13:24:28 +00:00
BhargavandClaude Opus 4.8 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>
2026-06-26 12:12:32 +00:00
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>
2026-06-26 11:28:00 +00:00
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>
2026-06-26 10:31:30 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-26 06:40:30 +00:00
Neha PandClaude Sonnet 4.6 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>
2026-06-26 04:51:52 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-26 02:33:47 +00:00
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>
2026-06-25 14:13:33 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-24 14:36:41 +00:00
Neha PandClaude Opus 4.7 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>
2026-06-24 14:24:11 +00:00
Abhay Padamaniandgithub-actions[bot] 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>
2026-06-24 11:37:06 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-24 02:05:32 +00:00
Shrinath Raoandgithub-actions[bot] 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>
2026-06-23 15:07:23 +00:00
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>
2026-06-23 11:57:02 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-22 13:47:10 +00:00
Neha PandClaude Sonnet 4.6 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>
2026-06-22 08:38:02 +00:00
Neha PandClaude Opus 4.7 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>
2026-06-22 06:57:08 +00:00
Shrinath RaoandClaude Opus 4.8 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>
2026-06-21 06:49:22 +00:00
ktx-mihirandgithub-actions[bot] 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>
2026-06-19 11:30:27 +00:00
ktx-kirtanandktx-vaidehi 50ff6fcbe6 fix: left nav menu (#12776)
Co-authored-by: ktx-vaidehi <vaidehi.akhani@kiara.tech>
2026-06-19 10:51:26 +00:00
Neha PandClaude Opus 4.7 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>
2026-06-18 14:16:31 +00:00