Commit Graph
205 Commits
Author SHA1 Message Date
Shrinath RaoandClaude Opus 4.7 284442c9f0 test: add dedicated playwright regression workflow (#11669)
## Summary
- Split regression tests out of main `playwright.yml` into a dedicated
`playwright_regression.yml` workflow
- Regression tests now run with **one shard per spec** for maximum
parallelism
- Removed `RegressionSet` shard from main `playwright.yml`

## Schedule
- Auto-triggers every 4 hours starting from 9 AM IST (3:30, 7:30, 11:30,
15:30, 19:30, 23:30 UTC)
- Manual trigger via `workflow_dispatch` on any branch (always runs on
localhost)

## Test Plan
- [ ] Confirm `playwright_regression.yml` appears in Actions tab
- [ ] Trigger a manual run to verify all 10 regression specs run in
parallel
- [ ] Verify `playwright.yml` no longer includes RegressionSet shard

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 06:34:44 +00:00
ktx-akshay 5d86357fdd test: add regression tests for same-dashboard drilldown-URL clobbering (#11661) 2026-05-08 05:42:40 +00:00
Shrinath RaoandClaude Opus 4.7 3faa3d2ecc test: skip TestDino upload and cache on green runs (#11668)
## Summary
- Skip TestDino "Cache test failures" and "Upload to TestDino" steps
when all tests pass
- Both steps now gate on `needs.ui_integration_tests.result ==
'failure'` so they only run when at least one test shard failed
- The retry mechanism (`tdpw last-failed`) is unaffected — when there
are failures the cache step still runs, and the re-run flow works as
before

## Why
TestDino bills per test case uploaded. Running both steps on green
builds wastes quota with zero value since the user only uses TestDino
for failure analysis.

## Changes
- `merge_and_upload_reports` job: "Cache test failures" step condition
changed from `always()` to `needs.ui_integration_tests.result ==
'failure'`
- `merge_and_upload_reports` job: "Upload to TestDino" step condition
changed from `(success() || failure())` to
`needs.ui_integration_tests.result == 'failure'`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-07 17:19:08 +00:00
Neha PandClaude Opus 4.7 c41779f779 test: add alerts stream-switching regression tests for 5 canvas/graph bugs (#11651)
## Summary

- Adds 18 new POM methods to `alertsPage.js` for stream-type/query-mode
coherence verification, chart state assertions, query editor
interaction, and aggregation field filtering
- Adds 5 helper methods to `alertCreationWizard.js` for full editor
open/close, stream switching, and query execution
- Adds new regression spec `alerts-stream-switching-regression.spec.js`
covering 5 closed bugs:

| Bug | Description |
|-----|-------------|
| #11580 | Metrics+PromQL -> Logs, PromQL editor persists |
| #11572 | Logs -> Metrics -> Logs, chart error "No field named value" |
| #11571 | Builder -> SQL, chart blank table instead of line |
| #11573 | Full editor open/close blanks the graph |
| #11578 | Agg functions don't filter to integer fields |

## Test plan

- [ ] Run `alerts-stream-switching-regression.spec.js` against dev
environment
- [ ] All 5 tests pass with no raw selectors in spec (POM-compliant)
- [ ] Chart assertions verify canvas child exists (not just bounding
box)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-07 14:46:49 +00:00
ktx-kirtan 7316ae311f chore: enhance frontend linting and build process (#11643) 2026-05-07 06:00:29 +00:00
Harsh Mahajan f29102fd9d fix: ubi-30 to ubi-16 (#11621) 2026-05-06 17:17:37 +05:30
Abhay Padamani 511eccf363 fix: correct field access order for CSV download in TableRenderer (#11591)
- #11574
2026-05-04 12:22:01 +00:00
Harsh MahajanandShrinath Rao ce80448cb8 ci: parallel frontend+binary build, remove coverage reporting (#11470)
Build frontend and Rust binary in parallel using /tmp/dist trick
Remove VITE_COVERAGE/COVERAGE env vars and coverage instrumentation
Remove generate_coverage_report job and all nyc upload/report steps
Rename artifact debug-binary → release-ci-binary, add frontend-dist
artifact
Update playwright_summary needs to drop generate_coverage_report

---------

Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2026-04-28 09:54:30 +00:00
Shrinath RaoandClaude Sonnet 4.6 cb4c799476 ci: make merge-reports-to-TestDino non-blocking for playwright_summary (#11457)
## Summary

- In `playwright_summary`, `merge_and_upload_reports` result of
`failure` is now treated as non-blocking (same as `success`/`skipped`)
- The Playwright summary check will pass even if the TestDino
merge/upload job fails (e.g. network issues, bad token, API outage)
- Actual test results (`build_binary`, `ui_integration_tests`) still
gate the summary as before

## Why

The TestDino upload is observability/reporting infrastructure — it
should never cause a PR's required check to fail when the tests
themselves passed. Previously a transient TestDino failure would block
merges.

## Test plan

- [ ] Verify `playwright_summary` passes when `merge_and_upload_reports`
succeeds (existing behavior)
- [ ] Verify `playwright_summary` passes when `merge_and_upload_reports`
fails (new behavior)
- [ ] Verify `playwright_summary` still fails when
`ui_integration_tests` fails (unchanged)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 12:22:27 +00:00
udev 1bfbb70a62 chore: improve ci rust build cache (#11426) 2026-04-25 03:57:30 +00:00
ktx-vaidehi 4a6bb5326b fix: dashboard table chart copy cell format (#11357) 2026-04-21 12:04:14 +00:00
32009bd2a5 feat: dashboard auto complete suggestion for sql (#11251)
Design at:
https://github.com/openobserve/designs/blob/main/dashboards/sql-autocomplete/design.md

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: undefined <undefined@users.noreply.github.com>
2026-04-21 09:36:06 +00:00
1337a04058 fix: alert revamp version 3 (#11253)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Bhargav <BJP232004@GMAIL.COM>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 13:15:39 +05:30
85d261b5d0 fix: vulnerability scan fixes (#11249)
| # | Severity | Category | File |
| :--- | :--- | :--- | :--- |
| 1 | **High** | SSRF bypass (IPv6) | `ssrf_guard.rs` |
| 2 | **High** | SSRF bypass (retry) | `enrichment_table/mod.rs` |
| 3 | **High** | SSRF defense-in-depth | `alert.rs` |
| 4 | **Critical** | CORS + credentials | `router/mod.rs` |
| 5 | **Critical** | SQL Injection | `postgres.rs`, `sqlite.rs` |
| 6 | **High** | Privilege escalation (token) | `users.rs` |
| 7 | **Medium** | Panic/DoS | `users.rs` |
| 8 | **Low** | Integer overflow | `alerts/mod.rs` |
| 9 | **Medium** | XSS | `alertSummaryGenerator.ts`, `colorizeQuery.ts`
|
| 10 | **Medium** | Credential exposure in logs | `validator.rs`,
`organization.rs`, `users.rs` |

---------

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
Co-authored-by: Prabhat Sharma <hi.prabhat@gmail.com>
2026-04-14 07:22:11 +00:00
ktx-vaidehi 85c3fd4eda fix: dashboard promql autocomplete (#11233) 2026-04-13 06:59:27 +00:00
Neha PandClaude ed5eca54fb test: tests for bug fixes (#11178)
https://github.com/openobserve/openobserve/issues/11174

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-04-09 13:28:54 +00:00
Abhay Padamani 5b71a27729 fix: cross link issue with multi stream (#11200) (#11214)
fix #11200
2026-04-09 10:04:18 +00:00
7552a57377 feat: replace variable value with mustache (#11085)
Design at:
https://github.com/openobserve/designs/tree/main/dashboards/mustache-migration

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abhay Padamani <undefined@users.noreply.github.com>
Co-authored-by: omkark06 <omkar@zinclabs.io>
2026-04-09 08:25:30 +00:00
Abhay Padamani 981e3a3d48 fix: metric chart render issue with camelcase alias (#11118) 2026-04-02 10:05:17 +00:00
udev 0c050cfbbf ci: add merge_group trigger to CI workflows for merge queue support (#11105)
Add merge_group event trigger to all required CI workflows so they run
when PRs enter the merge queue. Fix github.event.pull_request references
in dispatch-event-enterprise.yml to handle merge_group context.
2026-04-01 14:03:37 +05:30
udev ed4e476b48 fix: npm ci axios version (#11090)
- **fix: grpc use native/webpki trust store**
- **use enum to parse values**
- **cargo fmt**
- **fix: pin axios versions in CI**
2026-03-31 15:03:58 +05:30
258eecd447 test: add E2E tests for autocomplete value suggestions feature (#11027)
Add Playwright E2E tests for the new autocomplete value suggestions
feature that persists field values in IndexedDB and shows them when
typing `field =`.

Tests cover:
- IndexedDB capture from field expansion (Values API)
- IndexedDB capture from search results (marked as expected-to-fail due
to bug)
- Autocomplete suggestions for operators: =, !=, <>, >=, <=, IN, NOT IN,
LIKE
- Numeric value quoting (no quotes for numbers)
- TTL expiry filtering
- Stream/org isolation
- Traces page autocomplete

Note: One test marked as expected-to-fail due to BLOCKER BUG where
captureFromSearchHits() doesn't write to IndexedDB (schemaFields
filtering issue)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Neha P <undefined@users.noreply.github.com>
2026-03-27 12:02:07 +05:30
ktx-akshayandAbhay Padamani 9abc043b0b test: add E2E tests for dashboard table chart core features (#11004)
Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com>
2026-03-26 16:23:35 +05:30
Harsh Mahajan efeaac2c0c fix: changing ubicloud-16 to ubicloud-30 (#11011)
fix: playwright build failure
2026-03-24 17:37:53 +05:30
ktx-akshay 097c4af1e4 test: add E2E test coverage for pie and donut charts in dashboard (#10998) 2026-03-23 18:41:22 +05:30
ktx-akshay 7d1aea9578 test: add automation coverage for PromQL builder in metrics (#10932)
…mplement associated tests
2026-03-20 15:52:04 +05:30
1a6a53a0ed feat: pivot table support on dashboard (#10774)
Design at:
https://github.com/openobserve/designs/tree/main/dashboards/dashboard-pivot-table-support

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abhay Padamani <undefined@users.noreply.github.com>
2026-03-18 17:12:17 +05:30
ktx-vaidehiandclaude[bot] a6dbcbe183 test: dashboard config panel (#10903)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
2026-03-17 13:14:14 +05:30
ktx-akshayandclaude[bot] 230bfbbacd test: add test cases for cross-linking between dashboards and logs page (#10797)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
2026-03-16 15:24:03 +05:30
ktx-akshay ee9c0f5b8b test: add test cases for dashboard series color in multi-window (#10861) 2026-03-12 10:32:14 +08:00
ktx-akshay 84c72f98b9 test: add automation coverage for Sankey chart visualization (#10761) 2026-03-06 12:18:07 +05:30
Neha PandClaude af77744583 test: add vrl testcases under alerts (#10747)
Co-authored-by: Claude <noreply@anthropic.com>
2026-03-05 12:49:25 +05:30
ktx-akshayandclaude[bot] 66c618e331 test: add test cases for creating alert from dashboard chart (#10669)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
2026-03-02 15:30:47 +05:30
0ee7535da7 feat: dashboard time range available at panel level (#10288)
Design at:
https://github.com/openobserve/designs/blob/main/dashboards/panel-level-time-range/design.md

### **PR Type**
Enhancement, Documentation


___

### **Description**
- Add defaults for panel-level time settings in front-end

- Extend backend PanelConfig with time range fields

- Provide a comprehensive implementation guide document


___



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>useDashboardPanel.ts</strong><dd><code>Add default
panel time settings fields</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

web/src/composables/useDashboardPanel.ts

<ul><li>Added <code>allow_panel_time</code> default (false)<br> <li>
Introduced <code>panel_time_mode</code> default ("individual")<br> <li>
Initialized <code>panel_time_range</code> to null</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10288/files#diff-fbba1700750053b9eaf38ddd30dab84531bc44131c795ebb713811e4930cd7cb">+3/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td>
    <details>
<summary><strong>mod.rs</strong><dd><code>Extend PanelConfig with time
fields</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

src/config/src/meta/dashboards/v8/mod.rs

<ul><li>Added <code>allow_panel_time: Option<bool></code> to
PanelConfig<br> <li> Added <code>panel_time_mode: Option<String></code>
field<br> <li> Added <code>panel_time_range:
Option<DateTimeOptions></code> field</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10288/files#diff-cbf3fe971525ba58892400391dfd7dac7e43d6049d6b4f5a9840ad104ebc5e08">+12/-0</a>&nbsp;
&nbsp; </td>

</tr>
</table></td></tr><tr><td><strong>Documentation</strong></td><td><table>
<tr>
  <td>
    <details>

<summary><strong>PANEL_TIME_RANGE_IMPLEMENTATION.md</strong><dd><code>Add
panel time range implementation guide</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></summary>
<hr>

web/src/components/dashboards/PANEL_TIME_RANGE_IMPLEMENTATION.md

<ul><li>Added detailed implementation guide (v3.0)<br> <li> Outlined
requirements, UI, URL sync, testing<br> <li> Documented data flow, edge
cases, and timeline</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10288/files#diff-39b68cc51ce3089b41061b75e18c45448659cab57702dd39b01a9aad63598345">+2718/-0</a></td>

</tr>
</table></td></tr></tr></tbody></table>

</details>

___

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: ktx-akshay <akshay.patil@kiara.tech>
2026-02-26 00:58:02 +05:30
ktx-vaidehiandYashodhan Joshi ae6d73e815 feat: dashboard stream and field support from variables (#10454)
Design at:
https://github.com/openobserve/designs/blob/main/dashboards/variables-stream-field-support/design.md
### **PR Type**
Enhancement, Tests


___

### **Description**
- Add stream/field variable dependency parsing

- Deduplicate and validate dependency graph edges

- Resolve stream/field variables at runtime

- Update variable UI with autocomplete


___

### Diagram Walkthrough


```mermaid
flowchart LR
  ui["AddSettingVariable.vue (configure stream/field)"]
  runtime["VariablesValueSelector.vue (resolve & query)"]
  deps["variablesDependencyUtils.ts (dependency graphs)"]
  tests["variablesDependencyUtils.spec.ts (new coverage)"]

  ui -- "allows $var in stream/field" --> runtime
  ui -- "cycle detection messaging" --> deps
  runtime -- "uses resolved stream/field" --> deps
  tests -- "asserts stream/field deps & cycles" --> deps
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>variablesDependencyUtils.spec.ts</strong><dd><code>Add
tests for stream/field dependencies</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

web/src/utils/dashboard/variables/variablesDependencyUtils.spec.ts

<ul><li>Add cases for <code>query_data.stream</code> dependencies<br>
<li> Add cases for <code>query_data.field</code> dependencies<br> <li>
Validate deduping and embedded variables<br> <li> Add cycle detection
scenarios via stream/field</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10454/files#diff-1a8fd83eb7a8b0c906e668e7e4120a40f7b9853d5bfb485a7c569ff980e4a780">+313/-0</a>&nbsp;
</td>

</tr>
</table></td></tr><tr><td><strong>Enhancement</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>variablesDependencyUtils.ts</strong><dd><code>Expand
dependency detection to stream/field</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></summary>
<hr>

web/src/utils/dashboard/variables/variablesDependencyUtils.ts

<ul><li>Collect deps from stream, field, filters<br> <li> Use
<code>Set</code> to prevent duplicate parents<br> <li> Extend
<code>query_data</code> typing with
<code>stream</code>/<code>field</code><br> <li> Update scoped graph with
deduped edges</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10454/files#diff-58a77094b6971705fb63bde853a79e17b4e2e85240694c4017aada1d01cf1fb4">+78/-31</a>&nbsp;
</td>

</tr>

<tr>
  <td>
    <details>
<summary><strong>VariablesValueSelector.vue</strong><dd><code>Resolve
stream/field variables before querying</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

web/src/components/dashboards/VariablesValueSelector.vue

<ul><li>Add <code>resolveVariableValue()</code> for <code>$var</code>
substitution<br> <li> Resolve
<code>stream_name</code>/<code>fields</code> in request payload<br> <li>
Match response hits using resolved field name<br> <li> Add debug/error
console logging for resolution</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10454/files#diff-5c6e3bcb87cb64f25bf8157a541604b7a4904c1282acf662cab5d76a5be6bd56">+55/-3</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td>
    <details>
<summary><strong>AddSettingVariable.vue</strong><dd><code>Allow
variable-based stream and field selection</code>&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

web/src/components/dashboards/settings/AddSettingVariable.vue

<ul><li>Replace stream/field <code>q-select</code> with
<code>CommonAutoComplete</code><br> <li> Merge variable options into
stream/field option lists<br> <li> Skip schema fetch when stream
contains <code>$</code><br> <li> Improve cycle error message and
styling</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10454/files#diff-e622f54c1f7629ee67d29ed2fc87008d07eb9246767a05435cc42c3c17ce459a">+208/-52</a></td>

</tr>
</table></td></tr></tr></tbody></table>

</details>

___

---------

Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com>
Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com>
2026-02-25 23:49:40 +05:30
ktx-akshay bb7103930a test: add test cases for dashboard share URL (#10560) 2026-02-25 17:24:37 +05:30
25c0fe6382 feat: query builder support on logs page (#10305)
- #10446 



Design at :
https://github.com/openobserve/designs/tree/main/auto-query-builder-on-logs-page


# Logs Query Builder - Behavior Guide

What happens in different scenarios when using the Build tab.

---

## Switching to Build Tab - Scenarios

### Scenario 1: No Query, SQL Mode OFF

**Starting state:**
- Query editor is empty
- SQL Mode is OFF
- Stream "default" is selected

**What happens when you click Build:**
1. SQL Mode turns ON automatically
2. Query is generated: `SELECT * FROM "default"`
3. Quick Mode turns ON (if enabled in config)
4. Build tab opens in **Custom SQL Mode** 
5. Chart type: **Table** (with dynamic columns = true)

---

### Scenario 2: No Query, SQL Mode ON

**Starting state:**
- Query editor is empty
- SQL Mode is ON
- Stream "default" is selected

**What happens when you click Build:**
1. Query is generated: `SELECT * FROM "default"`
2. Build tab opens in **Builder Mode**
3. Chart type: **Line** (default)

---

### Scenario 3: Simple SELECT * Query

**Starting state:**
- Query: `SELECT * FROM "logs"`
- SQL Mode is ON

**What happens when you click Build:**
1. Query is parsed but no explicit fields found (`*` = all columns)
2. Build tab opens in **Custom SQL Mode**
3. Chart type: **Table** (with dynamic columns)
4. Quick Mode turns ON (SELECT * pattern detected)
5. Query editor is **editable**

---

### Scenario 4: Histogram Query (Time Series)

**Starting state:**
- Query: `SELECT histogram(_timestamp) as time, count(*) as count FROM
"logs" GROUP BY time`
- SQL Mode is ON

**What happens when you click Build:**
1. Query is parsed successfully
2. Build tab opens in **Builder Mode**
3. Chart type: **Bar** (default chart type)
4. Fields populated: X-axis = histogram, Y-axis = count

---

### Scenario 5: Count Only Query (No Grouping)

**Starting state:**
- Query: `SELECT count(*) as total FROM "logs"`
- SQL Mode is ON

**What happens when you click Build:**
1. Query is parsed successfully
2. Build tab opens in **Builder Mode**
3. Chart type: **Metric** (big number display - only Y-axis, no X-axis)

---

### Scenario 6: Query with 3+ GROUP BY Fields

**Starting state:**
- Query: `SELECT status, method, host, count(*) FROM "logs" GROUP BY
status, method, host`
- SQL Mode is ON

**What happens when you click Build:**
1. Query is parsed successfully
2. Build tab opens in **Builder Mode**
3. Chart type: **Table** (too many grouping fields for chart)

---

### Scenario 7: Simple JOIN Query

**Starting state:**
- Query: `SELECT a.field, b.field FROM "stream1" a JOIN "stream2" b ON
a.id = b.id`
- SQL Mode is ON

**What happens when you click Build:**
1. Query is parsed successfully
2. Build tab opens in **Builder Mode**
3. Chart type: **Bar** (default)
4. JOIN is recognized and shown in builder

---

### Scenario 8: Nested JOIN Query

**Starting state:**
- Query: `SELECT * FROM "a" JOIN ("b" JOIN "c" ON b.x = c.x) ON a.y =
b.y`
- SQL Mode is ON

**What happens when you click Build:**
1. **Complex pattern detected** (nested JOIN with parentheses)
2. Build tab opens in **Custom SQL Mode**
3. Chart type: **Table** (with dynamic columns)
4. Query editor is **editable**
5. Field selectors are **hidden**

---

### Scenario 9: CTE Query (WITH clause)

**Starting state:**
- Query: `WITH recent AS (SELECT * FROM "logs" WHERE _timestamp > now()
- interval '1 hour') SELECT * FROM recent`
- SQL Mode is ON

**What happens when you click Build:**
1. **Complex pattern detected** (CTE)
2. Build tab opens in **Custom SQL Mode**
3. Chart type: **Table** (with dynamic columns)
4. Query editor is **editable**

---

### Scenario 10: Subquery

**Starting state:**
- Query: `SELECT * FROM (SELECT status, count(*) FROM "logs" GROUP BY
status) subq`
- SQL Mode is ON

**What happens when you click Build:**
1. **Complex pattern detected** (subquery)
2. Build tab opens in **Custom SQL Mode**
3. Chart type: **Table** (with dynamic columns)

---

### Scenario 11: UNION Query

**Starting state:**
- Query: `SELECT * FROM "logs1" UNION SELECT * FROM "logs2"`
- SQL Mode is ON

**What happens when you click Build:**
1. **Complex pattern detected** (UNION)
2. Build tab opens in **Custom SQL Mode**
3. Chart type: **Table** (with dynamic columns)

---

### Scenario 12: Window Function Query

**Starting state:**
- Query: `SELECT *, ROW_NUMBER() OVER (PARTITION BY status ORDER BY
_timestamp) FROM "logs"`
- SQL Mode is ON

**What happens when you click Build:**
1. **Complex pattern detected** (window function)
2. Build tab opens in **Custom SQL Mode**
3. Chart type: **Table** (with dynamic columns)

---

### Scenario 13: Nested Function Query

**Starting state:**
- Query: `SELECT ceil(count(*)) as rounded_count FROM "logs"`
- SQL Mode is ON

**What happens when you click Build:**
1. **Complex pattern detected** (nested function - function inside
function)
2. Build tab opens in **Custom SQL Mode**
3. Chart type: **Table** (with dynamic columns)

---

### Scenario 14: JSON Operations Query

**Starting state:**
- Query: `SELECT data->>'name' as name FROM "logs"`
- SQL Mode is ON

**What happens when you click Build:**
1. **Complex pattern detected** (JSON operator)
2. Build tab opens in **Custom SQL Mode**
3. Chart type: **Table** (with dynamic columns)

---

### Scenario 15: CASE/WHEN Query

**Starting state:**
- Query: `SELECT CASE WHEN status >= 500 THEN 'error' ELSE 'ok' END as
status_type, count(*) FROM "logs" GROUP BY status_type`
- SQL Mode is ON

**What happens when you click Build:**
1. Query is parsed successfully (CASE/WHEN is supported)
2. Build tab opens in **Builder Mode**
3. Chart type: **Bar** (default)
4. CASE/WHEN shown as "raw" field type

---

### Scenario 16: Multiple JOINs (Flat)

**Starting state:**
- Query: `SELECT a.field as "field1", b.field as "field2" FROM "a" INNER
JOIN "b" AS stream_0 ON a.x = b.x INNER JOIN "c" AS stream_1 ON b.y =
c.y GROUP BY field1, field2 ORDER BY field1 ASC`
- SQL Mode is ON

**What happens when you click Build:**
1. Query is parsed successfully (flat JOINs are supported)
2. Build tab opens in **Builder Mode**
3. Chart type: **Bar** (default)

---

### Scenario 17: Opening Shared Link (First Time)

**Starting state:**
- URL contains `build_data` parameter with chart type "bar"
- Query in URL: `SELECT status, count(*) FROM "logs" GROUP BY status`

**What happens:**
1. Build tab opens
2. Query is parsed successfully
3. Chart type: **Bar** (restored from URL - first toggle)
4. Build tab opens in **Builder Mode**

---

### Scenario 18: Switching Back to Build Tab (After First Time)

**Starting state:**
- Previously visited Build tab
- URL still has `build_data` with chart type "bar"
- Query: `SELECT count(*) FROM "logs"` (metric query)

**What happens:**
1. Build tab opens
2. Query is parsed successfully
3. Chart type: **Metric** (auto-selected, URL ignored on subsequent
toggles)

---

### Scenario 19: Invalid SQL Syntax

**Starting state:**
- Query: `SELEC * FORM "logs"` (typos)
- SQL Mode is ON

**What happens when you click Build:**
1. **Parse error** (invalid SQL)
2. Build tab opens in **Custom SQL Mode**
3. Chart type: **Table** (with dynamic columns)
4. Query editor is **editable** (so user can fix the query)

---

### Scenario 20: Query with WHERE Filters

**Starting state:**
- Query: `SELECT histogram(_timestamp), count(*) FROM "logs" WHERE
status = 500 AND method = 'GET' GROUP BY 1`
- SQL Mode is ON

**What happens when you click Build:**
1. Query is parsed successfully
2. Build tab opens in **Builder Mode**
3. Chart type: **Bar** (default)
4. Filters populated in filter section

---

## Summary Table

| Query Type | Mode | Chart Type |
|------------|------|------------|
| SELECT * | **Custom** | **Table** |
| Histogram + count | Builder | Bar |
| Count only (no GROUP BY) | Builder | Metric |
| 1-2 GROUP BY fields | Builder | Bar |
| 3+ GROUP BY fields | Builder | Table |
| Simple JOIN | Builder | Bar |
| CASE/WHEN | Builder | Bar |
| Multiple flat JOINs | Builder | Bar |
| CTE (WITH clause) | **Custom** | **Table** |
| Subquery | **Custom** | **Table** |
| Nested JOIN | **Custom** | **Table** |
| UNION/INTERSECT/EXCEPT | **Custom** | **Table** |
| Window functions | **Custom** | **Table** |
| Nested functions | **Custom** | **Table** |
| JSON operations | **Custom** | **Table** |
| Invalid SQL | **Custom** | **Table** |

---

## Quick Mode Auto-Enable

Quick Mode is automatically enabled when switching to Build tab if:

| Condition | Quick Mode |
|-----------|------------|
| SQL Mode was OFF | ✅ Enabled |
| Query is `SELECT * FROM ...` | ✅ Enabled |
| Complex aggregation query | ❌ Not changed |

**Requires:** `quick_mode_enabled = true` in config

---

## SQL Mode Auto-Enable

| Starting State | After Clicking Build |
|----------------|---------------------|
| SQL Mode OFF | SQL Mode **ON** |
| SQL Mode ON | SQL Mode ON (no change) |

**Build tab always requires SQL Mode to be ON.**

---

## Chart Type Priority

When auto-selecting chart type:

1. **Custom Mode?** → Table
2. **3+ GROUP BY fields?** → Table
3. **Only Y-axis (no X, no breakdown)?** → Metric
4. **Everything else** → Bar (default)

**Exception:** First visit with shared link uses chart type from URL.

---

## Builder Mode vs Custom Mode

| Aspect | Builder Mode | Custom Mode |
|--------|--------------|-------------|
| Query Editor | Read-only | Editable |
| Field Selectors | Visible | Hidden |
| When Used | Parseable queries | Complex/unparseable queries |
| Default Chart | Bar/Metric | Table |

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: ktx-akshay <akshay.patil@kiara.tech>
2026-02-23 16:54:15 +05:30
e5fcaf6813 test: add E2E tests for Analyze Dimensions feature (Logs & Traces) (#10280)
## Summary
- Added comprehensive E2E Playwright tests for the Analyze Dimensions
feature
- Tests cover both Logs and Traces pages
- All tests pass without skipping

### Logs Tests (6 tests)
- P0: Analyze button visible when search results exist
- P0: Analyze button opens analysis dashboard
- P1: Analysis dashboard close button works
- P1: Dimension selector dialog opens in analysis dashboard
- P2: Analyze button hidden in SQL mode
- P2: Analyze button hidden when no search results

### Traces Tests (10 tests)
- P0: Metrics dashboard visible with trace results
- P0: Error only toggle filters trace results
- P0: Analyze button hidden without brush selection
- P1: Range filter chip behavior after brush selection attempt
- P1: Analysis dashboard opens when analyze button is available
- P1: Analysis dashboard close button functionality
- P1: Analysis dashboard has tabs for Volume, Latency, and Error
- P1: Switch between Volume, Latency and Error tabs
- P2: Dimension selector in analysis dashboard
- P2: Filter chip removal functionality

### Implementation Details
- Added Analyze Dimensions selectors and methods to logsPage.js and
tracesPage.js
- Enhanced brush selection method with multiple fallback approaches
- Tests are designed to pass even when brush selection doesn't trigger
(verifies baseline state)
- Added tab navigation methods for Volume, Latency, and Error tabs

## Test plan
- [x] Run logs analyze dimensions tests: `npx playwright test
playwright-tests/Logs/logsAnalyzeDimensions.spec.js`
- [x] Run traces analyze dimensions tests: `npx playwright test
playwright-tests/Traces/tracesAnalyzeDimensions.spec.js`
- [x] All 16 tests pass

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2026-02-19 16:34:33 +08:00
605e00768e test: E2E tests for pipeline traces, metrics, backfill & history (#10158)
## Summary

Adds and fixes E2E Playwright tests for the Pipelines feature covering
**traces**, **metrics**, **backfill jobs**, and **execution history**
pages.

### Test Coverage
| Spec File | Tests | Status |
|-----------|-------|--------|
| pipeline-traces.spec.js | 9 | All passing |
| pipeline-metrics.spec.js | 10 | All passing |
| pipeline-backfill.spec.js | 12 | All passing |
| pipeline-history.spec.js | 8 | All passing |
| **Total** | **39** | **39/39 passing** |

### Changes

**Spec Files (4 files)**
- Add unconditional assertions to all tests (fixes 3 critical
conditional-only assertion issues)
- Fix auth pattern in `pipeline-history.spec.js` from LoginPage to
`storageState`
- Refactor traces/metrics specs to use POM helper methods (reduces
duplication)
- Replace raw `afterEach` selectors with `dismissOpenDialogs()` POM
method in all 4 files
- Remove debug screenshot code from traces spec

**Page Object — pipelinesPage.js**
- Add POM helpers: `addSourceStreamNode()`,
`addDestinationStreamNode()`, `savePipelineWithName()`,
`cleanupPipelineByName()`, `dismissOpenDialogs()`
- Fix function node offset (50,50 → 250,200) to prevent vue-flow handle
overlap in edge creation
- Convert `verifyMetricsDestinationStreamExists` /
`verifyTracesDestinationStreamExists` to API-based verification (fixes
false negatives from Streams page type filter defaulting to "logs")
- Add `connectNodesViaMiddleNode` retry logic with Escape key between
connections

**CI Workflow**
- Add `pipeline-backfill.spec.js` and `pipeline-history.spec.js` to
`.github/workflows/playwright.yml`

### Quality Gate
- Sentinel audit: **PASS** — 0 critical issues, 2 warnings (excessive
`waitForTimeout` — non-blocking)
- 0 raw locators in spec files, 0 `console.log`, 0 `expect.soft`, 0
`test.skip`
- All 39 tests have unconditional assertions
- Full POM compliance across all spec files

### Test Execution (Headless, 2026-02-18)
| Spec File | Duration |
|-----------|----------|
| pipeline-backfill + history | 44.1s |
| pipeline-traces | 4.5m |
| pipeline-metrics | 5.4m |

## Test plan
- [x] Run all 39 tests headless — 39/39 passing
- [x] Sentinel audit — PASS verdict
- [x] Consolidation check — no duplicates with existing pipeline tests
- [ ] ENT workflow: Add 4 spec files to enterprise repo CI (separate PR
needed)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2026-02-18 19:48:59 +08:00
ktx-akshay 9ba7437ee6 test: add automation coverage for raw query dashboard save (#10556) 2026-02-18 16:02:22 +05:30
ktx-akshay 3b3cf20c8f test: add test cases for copying dashboard legends and table cells (#10547) 2026-02-17 19:46:12 +05:30
ktx-akshay b55ac4a80a test: add PromQL suggestions tests for dashboard query editor (#10513) 2026-02-16 18:36:19 +05:30
ktx-vaidehiandClaude Sonnet 4.5 bc80d409e6 fix: dashboard support custom type variables as parents in variable dependencies (#10481)
### **User description**
When using custom type variables (custom, constant, textbox) as parent
variables for query_values variables (e.g., using custom variables for
query_values), the dependent children weren't loading on initial page
load.

Root cause:
1. Custom type variables weren't marked as pending during initialization
2. Manager didn't recognize custom types as non-API variables that load
synchronously
3. finalizeVariableLoading wasn't notifying manager on completion

Fixes:
1. Mark custom/constant/textbox variables as pending so they load and
notify the manager
2. Expand non-API type detection to include custom type variables, not
just query_values with custom/all defaults
3. Add manager notification in finalizeVariableLoading, but only on
first load to avoid triggering children on dropdown reopens
4. Pass isInitialLoad to finalizePartialVariableLoading for proper child
loading


___

### **PR Type**
Bug fix


___

### **Description**
- Mark custom-type variables as pending

- Treat non-API parents as preloaded

- Notify manager only on first load

- Pass `isInitialLoad` to partial finalize


___

### Diagram Walkthrough


```mermaid
flowchart LR
  A["Variables initialization"] --> B["Mark non-API variables pending"]
  B --> C["VariablesValueSelector loads values"]
  C --> D["Finalize partial loading (initial-load aware)"]
  D --> E["Notify manager on first load"]
  E --> F["Trigger dependent children loading"]
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Bug
fix</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>useVariablesManager.ts</strong><dd><code>Load non-API
variable types during initialization</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

web/src/composables/dashboard/useVariablesManager.ts

<ul><li>Mark
<code>custom</code>/<code>constant</code>/<code>textbox</code> as
pending<br> <li> Expand “non-API parent” detection logic<br> <li>
Include <code>dynamic_filters</code> as non-API parent<br> <li> Enable
child pending when all parents non-API</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10481/files#diff-95f6bdeb96f8454bdff53bb60cafe6851b0cda450591813dd4dfb2038c4f3d50">+27/-13</a>&nbsp;
</td>

</tr>

<tr>
  <td>
    <details>
<summary><strong>VariablesValueSelector.vue</strong><dd><code>Gate
manager notifications to first load</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

web/src/components/dashboards/VariablesValueSelector.vue

<ul><li>Pass <code>isInitialLoad</code> into
<code>finalizePartialVariableLoading</code><br> <li> Compute
<code>isFirstLoad</code> from partial-loaded state<br> <li> Notify
manager only on initial successful load<br> <li> Avoid triggering
children on dropdown reopen</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10481/files#diff-5c6e3bcb87cb64f25bf8157a541604b7a4904c1282acf662cab5d76a5be6bd56">+17/-2</a>&nbsp;
&nbsp; </td>

</tr>
</table></td></tr></tr></tbody></table>

</details>

___

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-12 15:31:19 +05:30
ktx-akshay 0ee4c54849 test: add VRL support test cases for visualization (#10284)
### **PR Type**
Tests


___

### **Description**
- Add Playwright E2E tests for VRL visualization

- Validate table-only charts when VRL enabled

- Verify VRL fields persist and save correctly

- Include VRL spec in CI workflow runlist


___

### Diagram Walkthrough


```mermaid
flowchart LR
  n1["Playwright VRL visualization spec"] 
  n2["Logs page (VRL toggle/editor)"] 
  n3["Visualize tab (run query)"] 
  n4["Chart type restrictions (table-only)"] 
  n5["Dashboard save/edit verification"] 
  n6["GitHub Actions Playwright workflow"] 
  n1 -- "drives UI checks" --> n2
  n2 -- "executes queries with VRL" --> n3
  n3 -- "enforces" --> n4
  n3 -- "supports" --> n5
  n6 -- "runs" --> n1
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>visualize-vrl.spec.js</strong><dd><code>Add VRL
visualization end-to-end test suite</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></summary>
<hr>

tests/ui-testing/playwright-tests/Dashboards/visualize-vrl.spec.js

<ul><li>Add helper to enable VRL editor toggle<br> <li> Add P1 tests for
VRL editor presence<br> <li> Validate table-only chart restriction with
VRL<br> <li> Verify VRL persistence, dashboard save, and table data</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10284/files#diff-7244cc63aab47869aba30238f88a410504df6de19bed548e495e5de9f166f740">+789/-0</a>&nbsp;
</td>

</tr>
</table></td></tr><tr><td><strong>Configuration
changes</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>playwright.yml</strong><dd><code>Run VRL visualization
spec in CI</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

.github/workflows/playwright.yml

- Add `visualize-vrl.spec.js` to `run_files` list


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10284/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+1/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></td></tr></tr></tbody></table>

</details>

___
2026-02-10 17:34:15 +05:30
ktx-vaidehi 53ba550623 fix: dashboard variables for child, set default value (#10406)
### **PR Type**
Bug fix, Tests


___

### **Description**
- Preserve custom/all defaults on resets

- Mark variables loaded, notify manager

- Pre-set defaults before query loading

- Add Playwright dependency-chain coverage


___

### Diagram Walkthrough


```mermaid
flowchart LR
  parent["Parent variable changes"]
  manager["Variables manager resets children"]
  selector["VariablesValueSelector sync/default logic"]
  defaults["Apply `all`/`custom` default value"]
  notify["Notify manager partial loaded"]
  children["Dependent children load correctly"]
  tests["Playwright chain default tests"]
  parent -- "triggers" --> manager
  manager -- "clears child values" --> selector
  selector -- "sets when configured" --> defaults
  defaults -- "unblocks" --> notify
  notify -- "enables" --> children
  tests -- "verifies" --> children
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Bug
fix</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>VariablesValueSelector.vue</strong><dd><code>Keep
custom/all defaults during dependency resets</code>&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

web/src/components/dashboards/VariablesValueSelector.vue

<ul><li>Detect <code>custom</code>/<code>all</code> default
configuration<br> <li> Set defaults when manager resets value<br> <li>
Mark variable partially loaded and ready<br> <li> Pre-apply defaults
before query load</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10406/files#diff-5c6e3bcb87cb64f25bf8157a541604b7a4904c1282acf662cab5d76a5be6bd56">+96/-7</a>&nbsp;
&nbsp; </td>

</tr>
</table></td></tr><tr><td><strong>Tests</strong></td><td><table>
<tr>
  <td>
    <details>

<summary><strong>dashboard-variables-scoped.js</strong><dd><code>Support
selecting all/custom default in UI</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></summary>
<hr>

tests/ui-testing/pages/dashboardPages/dashboard-variables-scoped.js

<ul><li>Add <code>defaultValueType</code> and <code>customValues</code>
options<br> <li> Toggle default mode to <code>all</code> or
<code>custom</code><br> <li> Fill custom default values for
single/multi<br> <li> Keep legacy <code>defaultValue</code> path</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10406/files#diff-86abb9f90fabd982dedfdd9a21a052a47b6984edc7bd29a51ee104c8c473aec4">+43/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td>
    <details>

<summary><strong>dashboard-variables-default-values-chain.spec.js</strong><dd><code>Add
dependency-chain default values Playwright suite</code>&nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></summary>
<hr>


tests/ui-testing/playwright-tests/Dashboards/dashboard-variables-default-values-chain.spec.js

<ul><li>Test <code>all</code> default survives parent change<br> <li>
Test <code>custom</code> defaults for single/multi<br> <li> Validate
grandchild load with parent defaults<br> <li> Cover full A→B→C→D
dependency chain</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10406/files#diff-2221c8f751dfff03ae4d77245c5b3b881a33c2ffb09e7b7db3052f5f7381bb22">+475/-0</a>&nbsp;
</td>

</tr>
</table></td></tr><tr><td><strong>Configuration
changes</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>playwright.yml</strong><dd><code>Run new dashboard
variables chain spec</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

.github/workflows/playwright.yml

<ul><li>Include
<code>dashboard-variables-default-values-chain.spec.js</code> in run
list</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10406/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+1/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></td></tr></tr></tbody></table>

</details>

___
2026-02-09 15:47:47 +05:30
ecaed3b89f feat: dashboard table chart pagination (#10285)
### **User description**
Design at:
https://github.com/openobserve/designs/blob/main/dashboards/table-chart-pagination/design.md
### **PR Type**
Enhancement


___

### **Description**
- Add pagination flags to dashboard panels

- Initialize pagination defaults in frontend

- Extend backend PanelConfig with pagination


___



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Configuration
changes</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>useDashboardPanel.ts</strong><dd><code>Initialize
pagination settings in panel</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

web/src/composables/useDashboardPanel.ts

<ul><li>Added <code>show_pagination</code> default false<br> <li> Added
<code>rows_per_page</code> default 10</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-fbba1700750053b9eaf38ddd30dab84531bc44131c795ebb713811e4930cd7cb">+2/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></td></tr><tr><td><strong>Enhancement</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>mod.rs</strong><dd><code>Extend PanelConfig with
pagination fields</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></summary>
<hr>

src/config/src/meta/dashboards/v8/mod.rs

<ul><li>Added <code>show_pagination</code> Option<bool> field<br> <li>
Added <code>rows_per_page</code> Option<i64> field</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-cbf3fe971525ba58892400391dfd7dac7e43d6049d6b4f5a9840ad104ebc5e08">+4/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></td></tr></tr></tbody></table>

</details>

___


___

### **PR Type**
Enhancement, Tests


___

### **Description**
- Add table pagination config and defaults

- Implement reusable table pagination controls

- Wire pagination into SQL/PromQL tables

- Add unit and Playwright coverage


___

### Diagram Walkthrough


```mermaid
flowchart LR
  cfgUI["ConfigPanel: pagination toggle + rows input"]
  panelDefaults["useDashboardPanel: default pagination config"]
  tableRenderer["TableRenderer: pagination state + bottom slot"]
  controls["TablePaginationControls: dropdown + nav + count"]
  promql["PromQLTableChart: legend footer + pagination controls"]
  schema["PanelSchemaRenderer: pass pagination props"]
  backend["Backend PanelConfig: persist pagination fields"]
  tests["Unit + Playwright tests"]

  cfgUI -- "writes config" --> panelDefaults
  panelDefaults -- "panel config values" --> schema
  schema -- "props showPagination/rowsPerPage" --> tableRenderer
  tableRenderer -- "renders" --> controls
  promql -- "uses slot scope" --> controls
  backend -- "stores config" --> panelDefaults
  tests -- "verifies behavior" --> tableRenderer
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><details><summary>5
files</summary><table>
<tr>
<td><strong>PromQLTableChart.spec.ts</strong><dd><code>Add unit coverage
for PromQL table pagination</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-9db7fe6fba32c64dabbf0dd05ec6df9a1ddfc89ff4774d0e627d657e016e7674">+551/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>TableRenderer.spec.ts</strong><dd><code>Add pagination
behavior unit tests</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-550a0a669838c47473442a7d37407fead8b7cb2a05121880dd2c0522022c8c3f">+180/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>ConfigPanel.spec.ts</strong><dd><code>Test table pagination
config UI</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-a4e717cd660ad6fa369629f8de524f4d57bf4f71b11d3244ce41b9ed9f0379d2">+203/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>useDashboardPanel.spec.ts</strong><dd><code>Assert default
pagination config initialization</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-5dbd79fdde0cbbb7db569095fa062931286463da0b5e72b1fbe99f56116fa5e2">+24/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>dashboard-table-pagination.spec.js</strong><dd><code>Add E2E
coverage for table pagination</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-ed0804a2639080ec5164324b8e7943b469204243b66b67d85ad8e91cf46bee85">+1180/-0</a></td>

</tr>

</table></details></td></tr><tr><td><strong>Enhancement</strong></td><td><details><summary>8
files</summary><table>
<tr>
<td><strong>useDashboardPanel.ts</strong><dd><code>Initialize default
table pagination config fields</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-fbba1700750053b9eaf38ddd30dab84531bc44131c795ebb713811e4930cd7cb">+2/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>constants.ts</strong><dd><code>Add default rows-per-page
constant</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-a5e1b14a291a4b42368faa0160f555b19bdc1a542624d4f89ea6e3ed7c4a664d">+2/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>mod.rs</strong><dd><code>Persist pagination fields in
`PanelConfig`</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-cbf3fe971525ba58892400391dfd7dac7e43d6049d6b4f5a9840ad104ebc5e08">+4/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>TableRenderer.vue</strong><dd><code>Implement pagination
state and default footer</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-794706ea9da3a70012a0327c0464f9fd16802f78ece26055fe951716c2d73d59">+89/-9</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>PromQLTableChart.vue</strong><dd><code>Add pagination props
and legend footer controls</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-9c39051461b6f7deae94e8847f91443c4c68541f52137a423bb54b6ab5cd3317">+29/-10</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>TablePaginationControls.vue</strong><dd><code>New reusable
pagination footer component</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-b5e9d5740f8c581bb17133e249e81174ea0842b4d46b5c06fa0efa2f336a15d7">+146/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>ConfigPanel.vue</strong><dd><code>Add pagination toggle and
rows-per-page input</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-c3a6e64dff02b58bb7cdc3f0668990b41ff41544b4c5e991bbcd989ad4bba3f8">+59/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>PanelSchemaRenderer.vue</strong><dd><code>Pass pagination
props into `TableRenderer`</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-e5376e7e77bf3aaf6590c2522d8c2dbffcc95a8006ae0d6dc0040a37825367d6">+2/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

</table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>12
files</summary><table>
<tr>
<td><strong>tr.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-6f0f131e9e2591480c4c5d1eaffc72d02dc31cbd8d3f90d8f012f08cabac8818">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>ja.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-092e49c5f9fbc1b539ab9c2866d108d0ce1d314022b4c294eb4611b285e7bbd3">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>de.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-78f24ecb2dbcfc38fdf3ec22b2559a5b40d236ea689d1c55f5d3e87168310264">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>fr.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-db80e762b88ddf183820c050cdc6b215e6b02b365b5e73f5152af46b0d26f1a2">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>it.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-2de78074a5f887afddce60d694ead9322e6ab223eb70251c13819f3028bdc70d">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>hi.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-1e7b52b5c4e762db2c923d0d3efb6d693702825ed3a1a112d3069f26b0d5f605">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>ko.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-50e27ca1b4825a5026f3a251bfcf79c97cab07cfade2ebd512d332453d707c48">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>nl.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-a1706021687ae5d8a1c006c49eab3946174fecd895f9b70a89c2e76d97250906">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>es.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-ac2a2167b8b973e3f776f9fe3b43bef4576470d8ad33f3d7cfaff6edff0e5778">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>pt.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-38e804f64cb5e0e451849fc84e9b46e53c954a4a4263d51c18665ad45f4b4815">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>en.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-892aa3d75ab6e129ef9116aa21bec1b9a15ba69ce5366d2a19128078c690d824">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>zh.json</strong><dd><code>Add pagination strings and rename
key</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-8818055db58f83230aeea4ebfd4cec31d924e8c47b6f91298e356959ab25339e">+4/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>playwright.yml</strong><dd><code>Add CI job entry for
pagination tests</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+7/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></details></td></tr></tr></tbody></table>

</details>

___

---------

Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech>
Co-authored-by: ktx-akshay <akshay.patil@kiara.tech>
Co-authored-by: ktx-vaidehi <vaidehi.akhani@kiara.tech>
2026-02-09 13:41:38 +05:30
Shrinath Rao e066619e09 test: overhaul dashboard variables E2E tests with Page Object Model and parallel execution stability (#10393)
### **User description**
## Summary

Comprehensive rework of Dashboard Variables E2E test suite to improve
stability for parallel execution and consolidate redundant tests.

### Test Stability Improvements
- Add centralized selectors in `dashboard-selectors.js` for consistent
element targeting
- Implement enhanced retry mechanisms with exponential backoff in
`wait-helpers.js`
- Add proper `waitForDashboardUIStable()` and `waitForDataLoad()`
patterns across page objects
- Fix race conditions in parallel test execution with network idle waits

### Test Consolidation
- Merge `dashboard-variables-null-handling.spec.js` into
`dashboard-variables-dependency.spec.js` (single test moved)
- Remove 2 redundant tests from `dashboard-variables-global.spec.js`
(duplicate coverage with setting.spec.js)
- **Result: 71 → 69 tests** while maintaining full coverage

### CI/CD Improvements  
- Consolidate **5 dashboard variables shards into 1**
"Dashboards-Variables" shard in `playwright.yml`
- Group all dashboard variable specs in single workflow job for
efficiency

### Files Modified
| Change | File |
|--------|------|
| ✅ Add | `dashboard-selectors.js` (centralized selectors) |
| ❌ Delete | `dashboard-variables-null-handling.spec.js` (merged) |
| ✏️ Modify | All dashboard variable spec files for stability |
| ✏️ Modify | `playwright.yml` workflow for shard consolidation |
| ✏️ Modify | `dashboard-create.js`, `dashCreation.js` (retry patterns)
|
| ✏️ Modify | `wait-helpers.js` (enhanced wait utilities) |

## Test plan
- [ ] Run Dashboard Variables tests locally with `npx playwright test
--grep "Dashboard Variables"`
- [ ] Verify all 69 tests pass in parallel execution mode
- [ ] Verify CI workflow runs correctly with consolidated shard


___

### **PR Type**
Tests, Enhancement


___

### **Description**
- Centralize dashboard selectors for E2E.

- Add safe wait helpers everywhere.

- Add dependency null-handling regression test.

- Improve page-object retries for stability.


___

### Diagram Walkthrough


```mermaid
flowchart LR
  specs["Dashboard variables specs"] 
  selectors["`dashboard-selectors.js` selector registry"]
  waits["Safe wait helpers"]
  pageobjs["Page objects retries"]
  ci["Playwright CI shard/workflow"]
  specs -- "replace raw selectors" --> selectors
  specs -- "replace waitForLoadState" --> waits
  waits -- "reduce flake in parallel" --> specs
  pageobjs -- "retry editor/inspector opens" --> specs
  specs -- "run reliably in CI" --> ci
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><details><summary>8
files</summary><table>
<tr>

<td><strong>dashboard-variables-creation-scopes.spec.js</strong><dd><code>Adopt
centralized selectors and safe waits</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-878775b83972fb1f04f1d4df7bc0bbec364fbcbacda6fbd081423673e4ea4b05">+207/-201</a></td>

</tr>

<tr>

<td><strong>dashboard-variables-dependency.spec.js</strong><dd><code>Stabilize
dependency tests and add null-case</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-ad5a7685fbf4477a81657949b7dd4aa4ada6e66a4576d0c61bacb388095d0b52">+247/-123</a></td>

</tr>

<tr>

<td><strong>dashboard-variables-tab-level.spec.js</strong><dd><code>Refactor
spec to shared selectors/waits</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-b1f20469fa2e12dc68ede8ae381f60e2717489947ca693dd8a519fc03f195d48">+150/-148</a></td>

</tr>

<tr>

<td><strong>dashboard-variables-panel-level.spec.js</strong><dd><code>Refactor
spec to shared selectors/waits</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-a4f3068a8d69478dafa0bc1bfb7f51cf98a6980ecc62ae78ba46a617f8e227fd">+129/-120</a></td>

</tr>

<tr>

<td><strong>dashboard-variables-url-sync.spec.js</strong><dd><code>Refactor
spec to shared selectors/waits</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-709abba02dfd42b1be6d3838b162b544a2b97ba204dd179c37d462f0921ff14b">+126/-182</a></td>

</tr>

<tr>

<td><strong>dashboard-variables-refresh.spec.js</strong><dd><code>Refactor
spec to shared selectors/waits</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-8e82d40d2eda995a2915569d16456a9fd7d605017ed5868a28ee409e53646027">+130/-141</a></td>

</tr>

<tr>
<td><strong>dashboard-variables-global.spec.js</strong><dd><code>Remove
redundancy and stabilize global flows</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-f3750bde6fb0d471ec65d81b9d5a5a5b15d79ca900782959a0ff856a5156f5be">+106/-219</a></td>

</tr>

<tr>
<td><strong>dashboard-variables-setting.spec.js</strong><dd><code>Align
settings tests with new POM</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-1c6dd312b59d03b6cef1e15784451e5a5ffb3ed4682dec017e9834de8094fbdd">+1/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

</table></details></td></tr><tr><td><strong>Enhancement</strong></td><td><details><summary>8
files</summary><table>
<tr>
<td><strong>dashboard-selectors.js</strong><dd><code>Add shared
dashboard selector registry</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-b7a318c5d62df2558c0afaa7b21dbaae415d2f43506209da80544992a0f0d19d">+283/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>dashboard-chart.js</strong><dd><code>Add panel editor
readiness waits</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-573a312576fce62d8e14f2bbb5f9b7d9a552d746304dce3d79862edddd24de76">+17/-1</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>dashboard-panel-edit.js</strong><dd><code>Retry query
inspector open for flake</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-ea18ab21ebeaac575078abcbc4f986502578ec39e2c9cb86437c821d0dabc9b5">+16/-4</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>dashboard-variables-scoped.js</strong><dd><code>Add helper
waits and selector utilities</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-86abb9f90fabd982dedfdd9a21a052a47b6984edc7bd29a51ee104c8c473aec4">+366/-13</a></td>

</tr>

<tr>
<td><strong>dashboard-settings.js</strong><dd><code>Harden settings
open/close and variable tab</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-1a07f3f14dacb06180bc02437804d175886aeacda98f5b0ef507a274e5ddd485">+132/-32</a></td>

</tr>

<tr>
<td><strong>dashboard-create.js</strong><dd><code>Improve dashboard
creation waits for parallel</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-c3c5add2b934580a91a79bb580634b70e2376b0452113008a0911102db3863e2">+83/-11</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>wait-helpers.js</strong><dd><code>Add safe wait wrappers and
retries</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-fdf1e3fd5f38875694acd5e3f0a140ed89326ce8a2910f07b18d1004fd5d2165">+101/-4</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>dashCreation.js</strong><dd><code>Add setup/cleanup helpers
for dashboards</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-0f865c438e06691b660a9d4a2448c7c94e6f5172c6a0615eb2a905fa276db575">+91/-0</a>&nbsp;
&nbsp; </td>

</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>playwright.yml</strong><dd><code>Consolidate dashboard
variable shards in CI</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+3/-24</a>&nbsp;
&nbsp; </td>

</tr>

</table></details></td></tr><tr><td><strong>Dependencies</strong></td><td><details><summary>1
files</summary><table>
<tr>
<td><strong>package.json</strong><dd><code>Update UI-testing
scripts/dependencies for E2E</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-a41ba7975823b7b2dc071285391f835fbefd33bfffeb5aa2fba3ae15425cc64f">+7/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></details></td></tr><tr><td><strong>Additional
files</strong></td><td><details><summary>1 files</summary><table>
<tr>
  <td><strong>dashboard-variables-null-handling.spec.js</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10393/files#diff-e42ab503059a687ceb4fa2edeed0888a47591e0a61680c10448eaf68b4e6bbd8">+0/-152</a>&nbsp;
</td>

</tr>
</table></details></td></tr></tr></tbody></table>

</details>

___
2026-02-09 10:48:24 +05:30
ktx-akshay e4f0040fee test: add PromQL query persistence tests for metrics (#10100)
### **PR Type**
Tests, Enhancement


___

### **Description**
- Add PromQL query persistence e2e suite

- Introduce Metrics query editor page object

- Improve tab switching, query entry, polling

- Run new spec in Playwright workflow


___

### Diagram Walkthrough


```mermaid
flowchart LR
  spec["`metrics-promql-query-persistence.spec.js` (test suite)"]
  pom["`metricsQueryEditorPage.js` (page object)"]
  pm["`page-manager.js` (page registry)"]
  gha["`.github/workflows/playwright.yml` (CI matrix)"]
  spec -- "uses helpers" --> pom
  pm -- "exposes" --> pom
  gha -- "executes" --> spec
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>metricsQueryEditorPage.js</strong><dd><code>Add Metrics
query editor Page Object</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

tests/ui-testing/pages/metricsPages/metricsQueryEditorPage.js

<ul><li>Add <code>MetricsQueryEditorPage</code> for metrics editor
interactions<br> <li> Implement robust mode switching to PromQL
Custom<br> <li> Provide resilient query entry (Monaco API +
keyboard)<br> <li> Add tab management, polling, and debug
screenshots</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10100/files#diff-6f21fa6fca05591f7dabdedcaa62f188f9f04185ef924157c893cdd3e8e5c6a0">+481/-0</a>&nbsp;
</td>

</tr>

<tr>
  <td>
    <details>

<summary><strong>metrics-promql-query-persistence.spec.js</strong><dd><code>Add
PromQL query persistence test suite</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>


tests/ui-testing/playwright-tests/Metrics/metrics-promql-query-persistence.spec.js

<ul><li>Add serial e2e suite covering tab query persistence<br> <li>
Validate auto-populated queries on stream selection<br> <li> Test
multi-tab isolation and rapid switching stress<br> <li> Use polling, Run
Query, and screenshots for stability</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10100/files#diff-3e8bacf0b1c46620d12216d1b14581b1b63fc683dbb7f0a89b039e0853f5d664">+447/-0</a>&nbsp;
</td>

</tr>
</table></td></tr><tr><td><strong>Enhancement</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>page-manager.js</strong><dd><code>Register
MetricsQueryEditorPage in PageManager</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

tests/ui-testing/pages/page-manager.js

<ul><li>Import <code>MetricsQueryEditorPage</code> in page manager<br>
<li> Instantiate <code>this.metricsQueryEditorPage</code> for shared
use</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10100/files#diff-565eab8b3c767ae50c9d05e591621d14f66b81af84d6b5ea6efe136c1c3933df">+2/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></td></tr><tr><td><strong>Configuration
changes</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>playwright.yml</strong><dd><code>Include new metrics
persistence spec in CI</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></summary>
<hr>

.github/workflows/playwright.yml

<ul><li>Add <code>metrics-promql-query-persistence.spec.js</code> to
workflow test list</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10100/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+1/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></td></tr></tr></tbody></table>

</details>

___
2026-02-06 18:49:40 +05:30
Neha PandClaude d729d9cfbe test: e2e testcase for bug #9754 (#10365)
### **PR Type**
Tests, Enhancement


___

### **Description**
- Add Playwright regression coverage for bug #9754

- Ingest edge-case logs with unclosed delimiters

- Assert table, highlighting, and detail sidebar

- Extend LogsPage with helper accessors


___

### Diagram Walkthrough


```mermaid
flowchart LR
  A["Playwright regression spec: bug #9754"] 
  B["Ingest edge-case log messages"] 
  C["Logs UI assertions (table/search/highlighting)"] 
  D["Log detail sidebar JSON assertions"] 
  E["LogsPage page-object helpers"] 
  F["Stream cleanup via API"]
  A -- "sends test data" --> B
  A -- "verifies rendering" --> C
  A -- "verifies sidebar content" --> D
  A -- "uses helper methods" --> E
  A -- "deletes test stream" --> F
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>logsPage.js</strong><dd><code>Add helpers for log
detail and highlights</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></summary>
<hr>

tests/ui-testing/pages/logsPages/logsPage.js

<ul><li>Add <code>getLogDetailJsonContentText()</code> for JSON detail
text<br> <li> Add <code>getHighlightedElementsCount()</code> to count
<code>.log-highlighted</code><br> <li> Log helper actions via
<code>testLogger</code></ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10365/files#diff-8045b343491d8943869c1af74cdafab204dc49c02a70294417e73f47d35e0b59">+20/-0</a>&nbsp;
&nbsp; </td>

</tr>
</table></td></tr><tr><td><strong>Tests</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>logs-9754.spec.js</strong><dd><code>Add regression
suite for logs highlighting bug</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

tests/ui-testing/playwright-tests/RegressionSet/logs-9754.spec.js

<ul><li>Add serial Playwright suite targeting bug #9754<br> <li> Ingest
logs with unclosed brackets/quotes/ANSI sequences<br> <li> Assert no
character loss in table and highlighting<br> <li> Validate log detail
sidebar JSON and cleanup stream</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10365/files#diff-169784bd6a86705694f5cdda656a31e6ff390cf1f76cfb9aec8ff4a652ae5f31">+403/-0</a>&nbsp;
</td>

</tr>
</table></td></tr></tr></tbody></table>

</details>

___

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-04 17:31:04 +05:30
ktx-akshay 4fef360f1d test: add table chart column ordering test cases for promql (#10243)
### **PR Type**
Tests


___

### **Description**
- Add comprehensive Column Order tests for PromQL table chart
  - Covers P0 critical, P1 functional, P2 edge-case scenarios

- Implement helpers for chart setup and column extraction

- Update CI workflow to include new spec


___

### Diagram Walkthrough


```mermaid
flowchart LR
  A["Metrics Page"] --> B["Table Chart Setup"]
  B --> C["Column Order Button"]
  C --> D["Column Order Popup"]
  D --> E["Reorder & Persist Tests"]
  E --> F["Edge Cases Validation"]
  G["CI Workflow"] --> H["Run new spec"]
```



<details> <summary><h3> File Walkthrough</h3></summary>

<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><table>
<tr>
  <td>
    <details>

<summary><strong>metrics-table-column-order.spec.js</strong><dd><code>Comprehensive
column order tests</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></summary>
<hr>


tests/ui-testing/playwright-tests/Metrics/metrics-table-column-order.spec.js

<ul><li>Added new test suite for column ordering feature<br> <li>
Defined setupTableChart and extractColumnName helpers<br> <li> Verified
button visibility, popup UI, and drag handles<br> <li> Tested reorder,
save, cancel, and persistence flows</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10243/files#diff-0c32a7a918a4ff834070d063782fe263da7a4891230229579156f436474f0024">+1104/-0</a></td>

</tr>
</table></td></tr><tr><td><strong>Configuration
changes</strong></td><td><table>
<tr>
  <td>
    <details>
<summary><strong>playwright.yml</strong><dd><code>Include new spec in CI
workflow</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

.github/workflows/playwright.yml

<ul><li>Added new spec to <code>run_files</code> list<br> <li> Ensures
CI runs metrics-table-column-order tests</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10243/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+1/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></td></tr></tr></tbody></table>

</details>

___
2026-01-29 18:21:09 +05:30