mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-04 16:09:05 +00:00
b29cb44d6e25b990a470d972745cf91ccecfeabe
428
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
3231f5f960 |
fix(e2e): consolidate and stabilize alerts-incidents-tabs tests (#9837)
### **User description**
## Summary
- Consolidated 13 test cases into 5 comprehensive tests for the
Alerts/Incidents tabs feature
- Tests 1-3: UI validation, search functionality, edge cases (enterprise
feature, running)
- Tests 4-5: Incident lifecycle actions and drawer validation
(enterprise feature, skipped - requires incidents to exist)
- Added incident-related POM methods to alertsPage.js
- Fixed view tab locators to use correct AppTabs pattern (tab-alerts,
tab-incidents)
- Added `waitForViewTabsReady()` method for stable test setup
- Added incident cleanup patterns to cleanup.spec.js
- Marked entire suite as @enterprise feature since Alerts/Incidents is
enterprise-only
## Test Results
- 3 passed, 2 skipped (~32s)
## Test plan
- [x] Run alerts-incidents-tabs.spec.js - all 3 OSS tests pass
- [x] Verify 2 enterprise tests are correctly skipped
- [x] Cleanup patterns added for incident_e2e_* resources
___
### **PR Type**
Enhancement, Tests
___
### **Description**
- Enhance AlertsPage POM with incident locators
- Add helpers for view tabs and loading overlay
- Consolidate comprehensive alerts-incidents E2E tests
- Extend cleanup to include incident_e2e patterns
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["Navigate to Alerts Page"] --> B["waitForLoadingOverlayToDisappear"]
B --> C["waitForAlertListPageReady"]
C --> D["waitForViewTabsReady"]
D --> E1["Test1: View UI Validation"]
D --> E2["Test2: Search Functionality"]
D --> E3["Test3: Edge Cases"]
```
<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>alertsPage.js</strong><dd><code>Enhance AlertsPage with
incident methods and locators</code>
</dd></summary>
<hr>
tests/ui-testing/pages/alertsPages/alertsPage.js
<ul><li>Added locators for incidents, drawer, and page structure<br>
<li> Introduced waitForViewTabsReady and loading overlay helpers<br>
<li> Added assertion helpers for alerts/incidents visibility<br> <li>
Implemented incident lifecycle and drawer methods</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9837/files#diff-79ee01d6d7f145f19207b93b87143b545a1188cfc6a82bc8c45fecfbf68f8a1d">+329/-8</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>commonActions.js</strong><dd><code>Use
`alert-list-page` in navigation check</code>
</dd></summary>
<hr>
tests/ui-testing/pages/commonActions.js
- Updated navigateToAlerts to check `alert-list-page`
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9837/files#diff-4d726dd2bdb34b2c90a31798ff49b6df5bc952bd049b7c38bebb18b6db0076e2">+2/-2</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Tests</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>alerts-incidents-tabs.spec.js</strong><dd><code>New
Alerts/Incidents tabs E2E tests</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/Alerts/alerts-incidents-tabs.spec.js
<ul><li>Added new comprehensive E2E suite for Alerts/Incidents tabs<br>
<li> Consolidates view UI, search, and edge case tests<br> <li> Skips
enterprise incident action tests</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9837/files#diff-53a1a0dc2f68166f18211c151ef356b87a34b39fe6b3d2af5263a4036ae2dd99">+413/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>alertsIncidentsTabs.spec.js</strong><dd><code>Remove
legacy alertsIncidentsTabs spec</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/Alerts/alertsIncidentsTabs.spec.js
- Removed deprecated Alerts & Incidents tab spec file
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9837/files#diff-3776665660a181de2d08e4d3bccc481191e7ac88f4e4b0943c869ffa4eb12ffd">+0/-347</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Configuration
changes</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>cleanup.spec.js</strong><dd><code>Add `incident_e2e`
cleanup patterns</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/cleanup.spec.js
- Extended cleanup patterns for `incident_e2e` resources
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9837/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+7/-4</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
8fb89109b3 |
fix: 9658 - update query on stream change (#9823)
### **User description** fixes: https://github.com/openobserve/openobserve/issues/9658 ___ ### **PR Type** Bug fix, Tests ___ ### **Description** - Auto-update SQL query FROM clause on stream change - regenerate select * query - Add comprehensive Playwright E2E tests ___ <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>ScheduledPipeline.vue</strong><dd><code>Add auto-update SQL FROM clause watcher</code> </dd></summary> <hr> web/src/components/pipeline/NodeForm/ScheduledPipeline.vue <ul><li>Added watcher on <code>selectedStreamName</code> for SQL tab<br> <li> Parsed and replaced <code>FROM</code> clause when stream changes<br> <li> Ensured conditions: non-empty query and matching old stream<br> <li> Graceful error handling on parse failures</ul> </details> </td> <td><a href="https://github.com/openobserve/openobserve/pull/9823/files#diff-63d8f838bb880356e7804b4a57fd9223d4f2c189de7aadc7cf33cba723b29aaf">+57/-1</a> </td> </tr> </table></td></tr><tr><td><strong>Tests</strong></td><td><table> <tr> <td> <details> <summary><strong>scheduled-pipeline-stream-auto-update.spec.js</strong><dd><code>Add scheduled pipeline stream auto-update tests</code> </dd></summary> <hr> tests/ui-testing/playwright-tests/Pipelines/scheduled-pipeline-stream-auto-update.spec.js <ul><li>Introduce E2E tests verifying SQL auto-update behavior<br> <li> Validate preservation of WHERE and complex clauses<br> <li> Test manual edit protection and initial load cases<br> <li> Skip PromQL tab scenario</ul> </details> </td> <td><a href="https://github.com/openobserve/openobserve/pull/9823/files#diff-8cc925b4f4019d670b4f4a82a9dd5e3f9c29155d6b261e6dfb7ab946f3ff7d8d">+480/-0</a> </td> </tr> </table></td></tr></tr></tbody></table> </details> ___ --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> |
||
|
|
cb178787f2 |
chore: incidents as separate tabs (#9819)
### **PR Type**
Enhancement, Tests
___
### **Description**
- Replace icon tabs with reusable app-tabs component
- Introduce Alerts/Incidents viewMode switching logic
- Add extensive UI tests for new tab functionality
- Update getPath logic and dev script configuration
___
### Diagram Walkthrough
```mermaid
flowchart LR
TabsComp["app-tabs component"] --> ViewState["viewMode state"]
ViewState --> AlertsView["Alerts view UI"]
ViewState --> IncidentsView["Incidents view UI"]
Tests["UI tests"] --> TabsComp
```
<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>zincutils.ts</strong><dd><code>Refine getPath base URL
logic</code>
</dd></summary>
<hr>
web/src/utils/zincutils.ts
<ul><li>refine getPath logic for web base path<br> <li> conditionally
prepend "/web/" on localhost</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9819/files#diff-d3d59688cccdcc6c84ebe88b698c6910030abecc3125f4c0ef81b0df023699ba">+1/-1</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Enhancement</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>AlertList.vue</strong><dd><code>Replace custom tabs
with app-tabs</code>
</dd></summary>
<hr>
web/src/components/alerts/AlertList.vue
<ul><li>remove custom icon-only view tabs<br> <li> integrate
<code>app-tabs</code> for view switching<br> <li> add
<code>viewTabs</code> computed property<br> <li> update related SCSS
styling</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9819/files#diff-be3e41b823e163b226ffc270d95cc4981e59c600851e4e0d10ee5e4ee994ac8e">+35/-92</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Tests</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>alertsPage.js</strong><dd><code>Add view mode tab
methods and locators</code>
</dd></summary>
<hr>
tests/ui-testing/pages/alertsPages/alertsPage.js
<ul><li>add locators for alert and incident tabs<br> <li> implement
click and expect methods for tabs<br> <li> add search methods for both
views</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9819/files#diff-79ee01d6d7f145f19207b93b87143b545a1188cfc6a82bc8c45fecfbf68f8a1d">+113/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>alertsIncidentsTabs.spec.js</strong><dd><code>Add E2E
tests for alerts/incidents tabs</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/Alerts/alertsIncidentsTabs.spec.js
<ul><li>add E2E tests for tabs visibility and switching<br> <li> cover
functional and edge-case scenarios</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9819/files#diff-3776665660a181de2d08e4d3bccc481191e7ac88f4e4b0943c869ffa4eb12ffd">+347/-0</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Configuration
changes</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>package.json</strong><dd><code>Add base path to dev
script</code>
</dd></summary>
<hr>
web/package.json
- update `dev` script to include base `/web/`
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9819/files#diff-b861012a5dd72b8a9f3281b7cf09f5a779c98569d040b1bbc1db50f1b15e7cce">+1/-1</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
77c1f31ca8 | chore(deps): bump qs from 6.14.0 to 6.14.1 in /tests/ui-testing (#9816) | ||
|
|
7ba23ac601 |
fix(e2e): stabilize dashboard creation in Reports tests (#9811)
### **User description**
## Summary
- Fixes 13 flaky Reports tests that were failing due to unstable
dashboard creation
- Add proper waits for button enablement before clicking submit
- Wait for success notification and URL navigation after dashboard
creation
- Use data-test selector for stream dropdown selection
- Replace scroll-based field selection with search-based approach
- Extract inline locators to constructor for better maintainability
## Test Results
All 13 previously failing tests now pass:
- `reportsScheduleNow.spec.js`: 7 passed
- `reportsScheduleLater.spec.js`: 6 passed
## Test Command
```bash
npx playwright test "playwright-tests/Reports/" --project=chromium
```
___
### **PR Type**
Bug fix, Tests, Enhancement
___
### **Description**
- Stabilize dashboard creation with robust waits
- Replace scrolling with search-based field selection
- Refactor locators and error handling across methods
- Add new cleanup regex patterns for streams
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["Navigate to dashboards"] --> B["Open create dialog"]
B --> C["Fill name & submit"]
C --> D["Wait for success & navigate"]
D --> E["Add panel: select stream & fields"]
E --> F["Apply panel & verify"]
```
<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>dashboardPage.js</strong><dd><code>Improve dashboard
E2E test stability</code>
</dd></summary>
<hr>
tests/ui-testing/pages/dashboardPages/dashboardPage.js
<ul><li>Added locators for menus, dashboards, panels, streams, and
charts <br> <li> Enhanced createDashboard with waitForLoadState,
retries, and expect <br>checks <br> <li> Switched field selection from
scrolling to search-based approach <br> <li> Refactored delete, logout,
share, and org-switch methods</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9811/files#diff-febeab93d1b7b929f386f852b74aa1ab16086626891d08b815afc21414b22704">+180/-121</a></td>
</tr>
</table></td></tr><tr><td><strong>Tests</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>cleanup.spec.js</strong><dd><code>Add new cleanup
stream patterns</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/cleanup.spec.js
<ul><li>Introduced regex cleanup patterns for alert_e2e and alert_import
<br>streams <br> <li> Added dedup_test and dedup_src stream cleanup
rules</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9811/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+4/-0</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
52a6aabadc |
fix(e2e): use search-filter approach for stream selection in dashboard variables (#9810)
### **User description**
## Summary
- Fixed stream selection timeout in dashboard variables settings tests
- Changed from direct text selection to search-filter approach using
keyboard.type()
- Added multiple selection strategies with fallbacks for robustness
## Root Cause
The stream dropdown uses Quasar's q-select with `use-input` which
requires typing to filter streams. The original code used `getByText()`
which fails when streams are not visible in the unfiltered list.
## Changes
- Type stream name to filter dropdown
- Wait for listbox and filtered options
- Multiple fallback strategies for selection
## Test Results
All 12 dashboard variables setting tests now pass.
___
### **PR Type**
Tests, Bug fix
___
### **Description**
- Use keyboard typing to filter stream dropdown
- Wait for filtered options before selecting
- Implement three fallback selection strategies
- Throw error if stream selection fails
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["Open stream selector"] --> B["Type stream name to filter"]
B --> C["Wait for filtered options"]
C --> D["Try exact match selection"]
D -- success --> E["Done"]
D -- fail --> F["Try partial match selection"]
F -- success --> E
F -- fail --> G["Try keyboard navigation"]
G -- success --> E
G -- fail --> H["Throw selection error"]
```
<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>dashboard-settings.js</strong><dd><code>Implement
filtered stream selection with fallbacks</code>
</dd></summary>
<hr>
tests/ui-testing/pages/dashboardPages/dashboard-settings.js
<ul><li>Remove direct locator click and text selection<br> <li> Open
stream select and type name to filter<br> <li> Wait for listbox and
filtered options visibility<br> <li> Add three selection strategies:
exact, partial, keyboard</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9810/files#diff-1a07f3f14dacb06180bc02437804d175886aeacda98f5b0ef507a274e5ddd485">+54/-7</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
a342fab1e9 |
fix(e2e): improve stream selection in schema pagination test (#9809)
### **User description**
## Summary
- Fixes failing sanity test "should display pagination for schema" by
improving stream selection after page reload
- Uses search-and-filter approach to reliably find and select the
e2e_automate stream
- Replaces broken pagination selector with proper data-test attribute
selector
- Adds proper error handling when stream selection fails
## Test plan
- [x] Run sanity pagination test - passes
- [x] Run all sanity tests - 14 passed, 3 skipped
___
### **PR Type**
Bug fix, Tests
___
### **Description**
- Refactor stream selection using search-filter input
- Add multiple fallback click methods and throw error on failure
- Replace flaky pagination dropdown click with pagination button wait
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["Page reload"] --> B["Stream select input visible"]
B --> C["Click and fill filter input"]
C --> D["Wait for stream toggle visible"]
D --> E["Click toggle element"]
D --> F["Fallback: click toggle element"]
F --> G["Fallback: click by text"]
G --> H["Error thrown on failure"]
E --> I["Pagination first page button visible"]
```
<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>sanityPage.js</strong><dd><code>Enhance stream
selection and pagination wait</code>
</dd></summary>
<hr>
tests/ui-testing/pages/generalPages/sanityPage.js
<ul><li>Use search-filter input for stream dropdown selection<br> <li>
Add multiple fallback mechanisms with descriptive logs<br> <li> Throw
meaningful error when stream selection fails<br> <li> Replace pagination
dropdown click with first-page button wait</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9809/files#diff-a0ac0217ef875311dc536edb97deda19927a64e73cede62123b97cbe7df113b8">+37/-19</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
4b1d926b27 |
fix(e2e): use semantic selectors in fillPipelineDetails for reliable dropdown selection (#9806)
### **User description** ## Summary - Fixed `fillPipelineDetails` method in pipelinesEP.js that was timing out on stream dropdown selection - Root cause: Test relied on positional error indexes (`error-0-1`, `error-0-2`, `error-0-3`) which broke after conditions revamp PR #9267 ## Changes - Replace positional error indexes with specific `data-test` attribute selectors - Use `pipeline-import-source-stream-name-input` for stream dropdown detection - Use `pipeline-import-destination-function-name-input` for function dropdowns - Add keyboard filtering and scroll fallback for virtual scroll lists - Add `exact: true` matching for function options to prevent partial matches (e.g., 'first5' matching 'first587') - Remove duplicate click in `pipelineDestinations.addDestination` ## Test plan - [x] Verified "Import RealTime Pipeline from URL" test passes - [x] Verified "Import RealTime Pipeline from JSON file" test passes - [x] Audited changes - no test validations or criteria were weakened ___ ### **PR Type** Tests, Bug fix ___ ### **Description** - Use specific data-test selectors for dropdown detection - Add robust filter and scroll fallback logic - Refactor function dropdown selection into loop - Remove redundant click in destination method ___ <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>pipelineDestinations.js</strong><dd><code>Remove redundant click in addDestination</code> </dd></summary> <hr> tests/ui-testing/pages/pipelinesPages/pipelineDestinations.js <ul><li>Removed duplicate click on destination-type card<br> <li> Ensured correct addDestination click sequence</ul> </details> </td> <td><a href="https://github.com/openobserve/openobserve/pull/9806/files#diff-bab2fcd1b7817e914bf355829bdb52882fa1584e70da2f7d705549c5e30e494f">+0/-1</a> </td> </tr> </table></td></tr><tr><td><strong>Enhancement</strong></td><td><table> <tr> <td> <details> <summary><strong>pipelinesEP.js</strong><dd><code>Enhance fillPipelineDetails dropdown logic</code> </dd></summary> <hr> tests/ui-testing/pages/pipelinesPages/pipelinesEP.js <ul><li>Replaced positional error selectors with data-test inputs<br> <li> Implemented reliable stream dropdown handling<br> <li> Added typing filter and scroll fallback for virtual lists<br> <li> Refactored function dropdown selection loop with exact match</ul> </details> </td> <td><a href="https://github.com/openobserve/openobserve/pull/9806/files#diff-f40d50224fc368792766aac9f85f7aae00e93374f74300651dfac7155d612449">+65/-84</a> </td> </tr> </table></td></tr></tr></tbody></table> </details> ___ |
||
|
|
b489f2a8d5 |
fix(e2e): use search filter in selectIndexAndStreamJoinUnion for reliable stream selection (#9802)
### **User description**
## Summary
- Fix join test failing due to stream not found in dropdown within
timeout
- Update `selectIndexAndStreamJoinUnion` method to use search filtering
## Problem
The test was timing out waiting for stream toggle element because the
dropdown had many streams and the target stream wasn't visible without
scrolling or filtering.
**Error:**
```
TimeoutError: locator.waitFor: Timeout 15000ms exceeded.
waiting for locator('[data-test="log-search-index-list-stream-toggle-e2e_join_a_mjs5hqbr"] div')
```
## Solution
Updated `selectIndexAndStreamJoinUnion` to use the search input box to
filter streams before selection (matching the robust pattern used by
`selectStream` method):
- Use search input to filter for each stream
- Clear and re-filter search for second stream
- Increased timeout from 15s to 20s
- Added explicit wait for dropdown arrow visibility
## Test Results
- ✅ Test passes in 47.7s
___
### **PR Type**
Bug fix, Tests
___
### **Description**
- Added explicit wait for dropdown arrow visibility
- Implemented search input filtering for stream selection
- Increased toggle wait timeout from 15s to 20s
- Refactored dropdown reuse for closing action
___
### Diagram Walkthrough
```mermaid
flowchart LR
Navigate["Go to logs page"]
OpenDropdown["Wait and click dropdown arrow"]
SearchFilterA["Filter for stream A"]
SelectA["Wait and click stream A toggle"]
ClearFilter["Clear and filter for stream B"]
SelectB["Wait and click stream B toggle"]
CloseDropdown["Click dropdown arrow to close"]
Navigate --> OpenDropdown
OpenDropdown --> SearchFilterA
SearchFilterA --> SelectA
SelectA --> ClearFilter
ClearFilter --> SelectB
SelectB --> CloseDropdown
```
<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>logsPage.js</strong><dd><code>Enhance stream selection
with search filter</code>
</dd></summary>
<hr>
tests/ui-testing/pages/logsPages/logsPage.js
<ul><li>Added explicit wait for dropdown arrow visibility<br> <li>
Implemented search input filtering for stream selection<br> <li>
Increased toggles' wait timeout from 15s to 20s<br> <li> Refactored
dropdown toggling for open/close actions</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9802/files#diff-8045b343491d8943869c1af74cdafab204dc49c02a70294417e73f47d35e0b59">+29/-7</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
5a25853ac6 |
fix(e2e): update getSeverityColors selector for robust DOM matching (#9798)
### **User description** ## Summary - Fix severity color test failing due to CSS selector not matching DOM elements - Update `getSeverityColors()` method in logsPage.js with multi-fallback selector strategy ## Problem The original selector `div[class*="tw:absolute"][class*="tw:left-0"]` failed to match elements because Tailwind CSS class names with colons need different escaping in querySelector. **Error:** ``` Expected: 8 Received: 0 ``` ## Solution Implement robust multi-fallback approach: 1. First try inline style selector: `div[style*="background"]` 2. Fallback to escaped class selector: `div[class*="tw\\:absolute"]` 3. Final fallback: iterate through divs to find absolute positioned element with backgroundColor ## Test Results All 8 severity levels now verified successfully: - ✅ Severity 0-7 colors all match expected values - ✅ Test passes in 28.7s ___ ### **PR Type** Bug fix, Tests ___ ### **Description** - Add multi-fallback selector for severity color div - Skip transparent or missing background elements - Broaden severity text pattern matching ___ <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>logsPage.js</strong><dd><code>Robust colorDiv selector and severity parsing</code> </dd></summary> <hr> tests/ui-testing/pages/logsPages/logsPage.js <ul><li>Added inline style selector for background color div<br> <li> Fallback to escaped Tailwind class selector<br> <li> Computed style fallback for absolute-positioned div<br> <li> Skip transparent or missing divs before parsing<br> <li> Extended severity patterns for varied text formats</ul> </details> </td> <td><a href="https://github.com/openobserve/openobserve/pull/9798/files#diff-8045b343491d8943869c1af74cdafab204dc49c02a70294417e73f47d35e0b59">+36/-3</a> </td> </tr> </table></td></tr></tr></tbody></table> </details> ___ |
||
|
|
c31e541f08 |
fix(e2e): update firstConditionLabel selector in pipelinesPage (#9797)
### **User description**
## Summary
- Fix fragile CSS class-based selector for `firstConditionLabel` in
pipeline conditions test
- Replace with robust `data-test` scoped text selector
## Problem
The selector `.tw:flex.tw:items-start.tw:gap-1` failed because Tailwind
classes in the Vue template are space-separated, but the selector tried
to match them as combined without spaces, resulting in "element(s) not
found" error.
## Solution
Changed from:
```javascript
page.locator('.tw\\:flex.tw\\:items-start.tw\\:gap-1').first().locator('span').first()
```
To:
```javascript
page.locator('[data-test="add-condition-section"]').getByText('if', { exact: true }).first()
```
## Test Results
- ✅ Test passes locally (2.1 minutes execution time)
___
### **PR Type**
Tests, Bug fix
___
### **Description**
- Update e2e selector for first condition label
- Replace fragile Tailwind CSS locator
- Use robust `[data-test]` scoped text locator
___
<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>pipelinesPage.js</strong><dd><code>Replace Tailwind
selector with data-test locator</code>
</dd></summary>
<hr>
tests/ui-testing/pages/pipelinesPages/pipelinesPage.js
<ul><li>Removed complex Tailwind CSS selector<br> <li> Added
<code>[data-test="add-condition-section"]</code> locator<br> <li> Used
<code>getByText('if', { exact: true })</code> on first element</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9797/files#diff-d5f2771fd1139c174c46d09a9ab2da0ea4588b853e2b87e4728322d072542f49">+1/-1</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
d852e7656b |
test: refactor alerts module with POM architecture and comprehensive e2e coverage (#9717)
### **User description** ## Summary Complete refactoring of the Alerts UI testing module with Page Object Model architecture, comprehensive E2E test coverage, and improved test stability. ## Key Changes ### 🏗️ Architecture Refactoring Refactored monolithic `AlertsPage` (2300+ lines) into modular Page Object classes: | Module | Responsibility | |--------|---------------| | `AlertCreationWizard` | Alert creation flows (real-time, scheduled, multi-condition, deduplication) | | `AlertManagement` | CRUD operations (update, clone, pause, resume, delete, search) | | `AlertBulkOperations` | Bulk operations (select, pause/unpause, move across folders) | | `AlertsPage` | Main entry point, folder operations, UI validations, import/export | ### 🧪 Test Coverage All 12 Alerts tests passing: | Spec File | Tests | Coverage | |-----------|-------|----------| | `alerts-e2e-flow.spec.js` | 1 | Complete E2E flow: CRUD, clone, pause/resume, move, search | | `alerts-ui-operations.spec.js` | 4 | Template/destination CRUD, scheduled alerts, UI validations | | `alerts-import.spec.js` | 3 | Import/export alerts, templates, destinations (URL + file) | | `alerts-advanced.spec.js` | 4 | Multi-condition alerts, AND/OR toggle, bulk operations, deduplication | ### 🔧 Stability Fixes - Added `test.slow()` for long-running E2E flow test - Fixed `moveAllAlertsToFolder` with proper success message assertion - Fixed `deleteAllAlertsInFolder` by removing redundant verification - Fixed `verifyAlertCreated` with navigation fallback for reliability - Fixed `selectMultipleAlerts` with visibility check and search fallback - Added post-creation waits in alert wizard to handle async UI updates ### 📝 Code Quality - Cleaned up redundant comments across all alerts files - Removed obvious "what" comments, kept meaningful "why" explanations - Preserved section dividers for navigation in long methods - Maintained JSDoc for method documentation ## New Page Object Methods ### AlertCreationWizard - `createAlert()` - Standard real-time alert with column/operator/value - `createAlertWithDefaults()` - Resilient creation using first available column - `createScheduledAlertWithSQL()` - Scheduled alert with SQL query - `createAlertWithMultipleConditions()` - Multi-condition alert with AND operator - `createScheduledAlertWithDeduplication()` - Scheduled alert with dedup config - `testConditionOperatorToggle()` - Tests AND/OR toggle functionality ### AlertManagement - `updateAlert()` - Edit alert via wizard - `cloneAlert()` - Clone with stream selection - `pauseAlert()` / `resumeAlert()` - Toggle alert state - `deleteAlertByRow()` / `deleteImportedAlert()` - Delete operations - `searchAlert()` / `searchAndDeleteAlert()` - Search operations ### AlertBulkOperations - `selectMultipleAlerts()` - Select multiple alerts for bulk ops - `bulkPauseAlerts()` / `bulkUnpauseAlerts()` - Bulk state toggle - `moveAllAlertsToFolder()` - Move alerts between folders - `deleteAllAlertsInFolder()` - Clean folder contents ## Test Results ``` Running 12 tests using 4 workers 12 passed (~6.2m) ``` ## Test Plan - [x] All 12 alerts tests passing locally - [x] Tests are independent and cleanup after themselves - [x] No regressions in existing functionality ___ ### **PR Type** Enhancement, Tests ___ ### **Description** - Refactor AlertsPage into modular PageObjects - Centralize and expose locators in a map - Delegate creation, management, bulk operations - Add advanced E2E tests for multi-condition, bulk, dedup features - Enhance LogsPage.selectStream with configurable wait ___ ### Diagram Walkthrough ```mermaid flowchart LR AP["AlertsPage"] ACW["AlertCreationWizard"] AM["AlertManagement"] ABO["AlertBulkOperations"] AP -- "delegates to" --> ACW AP -- "delegates to" --> AM AP -- "delegates to" --> ABO ``` <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><details><summary>5 files</summary><table> <tr> <td><strong>alertsPage.js</strong><dd><code>Modularize AlertsPage with submodules and locators</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-79ee01d6d7f145f19207b93b87143b545a1188cfc6a82bc8c45fecfbf68f8a1d">+569/-1059</a></td> </tr> <tr> <td><strong>alertManagement.js</strong><dd><code>Introduce AlertManagement module for CRUD</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-53afe97106daddb1fb35c3624ccedc99f21476946edc181f6287f7e8fd1bbf37">+509/-0</a> </td> </tr> <tr> <td><strong>alertCreationWizard.js</strong><dd><code>Introduce AlertCreationWizard module</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-3b0a08b55d132502596d17c9d5f197de6d4779684de96ce570282e2402942e2e">+1024/-0</a></td> </tr> <tr> <td><strong>alertBulkOperations.js</strong><dd><code>Introduce AlertBulkOperations module</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-dea39c18fea38783c9ef4ae71e11021eaa3663b7012ae1c481a30277139a6907">+299/-0</a> </td> </tr> <tr> <td><strong>logsPage.js</strong><dd><code>Enhance selectStream with apiWaitMs parameter</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-8045b343491d8943869c1af74cdafab204dc49c02a70294417e73f47d35e0b59">+10/-6</a> </td> </tr> </table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>alerts-advanced.spec.js</strong><dd><code>Add advanced E2E tests for alerts features</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-710af4a4eaad54a1ddd5acf0d62f977bfa18c95462b38c4f84593a970297754d">+194/-0</a> </td> </tr> </table></details></td></tr><tr><td><strong>Additional files</strong></td><td><details><summary>8 files</summary><table> <tr> <td><strong>alertDestinationsPage.js</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-57e5c53b4ef998b3d8708149620ff94dcc46807927f1a3a9e9f28ed3ebe25b0a">+95/-0</a> </td> </tr> <tr> <td><strong>alertTemplatesPage.js</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-f4ebd248b2140051e74dbbbd1aabe344f01c80704ce5857e9c28a04350e018f3">+74/-4</a> </td> </tr> <tr> <td><strong>apiCleanup.js</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-537fe76c0d8e26e81c5f77c83bd0ee35daaa973822105c809bf83171a26b33c5">+133/-221</a></td> </tr> <tr> <td><strong>commonActions.js</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-4d726dd2bdb34b2c90a31798ff49b6df5bc952bd049b7c38bebb18b6db0076e2">+156/-0</a> </td> </tr> <tr> <td><strong>alerts-e2e-flow.spec.js</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-32972e38c1fe0e8bb887f9f254b3130916a36f96ea924f9987493d44efefeab9">+38/-23</a> </td> </tr> <tr> <td><strong>alerts-import.spec.js</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-62b6ec4818685eacc0a934d68aaadfd73b512ef4f4be25fcd5135b97c2844912">+54/-106</a></td> </tr> <tr> <td><strong>alerts-ui-operations.spec.js</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-c9b523b5f5dea834b69abdf20f4acef361bdf37b1585c450e10238b1d1984f2e">+38/-82</a> </td> </tr> <tr> <td><strong>cleanup.spec.js</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9717/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+3/-1</a> </td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___ --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
890e8d7669 |
fix: Node package upgrade v1.8 (#9773)
### **PR Type**
Enhancement
___
### **Description**
- Upgrade Tailwind CSS from v3.4.4 to v4.1.18
- Bump rudder-sdk-js from 2.48.43 to 2.52.7
___
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Dependencies</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>package.json</strong><dd><code>Bump dependency versions
in package.json</code>
</dd></summary>
<hr>
web/package.json
<ul><li>Updated <code>tailwindcss</code> version to ^4.1.18<br> <li>
Updated <code>rudder-sdk-js</code> version to ^2.52.7</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9773/files#diff-b861012a5dd72b8a9f3281b7cf09f5a779c98569d040b1bbc1db50f1b15e7cce">+2/-2</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
c9f7ead7cc |
fix: Metrics revamp UI fixes (#9749)
### **PR Type** Enhancement ___ ### **Description** - Add `query_type` param for PromQL range/instant - Support streaming in `useStreamingSearch` & backend - Revamp query mode selector UI: SQL, builder, custom, PromQL - Enhance `convertPromQLData`: instant vectors & styling ___ ### Diagram Walkthrough ```mermaid flowchart LR UI["Query mode selector UI"] -- "sets query_type" --> Loader["Panel data loader"] Loader -- "adds query_type" --> Stream["Streaming search URL builder"] Stream -- "routes instant/range" --> Backend["HTTP handler"] Backend -- "streams or search" --> Converter["PromQL data converter"] Converter -- "apply transformations" --> Chart["Chart rendering"] ``` <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><details><summary>8 files</summary><table> <tr> <td><strong>usePanelDataLoader.ts</strong><dd><code>Add `query_type` field to PromQL payload</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-5a42e9493a7bcd722b88e61fd38883c4f61001bc9cafa399f65f8eafda3aace9">+1/-0</a> </td> </tr> <tr> <td><strong>useDashboardPanel.ts</strong><dd><code>Toggle off VRL and skip resets in PromQL mode</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-fbba1700750053b9eaf38ddd30dab84531bc44131c795ebb713811e4930cd7cb">+15/-0</a> </td> </tr> <tr> <td><strong>useStreamingSearch.ts</strong><dd><code>Route PromQL streaming URL by query_type</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-8fce3e25a161cd458e734bd9b1f98aadefe3482da7b6529a5b1f4fa20ec115e2">+15/-2</a> </td> </tr> <tr> <td><strong>convertPromQLData.ts</strong><dd><code>Support instant vectors and series styling</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-68d70ba6c622911d48cdb567940dc404a4a6468b86c6d24fb54e5f1d8aa5ca2a">+69/-10</a> </td> </tr> <tr> <td><strong>mod.rs</strong><dd><code>Add `use_streaming` flag to RequestQuery</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-82a5de6222f38aad3e2cf41c251400cec789c6ab9fbb0d92cbb5cbaabb21c030">+2/-0</a> </td> </tr> <tr> <td><strong>mod.rs</strong><dd><code>Route to streaming or standard search</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-0ad5729a1fbce00ff53076728c51822400c13af9918e1d8554f41be56d060fa0">+10/-2</a> </td> </tr> <tr> <td><strong>QueryTypeSelector.vue</strong><dd><code>Revamp query mode buttons: SQL, PromQL, builder, custom</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-0dfd7075714453289e8f65d7f085ff9314148c02ca64fb591d0b8d8cbe1ef0b3">+212/-158</a></td> </tr> <tr> <td><strong>PromQLBuilderOptions.vue</strong><dd><code>Add query_type select (range/instant) in builder</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-0118a096d9bd174a3fbe091f62af6f94d6fc6f51c10ad00a1c8660bd5a14f2e9">+62/-1</a> </td> </tr> </table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>11 files</summary><table> <tr> <td><strong>de.json</strong><dd><code>Add SQL, builder, custom translation keys</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-78f24ecb2dbcfc38fdf3ec22b2559a5b40d236ea689d1c55f5d3e87168310264">+5/-1</a> </td> </tr> <tr> <td><strong>en.json</strong><dd><code>Update labels for SQL, builder, custom modes</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-892aa3d75ab6e129ef9116aa21bec1b9a15ba69ce5366d2a19128078c690d824">+5/-3</a> </td> </tr> <tr> <td><strong>es.json</strong><dd><code>Add new translation keys for query modes</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-ac2a2167b8b973e3f776f9fe3b43bef4576470d8ad33f3d7cfaff6edff0e5778">+5/-1</a> </td> </tr> <tr> <td><strong>fr.json</strong><dd><code>Update locale with SQL and builder keys</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-db80e762b88ddf183820c050cdc6b215e6b02b365b5e73f5152af46b0d26f1a2">+5/-1</a> </td> </tr> <tr> <td><strong>it.json</strong><dd><code>Add custom and builder translations</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-2de78074a5f887afddce60d694ead9322e6ab223eb70251c13819f3028bdc70d">+5/-1</a> </td> </tr> <tr> <td><strong>ja.json</strong><dd><code>Include SQL/builder/custom in Japanese locale</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-092e49c5f9fbc1b539ab9c2866d108d0ce1d314022b4c294eb4611b285e7bbd3">+5/-1</a> </td> </tr> <tr> <td><strong>ko.json</strong><dd><code>Add SQL and builder keys in Korean</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-50e27ca1b4825a5026f3a251bfcf79c97cab07cfade2ebd512d332453d707c48">+5/-1</a> </td> </tr> <tr> <td><strong>nl.json</strong><dd><code>Update Dutch locale for query modes</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-a1706021687ae5d8a1c006c49eab3946174fecd895f9b70a89c2e76d97250906">+5/-1</a> </td> </tr> <tr> <td><strong>pt.json</strong><dd><code>Add Portuguese labels for SQL and builder</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-38e804f64cb5e0e451849fc84e9b46e53c954a4a4263d51c18665ad45f4b4815">+5/-1</a> </td> </tr> <tr> <td><strong>tr.json</strong><dd><code>Update Turkish locale with new keys</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-6f0f131e9e2591480c4c5d1eaffc72d02dc31cbd8d3f90d8f012f08cabac8818">+5/-1</a> </td> </tr> <tr> <td><strong>zh.json</strong><dd><code>Add SQL/custom/builder translations in Chinese</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9749/files#diff-8818055db58f83230aeea4ebfd4cec31d924e8c47b6f91298e356959ab25339e">+5/-1</a> </td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___ --------- Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> |
||
|
|
50402cf46a |
fix: batch 3 package upgrade (#9755)
### **PR Type**
Enhancement
___
### **Description**
- Adjust Vitest config imports and coverage settings
- Refine coverage: add V8 provider and include patterns
- Bump Vitest, Vitest UI, and canvas mock versions
- Upgrade dotenv and remove unused type definitions
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["web/vitest.config.ts"] --> B["Import types corrected"]
A --> C["Coverage provider & include updated"]
D["web/package.json"] --> E["Bump Vitest & mocks versions"]
D --> F["Upgrade dotenv & remove types"]
```
<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>vitest.config.ts</strong><dd><code>Adjust Vitest config
imports and coverage</code>
</dd></summary>
<hr>
web/vitest.config.ts
<ul><li>Replace type import from <code>vitest/config</code> to
<code>vite</code><br> <li> Remove <code>VitestUserConfig</code> cast for
mergeConfig<br> <li> Add coverage provider <code>v8</code><br> <li>
Update coverage include pattern to
<code>src/**/*.{js,ts,vue}</code></ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9755/files#diff-c3fc010b682e68f2ed0b7b1485b8aa513443a66d500903b8dff1d65908d02aae">+4/-3</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Dependencies</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>package.json</strong><dd><code>Upgrade devDependencies
versions</code>
</dd></summary>
<hr>
web/package.json
<ul><li>Bump <code>@vitest/coverage-v8</code> and
<code>@vitest/ui</code> to 4.x<br> <li> Upgrade <code>vitest</code> and
<code>vitest-canvas-mock</code> versions<br> <li> Update
<code>dotenv</code> to <code>^17.2.3</code><br> <li> Remove unused
<code>@types/dompurify</code></ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9755/files#diff-b861012a5dd72b8a9f3281b7cf09f5a779c98569d040b1bbc1db50f1b15e7cce">+5/-6</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
bffa2fefbb |
test: use empty template in email destination import JSON (#9736)
### **User description**
## Summary
- Fix email destination import test to work consistently across
environments
- Changed `template: "email"` to `template: ""` in
emailDestinationImport.json
- Also updated the GitHub file (alert_tests repo) with the same fix
## Root Cause
The email destination import JSON had `"template": "email"` which caused
different behavior:
- On environments without a built-in "email" template: UI shows template
dropdown
- On environments with a built-in "email" template: UI hides the
dropdown (since template is already valid)
Using empty template ensures the dropdown is always shown, making tests
consistent.
## Test plan
- [x] Tested on test.internal - passes
- [x] Tested on dev2.internal - passes
___
### **PR Type**
Tests
___
### **Description**
- Set `template` to empty string in import JSON
- Ensure consistent template dropdown in UI tests
___
<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>emailDestinationImport.json</strong><dd><code>Template
field reset in import JSON</code>
</dd></summary>
<hr>
tests/ui-testing/utils/emailDestinationImport.json
- Updated `template` from "email" to "".
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9736/files#diff-57ea7fbee46a4944f5ca07827afa5e1f411dfc33e4153a29951719360d097883">+1/-1</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
746a43f162 |
test: add enrichment table cleanup patterns and fix search reliability (#9722)
### **User description**
## Summary
- **Add missing cleanup patterns** for enrichment tables in
`cleanup.spec.js` to prevent test data accumulation
- **Fix `searchEnrichmentTableInList` method** in `enrichmentPage.js` to
resolve timeout errors
## Changes
### 1. Enrichment Table Cleanup Patterns (`cleanup.spec.js`)
Added 5 new patterns to clean up test-generated enrichment tables:
| Pattern | Source Test |
|---------|-------------|
| `enrichment_info_<uuid>_csv` | "should upload an enrichment table
under functions" (line 53) |
| `append_<uuid>_csv` | "should append an enrichment table under
functions" (line 132) |
| `search_test_<uuid>_csv` | "should search and filter enrichment
tables" (line 174) |
| `edit_test_<uuid>_csv` | "should open edit mode with disabled name
field" (line 200) |
| `delete_test_<uuid>_csv` | "should show delete confirmation dialog
with cancel" (line 235) |
### 2. Search Reliability Fix (`enrichmentPage.js`)
Fixed `searchEnrichmentTableInList` method that was causing timeout
errors:
**Before:**
```
TimeoutError: locator.waitFor: Timeout 30000ms exceeded.
- waiting for locator('[data-test="enrichment-tables-list-title"]') to be visible
```
**Fix:**
- Removed unreliable wait for
`[data-test="enrichment-tables-list-title"]` selector
- Wait directly for search input placeholder (more reliable page ready
indicator)
- Wait for actual filtered table row results instead of fixed timeout
## Test plan
- [ ] Run enrichment table e2e tests
- [ ] Verify cleanup removes leftover test tables
___
### **PR Type**
Tests, Bug fix
___
### **Description**
- Improve searchEnrichmentTableInList reliability
- Wait for network idle and search input
- Wait for filtered row visibility
- Add enrichment table cleanup patterns
- enrichment_info, append, search_test
- edit_test, delete_test
___
<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>enrichmentPage.js</strong><dd><code>Enhance
searchEnrichmentTableInList reliability</code>
</dd></summary>
<hr>
tests/ui-testing/pages/generalPages/enrichmentPage.js
<ul><li>Removed wait on
<code>[data-test="enrichment-tables-list-title"]</code><br> <li> Added
<code>waitForLoadState('networkidle')</code> calls<br> <li> Updated
search input wait and fill logic<br> <li> Added filtered table row
visibility wait</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9722/files#diff-98a7e60352ddf3be23cf70170559e637ef448c189cd9414448e9afff897c3019">+9/-3</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Tests</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>cleanup.spec.js</strong><dd><code>Add enrichment
cleanup patterns</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/cleanup.spec.js
<ul><li>Added five enrichment table cleanup patterns<br> <li> Patterns
for <code>enrichment_info_<uuid>_csv</code><br> <li> Patterns for
<code>append_<uuid>_csv</code>, <code>search_test_<uuid>_csv</code><br>
<li> Patterns for <code>edit_test_<uuid>_csv</code>,
<code>delete_test_<uuid>_csv</code></ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9722/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+6/-1</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
384aa5ba62 |
fix: issue 9355 (#9706)
### **User description** This PR fixes the issue in #9355 Alert doesn't get triggered if the field seleceted in a non uds field ___ ### **PR Type** Bug fix, Enhancement ___ ### **Description** - Enforce UDS fields in alerts and pipelines UIs - Filter stream fields by defined_schema_fields - Always include timestamp and _all fields - Add `validate` flag to search API calls - Backend search utils: error on non-UDS fields - New alert UI validation: `validateConditionsAgainstUDS` ___ ### Diagram Walkthrough ```mermaid flowchart LR A["Select stream"] --> B["Fetch schema & settings"] B -- "Apply UDS filter" --> C["Available fields list"] C --> D["Build alert conditions"] D --> E["validateConditionsAgainstUDS"] E -- valid --> F["Submit alert"] E -- invalid --> G["Show error notification"] ``` <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><details><summary>4 files</summary><table> <tr> <td><strong>utils.rs</strong><dd><code>Return error on non-UDS search fields</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-96bb9f4a8f547c821f26c957e8505d0437095b08d2b36687531f71565d287bd6">+1/-2</a> </td> </tr> <tr> <td><strong>alertValidation.ts</strong><dd><code>Always pass `validate:true` in alert SQL validation</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-3164a4a58c1865cfcbbba084ac339664c99564545be4d57504dd406d59d8ad4a">+1/-0</a> </td> </tr> <tr> <td><strong>QueryEditorDialog.vue</strong><dd><code>Include `validate:true` in query trigger search</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-6c524f609ed374aa29e075e8d046ac06be0edda7bfa1914b0a2bbc24d255e5eb">+1/-0</a> </td> </tr> <tr> <td><strong>Query.vue</strong><dd><code>Deep copy routing data and validate SQL</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-6247cbd506bcf963372f2e429507fc579af95f003df246889b478da11326a657">+20/-10</a> </td> </tr> </table></details></td></tr><tr><td><strong>Enhancement</strong></td><td><details><summary>5 files</summary><table> <tr> <td><strong>search.ts</strong><dd><code>Add `validate` flag to search URL builder</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-885ab872dbc6e7b20264df815e3ef4727f0abc86ce90d2fb47e4aff572814c75">+4/-0</a> </td> </tr> <tr> <td><strong>AddAlert.vue</strong><dd><code>Filter and validate conditions against UDS</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-7b426bb23e9ed0250c3877d6d97b099c42b2d20e22ddf4459915381b2233a0a8">+187/-0</a> </td> </tr> <tr> <td><strong>FilterCondition.vue</strong><dd><code>Add column-exists validation rule per module</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-53916e2402d0ee094fcd63f0ec0c99ceffde4fa042f9001203d2e2e1b7709e10">+28/-1</a> </td> </tr> <tr> <td><strong>FilterGroup.vue</strong><dd><code>Propagate `module` prop to nested filter groups</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-8d5a73bea3aa0b5c86d48cda4a61ee3e30f27797ac2a5add1ee8bd66c75bef23">+8/-0</a> </td> </tr> <tr> <td><strong>ScheduledPipeline.vue</strong><dd><code>Adjust submit handler and add UDS filter</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-63d8f838bb880356e7804b4a57fd9223d4f2c189de7aadc7cf33cba723b29aaf">+4/-4</a> </td> </tr> </table></details></td></tr><tr><td><strong>Configuration changes</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>QueryConfig.vue</strong><dd><code>Tag QueryConfig with `module="alerts"`</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-7273c8de49b8ebf706d7bee5b275c75818c0493f41c73f00c55efe667cbd00d9">+1/-0</a> </td> </tr> </table></details></td></tr><tr><td><strong>Additional files</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>Condition.vue</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9706/files#diff-4c3e624233c9e0355c7ded3b26dc74971b867be63e24f92a5e639284f60639dd">+37/-1</a> </td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___ --------- Co-authored-by: loaki07 <rustyloaki@gmail.com> Co-authored-by: Shrinath Rao <shnath@openobserve.ai> |
||
|
|
e40938a08c |
feat: enrichment table file url support (#9697)
### **PR Type**
Enhancement
Design at : enrichment-file-url
___
### **Description**
- Async URL-based enrichment table processing
- Event-driven MPSC, streaming CSV, batching
- Retry with backoff, status updates
- Database and ORM additions
- `enrichment_table_urls` table and migration
- HTTP API endpoints
- POST `/url` import and GET status
- Frontend enhancements
- Tabs, status icons, retry button
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["HTTP POST /{org}/enrichment_tables/{table}/url"] --> B["DB: save_url_job"]
B --> C["trigger_url_job_processing()"]
C --> D["MPSC Channel"]
D --> E["process_url_jobs()"]
E --> F["process_single_url_job()"]
F --> G["validate_url() & fetch_and_process_batches()"]
G --> H["parse_csv_chunk() & save_enrichment_batch()"]
H --> I["save_url_job() update status"]
I --> J["notify_update()"]
```
<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><details><summary>14
files</summary><table>
<tr>
<td><strong>url_processor.rs</strong><dd><code>Implement async URL
enrichment table processor</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-d39589e34157fe7930563b9bc5740128e168b8d8ac0a90371a4bdf1e52ce058b">+1351/-0</a></td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Add URL enrichment table HTTP
endpoints</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-7b5b203002d1c3e5f671392a2a8ed84f45225896b652c2dac94ac26e72a43124">+301/-1</a>
</td>
</tr>
<tr>
<td><strong>enrichment_table.rs</strong><dd><code>Add URL job CRUD
persistence functions</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-6ce27ddf8a0d8b4e790bda90d088ff692a5da31a8d330beea8a9dd843294572b">+159/-2</a>
</td>
</tr>
<tr>
<td><strong>enrichment_table_urls.rs</strong><dd><code>SeaORM logic for
URL job records</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-e9ba1ba6e742e8d7652c3f31765de43bee061e7983bca67ffefecf8590210188">+173/-0</a>
</td>
</tr>
<tr>
<td><strong>enrichment_table.rs</strong><dd><code>Define URL job status
and job struct</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-29818b7d921497260251df82a49ae9ab7a93bbaedc0ca03abdf2b8c0726e4085">+90/-0</a>
</td>
</tr>
<tr>
<td><strong>pipelines.rs</strong><dd><code>Handle super-cluster URL job
events</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-7c8aa678045dd00de89d4c2345cf4a0511ce9bfac5d6f64e7404178c81e541ad">+23/-1</a>
</td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Expose url_processor module in
service</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-3e2b6d3b8da1f9e73aca279052a97e683184d68256c23215b18ffee885836bbf">+6/-0</a>
</td>
</tr>
<tr>
<td><strong>enrichment_table_urls.rs</strong><dd><code>Define SeaORM
entity for URL jobs</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-9c3081476927bd337b2cbed8310578869845a6137a2c5305f677affb7604d39f">+26/-0</a>
</td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Register URL handlers in
router</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-02556e3f515441b5d2b6bbea7829df488beac03c4cc41309a6638ae3c0e0aec6">+2/-0</a>
</td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Expose enrichment_table_urls entity
module</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-c539d7557d1425986d5c09849d8dbca42d1b309c2bc33d49db641d6a783098f6">+1/-0</a>
</td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Add enrichment_table_urls to table
module</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-af023301203a27a1ef34f698d5a329ad7bfced65ac65e3829b1c0905a0c74fb2">+1/-0</a>
</td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Include enrichment_table meta
module</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-bab79e8da2d0d9f903cb1a6187d922c6de63d3e4561e8ce633660b664b4e859f">+1/-0</a>
</td>
</tr>
<tr>
<td><strong>jstransform.ts</strong><dd><code>Add client methods for URL
jobs API</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-301add2528e0f32323ca4c503bd7d460ab15ca6b9a9537192a02c5e52fd82926">+18/-0</a>
</td>
</tr>
<tr>
<td><strong>EnrichmentTableList.vue</strong><dd><code>Enhance UI for
URL-based enrichment tables</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-6a29e253f59405d3c0f756dba36afd7483f10ad86927cbbc3348ede6372c3077">+327/-74</a></td>
</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>3 files</summary><table>
<tr>
<td><strong>m20251221_000001_create_enrichment_table_urls.rs</strong><dd><code>Create
migration for URL jobs table</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-330b4b7ebbda5001f4f28050d50e219b91961d80d8369222d94d058cced57702">+189/-0</a>
</td>
</tr>
<tr>
<td><strong>config.rs</strong><dd><code>Add URL fetch configuration
options</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-9aeee4a74c0520daa40f9b81c7016f5b6b3254375b968dd7598e745630980d62">+24/-0</a>
</td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Register URL jobs migration in
migrator</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-7ee42a714d3d56c663da0412d15514613222055aebb5b50dafbc051a656a36f6">+2/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>1
files</summary><table>
<tr>
<td><strong>openapi.rs</strong><dd><code>Document URL endpoints in
OpenAPI spec</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-edb8ce232c0cd08366879f642788a75d99f6bab64b4c0e77391281fdb9241e90">+5/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Bug
fix</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>auth.rs</strong><dd><code>Extend auth for enrichment_tables
URLs</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-9bc2b1841504a435f66ad094f72ddbe7b7fa75e5e1557b8adbfe36f7f0592e1b">+9/-1</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Additional
files</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>AddEnrichmentTable.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9697/files#diff-9aad551dbc051edfdb3994a664506ed6d5e27dcb64f9c2fa917b02e51a35d86e">+159/-42</a></td>
</tr>
</table></details></td></tr></tr></tbody></table>
</details>
___
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
|
||
|
|
b655251ae4 |
test: refactor pipeline e2e tests with page object model improvements (#9715)
## Summary
- Refactored pipeline e2e tests to use page object model pattern
- Replaced raw selectors with reusable page object methods
- Added proper test tags for categorization and filtering
- Fixed undefined helper functions in spec files
- **Fixed all raw locators in Pipeline spec files (~55 total)**
## Changes Made
### pipelines.spec.js
- Replaced ~50 raw locators with page object methods
- Added LoginPage for authentication abstraction
- Added test tags `[@all, @pipelines]`
- Added assertion to "should delete the create source node on
confirmation" test
### pipeline-core.spec.js
- Fixed 3 raw locators in VRL editor interactions
- Fixed undefined helper functions (`applyQueryButton`, `ingestion`,
`exploreStreamAndNavigateToPipeline`)
- Replaced raw selectors with page object methods
- Added proper node connection methods
- Added test tags `[@all, @pipelines, @pipelinesCore]`
### pipeline-dynamic.spec.js
- Added LoginPage for authentication abstraction
- Added test tags `[@all, @pipelines, @pipelinesDynamic]`
### pipelineImport.spec.js
- Fixed 2 raw locators (`page.locator('input[type="file"]')`)
- Added testLogger import
- Added test tags `[@enterprise, @pipelines, @pipelinesImport]`
### pipelinesPage.js - New Methods Added
- `deleteOutputStreamNode()` - Delete output stream node by hover and
click
- `verifyOutputStreamNodeDeleted()` - Verify node deletion
- `connectInputToOutput()` - Connect input node directly to output node
- `connectNodesViaMiddleNode()` - Connect nodes via function/condition
- `fillDestinationStreamName()` - Fill destination stream name field
- `deletePipelineByName()` - Delete pipeline by name
- `fillConditionFields()` - Fill FilterGroup condition fields
- `selectStreamOption()` - Select stream from dropdown
- `exploreStreamAndInteractWithLogDetails()` - Navigate streams and
interact with logs
- `cancelAndDeletePipeline()` - Cancel pipeline creation and delete
- `bulkIngestToStreams()` - Perform bulk ingestion to multiple streams
- **30+ new methods for raw locator fixes** (VRL editor, SQL editor,
query nodes, etc.)
### pipelinesEP.js - New Methods Added
- `fileInput` locator
- `setFileInput()` - Set file input for pipeline import
## Raw Locator Fixes Summary
| File | Raw Locators Fixed |
|------|-------------------|
| pipelines.spec.js | ~50 |
| pipeline-core.spec.js | 3 |
| pipelineImport.spec.js | 2 |
| **Total** | **~55** |
## Test Results
| Test File | Status |
|-----------|--------|
| pipeline-core.spec.js | ✅ 2 passed, 1 skipped |
| pipeline-dynamic.spec.js | ✅ 3 passed |
| pipelines.spec.js | ✅ 14 passed, 4 skipped |
## Test Plan
- [x] Verified pipeline-core.spec.js tests pass
- [x] Verified pipeline-dynamic.spec.js tests pass
- [x] Verified pipelines.spec.js tests pass
- [x] Verified no raw locators remain in Pipeline spec files
|
||
|
|
268fe6954a |
fix: logs correlation UI fixes (#9703)
### **PR Type**
Enhancement, Bug fix
___
### **Description**
- Enhance correlation dashboard UI layout
- increase chart height, update filter button styles
- Improve DetailTable correlation tab behavior
- add initialTab prop and auto-load watchers
- Adjust log detail navigation column sizes
- Extend correlation handlers in JSON and SearchResult
___
<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>useMetricsCorrelationDashboard.ts</strong><dd><code>Increase
correlation dashboard chart height</code>
</dd></summary>
<hr>
web/src/composables/useMetricsCorrelationDashboard.ts
- Increase dashboard chart height from 36 to 44 units
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9703/files#diff-61aa6123b09464987fa96e7e48c9e3d4648735b5bfc996d49af639f44f833c4d">+1/-1</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>TelemetryCorrelationDashboard.vue</strong><dd><code>Update
correlation dashboard filter buttons</code>
</dd></summary>
<hr>
web/src/plugins/correlation/TelemetryCorrelationDashboard.vue
<ul><li>Add flat prop and update text-color on apply buttons<br> <li>
Change filter v-for to use pendingDimensions<br> <li> Update event
handlers for pending dimension changes<br> <li> Add embedded mode apply
button with styling</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9703/files#diff-b77a766fa0094f641873071a8f13c73704933b941f387ed105e85a4e59efdb38">+19/-6</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>DetailTable.vue</strong><dd><code>Enhance DetailTable
correlation loading</code>
</dd></summary>
<hr>
web/src/plugins/logs/DetailTable.vue
<ul><li>Adjust navigation button columns from col-2 to col-1<br> <li>
Introduce initialTab prop for default tab selection<br> <li> Add
watchers to auto-load correlation data on tab/rowData<br> <li> Emit
correlation events with original modelValue</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9703/files#diff-80552b5d25fa6cef9fbbe430b1865d761c4b132284c2d2175afceea8cbabc8c7">+61/-12</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>JsonPreview.vue</strong><dd><code>Refine JSON preview
correlation handler</code>
</dd></summary>
<hr>
web/src/plugins/logs/JsonPreview.vue
<ul><li>Reformat deep watch callback for selectedStreamFields<br> <li>
Update openCorrelation to log and emit props.value</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9703/files#diff-3985073134d35ff074742944b114d0905524038b42e6d2ac887fef2c8436fb16">+14/-10</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>SearchResult.vue</strong><dd><code>Implement direct
correlation on log rows</code>
</dd></summary>
<hr>
web/src/plugins/logs/SearchResult.vue
<ul><li>Rename correlation handler to openLogDetailsWithCorrelation<br>
<li> Add detailTableInitialTab state and reset logic<br> <li> Implement
direct correlation row opening and loading</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9703/files#diff-5e65533aa4754bb6d0074fda18ffc1ecacded3b9ca6bc28a161c3f6b12f20195">+45/-1</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>detail-table.scss</strong><dd><code>Increase detail
dialog width</code>
</dd></summary>
<hr>
web/src/styles/logs/detail-table.scss
- Increase .searchdetaildialog width from 70vw to 85vw
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9703/files#diff-63d5673331a5ee1ab792d07831e4a6dbb0d2d40d2ad628652d57944e47a96338">+1/-1</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
ddd4c0048a |
test: update alerts e2e tests for new UI flow (#9705)
### **User description** ## Summary - Fix destination import test locator in `verifyDestinationCountMessage()` - Move inline locators to constructor in alertsPage.js and alertTemplatesPage.js - Update alerts spec files for Alerts 2.0 wizard flow ## Test plan - [x] Run `npx playwright test playwright-tests/Alerts/` - all tests pass - [x] Sentinel audit passed with no critical issues ___ ### **PR Type** Tests, Enhancement ___ ### **Description** - Enhance AlertsPage for 2.0 wizard UI (create/update/pause/resume) - Add import success and count verifications in AlertDestinationsPage - Centralize locators in AlertTemplatesPage - Update specs to use new page methods and clearAndFillQueryEditor ___ <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>7 files</summary><table> <tr> <td><strong>alertDestinationsPage.js</strong><dd><code>Add import success and count verification methods</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9705/files#diff-57e5c53b4ef998b3d8708149620ff94dcc46807927f1a3a9e9f28ed3ebe25b0a">+30/-0</a> </td> </tr> <tr> <td><strong>alertTemplatesPage.js</strong><dd><code>Move inline locators into constructor</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9705/files#diff-f4ebd248b2140051e74dbbbd1aabe344f01c80704ce5857e9c28a04350e018f3">+12/-7</a> </td> </tr> <tr> <td><strong>alertsPage.js</strong><dd><code>Refactor for Alerts 2.0 wizard UI and new actions</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9705/files#diff-79ee01d6d7f145f19207b93b87143b545a1188cfc6a82bc8c45fecfbf68f8a1d">+537/-155</a></td> </tr> <tr> <td><strong>dashboard-folder.js</strong><dd><code>Use data-test locator for folder visibility</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9705/files#diff-2c20ba97d8e487482cb8fafab72dc6ac96b8a8935ca7e16383afb6173372082e">+4/-1</a> </td> </tr> <tr> <td><strong>alerts-import.spec.js</strong><dd><code>Use new page methods for import verifications</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9705/files#diff-62b6ec4818685eacc0a934d68aaadfd73b512ef4f4be25fcd5135b97c2844912">+4/-4</a> </td> </tr> <tr> <td><strong>alerts-ui-operations.spec.js</strong><dd><code>Replace raw locators with page object validations</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9705/files#diff-c9b523b5f5dea834b69abdf20f4acef361bdf37b1585c450e10238b1d1984f2e">+3/-3</a> </td> </tr> <tr> <td><strong>logs-regression.spec.js</strong><dd><code>Replace editor calls with clearAndFillQueryEditor</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9705/files#diff-99da86ede55fa5f2e3d3fbef897ba7aaa5a7db702a0135f66ac4c888fc7311b6">+4/-6</a> </td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___ |
||
|
|
18c0670d95 |
test: enable line chart update for camel case SQL queries (#9692)
### **PR Type**
Tests
___
### **Description**
- Re-enable dashboard line chart test for camel case SQL queries
___
<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>dashboard.spec.js</strong><dd><code>Activate camel case
SQL chart test</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/dashboards/dashboard.spec.js
<ul><li>Removed skip flag from test definition<br> <li> Activated test
for camel case SQL line chart updates</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9692/files#diff-d0fa0042783dc109334b05266edce228bad97adcb568dd1e447920596238e9b4">+1/-1</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
8173c3cb41 |
test: updated query for logs regression spec file and added waits (#9698)
### **PR Type**
Tests, Enhancement
___
### **Description**
- Updated test subquery to select `kubernetes_pod_name`
- Replaced editor interactions with `clearAndFillQueryEditor`
- Added explicit `waitForTimeout` calls for stability
___
<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>logs-regression.spec.js</strong><dd><code>Enhance query
flow and stability in test</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/RegressionSet/logs-regression.spec.js
<ul><li>Modified SQL subquery to select single column<br> <li> Replaced
<code>clickQueryEditor</code> & <code>typeInQueryEditor</code> with
<br><code>clearAndFillQueryEditor</code><br> <li> Added
<code>waitForTimeout</code> calls around query execution steps</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9698/files#diff-99da86ede55fa5f2e3d3fbef897ba7aaa5a7db702a0135f66ac4c888fc7311b6">+4/-3</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
|
||
|
|
4d76b1078a |
test: enhance E2E test coverage with landing page and language translation tests (#9686)
### **PR Type** Tests, Enhancement ___ ### **Description** - Remove duplicate Playwright dependencies - Enhance HomePage and StreamsPage POMs with selectors and methods - Add landing page and language translation E2E tests - Extend multistream, stream settings, creation, streaming tests ___ ### **Test Coverage Added** #### Landing Page Tests (landingPage.spec.js) Tests navigation and state preservation across the application: - **14 pages tested**: 7 sidebar pages + 7 settings tabs - **Sidebar pages**: Home, Metrics, Traces, Dashboards, Streams, Alerts, Ingestion - **Settings tabs**: General, Organization Parameters, Alert Destinations, Pipeline Destinations, Templates, Cipher Keys, Sensitive Data Redaction - **Validates**: UI elements on each page, logs state preservation after navigation, header elements (logo, menus, org selector) - **Result**: All 14 pages preserve logs state correctly #### Language Translation Tests (languageTranslation.spec.js) Tests translation coverage across the entire application: - **10 languages tested**: German, Spanish, French, Italian, Dutch, Portuguese, Turkish, Japanese, Korean, Chinese (Simplified) - **12 main pages**: Home, Logs, Metrics, Traces, RUM, Pipelines, Dashboards, Streams, Reports, Alerts, Data Sources, IAM - **22 sub-pages/tabs**: Covers all nested navigation sections - **Coverage threshold**: 80% (ideal), 70% (acceptable) - **Execution**: Runs in parallel for all languages ___ ### Diagram Walkthrough ```mermaid flowchart LR DependenciesFix["Fix Playwright dependencies"] HomePagePOM["Enhanced HomePage POM"] StreamsPagePOM["Enhanced StreamsPage POM"] LandingTests["Landing Page Tests"] LangTests["Language Translation Tests"] StreamCreation["Stream Creation Tests"] MultiStream["Multistream & Streaming Tests"] SettingsTests["Stream Settings Tests"] NameCasing["Stream Name Casing Tests"] DependenciesFix --> HomePagePOM DependenciesFix --> StreamsPagePOM HomePagePOM --> LandingTests HomePagePOM --> LangTests StreamsPagePOM --> StreamCreation StreamsPagePOM --> MultiStream StreamsPagePOM --> SettingsTests StreamsPagePOM --> NameCasing ``` <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><details><summary>2 files</summary><table> <tr> <td><strong>homePage.js</strong><dd><code>Add landing page selectors and navigation methods</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-a87a274f3fb078f54064ee23c75018dee7d10e99cd19e44134580e360bc829e2">+524/-66</a></td> </tr> <tr> <td><strong>streamsPage.js</strong><dd><code>Add stream creation methods and no-data handling</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-792df584eb1625d35fd1e33a5a37aa3ada28f15ec1e77a1921f1c56e50bf70d2">+250/-1</a> </td> </tr> </table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>7 files</summary><table> <tr> <td><strong>landingPage.spec.js</strong><dd><code>Add landing page navigation state tests</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-64b7396577833870bf18b21492967ad1e46cefaebaabad6792022bac038b5d96">+590/-0</a> </td> </tr> <tr> <td><strong>languageTranslation.spec.js</strong><dd><code>Add language translation coverage tests</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-f3ec604702d670acc0417e71327aae98e8255d63d53c68644c458ef913056276">[link]</a> </td> </tr> <tr> <td><strong>multiselect-stream.spec.js</strong><dd><code>Enhance multistream selection and tagging</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-057fce3dbfdd642ca63bece7ba136c34cb5e293de63bf895a6fb212b067d447a">+51/-49</a> </td> </tr> <tr> <td><strong>stream-settings.spec.js</strong><dd><code>Add stream settings configuration tests</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-05c1f861248ccaeb39b5ccd13bcbf2903de53a59e8522bd5344247f769940b15">+51/-46</a> </td> </tr> <tr> <td><strong>streamCreation.spec.js</strong><dd><code>Add stream creation feature test suite</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-fc1b39bc28f6ebeb48d74c674213ad4eac9c85580def23ed6be257042a4d2d32">+234/-0</a> </td> </tr> <tr> <td><strong>streaming.spec.js</strong><dd><code>Add streaming flow tests with logging</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-1428c96aa08768746bd6a299d9d3956bc687e1d1d1dead12c6bc73dfa579d61c">+19/-10</a> </td> </tr> <tr> <td><strong>streamname.spec.js</strong><dd><code>Add stream name casing preservation tests</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-49828efdc034005c097422deadc8b892bb1e54942d024e40d640fd10c5aa2793">+41/-10</a> </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>Include new specs in CI workflow</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+2/-0</a> </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>Remove redundant Playwright dependencies</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9686/files#diff-a41ba7975823b7b2dc071285391f835fbefd33bfffeb5aa2fba3ae15425cc64f">+0/-4</a> </td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___ |
||
|
|
a51605938e |
feat: dashboard copy legends and table cells (#9677)
### **PR Type** Enhancement ___ ### **Description** - Add "Show Legends" feature for chart panels - PanelContainer and AddPanel integrated dialog - PanelSchemaRenderer emits show-legends event - New ShowLegendsPopup component for listing and copying legends - Add copy button to table cells in TableRenderer - Update translations with legend labels ___ ### Diagram Walkthrough ```mermaid flowchart LR PanelSchemaRenderer["PanelSchemaRenderer"] -- "show-legends" --> ShowLegendsPopup["ShowLegendsPopup"] TableRenderer["TableRenderer"] -- "copy-cell" --> Clipboard["Clipboard"] ``` <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><details><summary>5 files</summary><table> <tr> <td><strong>PanelContainer.vue</strong><dd><code>Integrate ShowLegendsPopup dialog and state</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-414737cba6064461f7026e0b016afcb9620bd5bb29c4708fc170dee789dbcd4d">+23/-0</a> </td> </tr> <tr> <td><strong>PanelSchemaRenderer.vue</strong><dd><code>Add "Show Legends" button and emit event</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-e5376e7e77bf3aaf6590c2522d8c2dbffcc95a8006ae0d6dc0040a37825367d6">+31/-2</a> </td> </tr> <tr> <td><strong>ShowLegendsPopup.vue</strong><dd><code>New component for legends list and copying</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-e02401241391109f2082ad6742374ff47ad79af8abf37a4bfa6ebeaae3f11322">+377/-0</a> </td> </tr> <tr> <td><strong>TableRenderer.vue</strong><dd><code>Add copy-to-clipboard button in table cells</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-794706ea9da3a70012a0327c0464f9fd16802f78ece26055fe951716c2d73d59">+80/-15</a> </td> </tr> <tr> <td><strong>AddPanel.vue</strong><dd><code>Integrate ShowLegendsPopup in AddPanel view</code> </dd></td> <td><a href=""></a></td> </tr> </table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>11 files</summary><table> <tr> <td><strong>de.json</strong><dd><code>Add German translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-78f24ecb2dbcfc38fdf3ec22b2559a5b40d236ea689d1c55f5d3e87168310264">+7/-2</a> </td> </tr> <tr> <td><strong>en.json</strong><dd><code>Add English translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-892aa3d75ab6e129ef9116aa21bec1b9a15ba69ce5366d2a19128078c690d824">+6/-1</a> </td> </tr> <tr> <td><strong>es.json</strong><dd><code>Add Spanish translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-ac2a2167b8b973e3f776f9fe3b43bef4576470d8ad33f3d7cfaff6edff0e5778">+7/-2</a> </td> </tr> <tr> <td><strong>fr.json</strong><dd><code>Add French translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-db80e762b88ddf183820c050cdc6b215e6b02b365b5e73f5152af46b0d26f1a2">+7/-2</a> </td> </tr> <tr> <td><strong>it.json</strong><dd><code>Add Italian translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-2de78074a5f887afddce60d694ead9322e6ab223eb70251c13819f3028bdc70d">+7/-2</a> </td> </tr> <tr> <td><strong>ja.json</strong><dd><code>Add Japanese translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-092e49c5f9fbc1b539ab9c2866d108d0ce1d314022b4c294eb4611b285e7bbd3">+7/-2</a> </td> </tr> <tr> <td><strong>ko.json</strong><dd><code>Add Korean translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-50e27ca1b4825a5026f3a251bfcf79c97cab07cfade2ebd512d332453d707c48">+7/-2</a> </td> </tr> <tr> <td><strong>nl.json</strong><dd><code>Add Dutch translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-a1706021687ae5d8a1c006c49eab3946174fecd895f9b70a89c2e76d97250906">+7/-2</a> </td> </tr> <tr> <td><strong>pt.json</strong><dd><code>Add Portuguese translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-38e804f64cb5e0e451849fc84e9b46e53c954a4a4263d51c18665ad45f4b4815">+7/-2</a> </td> </tr> <tr> <td><strong>tr.json</strong><dd><code>Add Turkish translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-6f0f131e9e2591480c4c5d1eaffc72d02dc31cbd8d3f90d8f012f08cabac8818">+7/-2</a> </td> </tr> <tr> <td><strong>zh.json</strong><dd><code>Add Chinese translations for legend feature</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-8818055db58f83230aeea4ebfd4cec31d924e8c47b6f91298e356959ab25339e">+7/-2</a> </td> </tr> </table></details></td></tr><tr><td><strong>Additional files</strong></td><td><details><summary>1 files</summary><table> <tr> <td><strong>AddPanel.vue</strong></td> <td><a href="https://github.com/openobserve/openobserve/pull/9677/files#diff-c9632db1ad95af95aba10161bcbc7c5608318919f228637bdafae3f3a31267e8">+38/-0</a> </td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___ Design at: https://github.com/openobserve/designs/blob/main/dashboards/copy-legends-and-table-cells/design-doc.md --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: ktx-akshay <akshay.patil@kiara.tech> |
||
|
|
24b024a502 |
test: automation for bugs fixes (#9678)
### **User description** ## Summary Refactored the logs regression test suite to follow the Page Object Model (POM) pattern by centralizing all locators in the logsPage.js POM file and updating test files to use these locators instead of hardcoded selectors. ## Testing All 10 regression tests passing: - ✅ Absolute time error validation - ✅ Stream switching with saved views (#9388) - ✅ Field values with SUBQUERY/CTE/GROUP BY (#7751) - ✅ Pagination count after search (#8868) - ✅ Alert graph color display (#9311) - ✅ Histogram query from history (#8180) - ✅ Timestamp field in quick mode (#8180) - ✅ Source field display logic (#8180) Test execution: 10/10 passed in 7.2 minutes ___ ### **PR Type** Tests, Enhancement ___ ### **Description** - Refactor logs regression tests to Page Object Model - Centralize all locators in `logsPage.js` - Add new POM locators for regression tests - Add regression tests for bug #7751 (subquery, CTE, GROUP BY) - Add regression tests for bug #8868 (pagination count update) - Add regression test for bug #9311 (alert graph color) - Add regression tests for bug #8180 (histogram, timestamp, source field) ___ ### Diagram Walkthrough ```mermaid flowchart LR A["logsPage.js: New POM locators"] --> B["logs-regression.spec.js: Bug regression tests"] ``` <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 POM locators for regression tests</code> </dd></summary> <hr> tests/ui-testing/pages/logsPages/logsPage.js <ul><li>Added alert-related selectors (<code>alertsMenuItem</code>, <code>alertGraph</code>, <code>alertChart</code>)<br> <li> Added query history selectors (<code>queryHistoryButton</code>, <code>historyPanel</code>)<br> <li> Added table and pagination selectors (<code>tableBottom</code>, <code>tableBodyRow</code>, <br><code>tableHeaders</code>)<br> <li> Added dynamic field selector functions (<code>fieldExpandButton</code>, <br><code>subfieldAddButton</code>, etc.)<br> <li> Added streams search, error indicators, timestamp detail selectors</ul> </details> </td> <td><a href="https://github.com/openobserve/openobserve/pull/9678/files#diff-8045b343491d8943869c1af74cdafab204dc49c02a70294417e73f47d35e0b59">+29/-0</a> </td> </tr> </table></td></tr><tr><td><strong>Tests</strong></td><td><table> <tr> <td> <details> <summary><strong>logs-regression.spec.js</strong><dd><code>Add regression tests for major log search bugs</code> </dd></summary> <hr> tests/ui-testing/playwright-tests/RegressionSet/logs-regression.spec.js <ul><li>Added tests for bug #7751: subquery, CTE, GROUP BY field expansion<br> <li> Added test for bug #8868: pagination count after filtering<br> <li> Added test for bug #9311: full alert graph color rendering<br> <li> Added tests for bug #8180: histogram query, timestamp in quick mode, <br>source field logic</ul> </details> </td> <td><a href="https://github.com/openobserve/openobserve/pull/9678/files#diff-99da86ede55fa5f2e3d3fbef897ba7aaa5a7db702a0135f66ac4c888fc7311b6">+538/-0</a> </td> </tr> </table></td></tr></tr></tbody></table> </details> ___ --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
660dfbabaf |
test: Dashboard Joins and Nested Functions e2e tests (#9685)
### **PR Type**
Tests, Enhancement
---
### **Description**
This PR adds comprehensive E2E tests for Dashboard Joins and Dashboard
Functions features, along with supporting page object helpers.
#### Key Changes:
- **Dashboard Joins Tests**: 8 consolidated multi-panel tests covering
INNER/LEFT/RIGHT joins, conditions, aggregations, field selection,
filters, dynamic operations, persistence, and error handling
- **Dashboard Functions Tests**: 2 multi-panel tests covering basic
(COUNT, COUNT-DISTINCT, AVG, SUM) and advanced (Multiple Y-axis, MIN,
MAX) aggregation functions
- **New `JoinHelper` class**: Provides methods for configuring join
types, streams, conditions, and operators
- **Enhanced `ChartTypeSelector`**: Added Y-axis function configuration
methods and stream selection with retry mechanism
- **Org Context Fix**: Navigate directly to dashboards with
`org_identifier` parameter to ensure correct API context
---
### **Test Coverage**
#### Dashboard Joins Tests (`dashboard-join.spec.js`) - 8 Tests
| # | Test Name | Panels | Coverage | Tags |
|---|-----------|--------|----------|------|
| 1 | Core Join Types - INNER, LEFT, RIGHT | 3 | INNER JOIN (11 rows),
LEFT JOIN (12 rows), RIGHT JOIN (5 rows) | `@dashboard-joins`, `@smoke`,
`@P0` |
| 2 | Join Conditions & Multi-Join | 3 | Multiple AND conditions, 3-way
join, OR conditions | `@dashboard-joins`, `@dashboard-joins-conditions`,
`@P1` |
| 3 | Aggregation Functions | 4 | Basic aggregation, SUM-like grouping,
AVG-like grouping, COUNT grouping | `@dashboard-joins`,
`@dashboard-joins-aggregation`, `@P1` |
| 4 | Field Selection | 4 | response_time_ms, country, bytes, request_id
fields | `@dashboard-joins`, `@dashboard-joins-fields`, `@P2` |
| 5 | Filters & Edge Cases | 6 | Join with filter, LEFT JOIN with NULLs,
session duration, not-equal (!=), greater-than (>), self-join |
`@dashboard-joins`, `@dashboard-joins-filters`, `@P2` |
| 6 | Dynamic Join Operations & UI Validation | 1 | Add/remove joins,
change join types, modify conditions | `@dashboard-joins`,
`@dashboard-joins-dynamic`, `@P2` |
| 7 | Persistence - Save and Reload Dashboard | 1 | Save panel, navigate
away, reload, verify join config persisted | `@dashboard-joins`,
`@dashboard-joins-persistence`, `@P2` |
| 8 | Error Handling & Recovery | 1 | Incomplete join handling, recovery
from invalid state | `@dashboard-joins`, `@dashboard-joins-errors`,
`@P3` |
#### Dashboard Functions Tests (`dashboard-nested-functions.spec.js`) -
2 Tests
| # | Test Name | Panels | Coverage | Tags |
|---|-----------|--------|----------|------|
| 1 | Basic Aggregation Functions | 4 | COUNT, COUNT-DISTINCT, AVG, SUM
functions | `@dashboard-functions`, `@dashboard-functions-basic`, `@P1`
|
| 2 | Advanced Aggregation Functions | 2 | Multiple Y-axis (COUNT + SUM
+ AVG), MIN + MAX functions | `@dashboard-functions`,
`@dashboard-functions-advanced`, `@P2` |
---
### **New Page Object Methods**
#### `JoinHelper` (`dashboard-joins.js`)
| Method | Description |
|--------|-------------|
| `addJoin()` | Open add join popup |
| `selectJoinType(type)` | Select INNER/LEFT/RIGHT/FULL/CROSS join |
| `selectJoinStream(streamName)` | Select stream to join with |
| `selectLeftField(field)` | Select left side join field |
| `selectRightField(field)` | Select right side join field |
| `selectOperator(operator)` | Select =, !=, <, >, <=, >= operator |
| `addCondition()` | Add another join condition |
| `saveJoin()` | Save join configuration |
| `removeJoin(index)` | Remove a join by index |
| `verifyJoinChipVisible(stream, index)` | Verify join chip displays
correctly |
#### `ChartTypeSelector` (`dashboard-chart.js`)
| Method | Description |
|--------|-------------|
| `selectStream(name, retries)` | Select stream with retry mechanism |
| `configureYAxisFunction(alias, func)` | Configure Y-axis aggregation
function |
| `verifyYAxisLabel(alias, func)` | Verify Y-axis label shows function |
| `openYAxisFunctionPopup(alias)` | Open Y-axis configuration popup |
| `selectFunction(name)` | Select aggregation function from dropdown |
#### `DashboardPanelActions` (`dashboard-panel-actions.js`)
| Method | Description |
|--------|-------------|
| `addNextPanel()` | Add another panel after saving |
| `getTableRowCount()` | Get count of data rows in table |
| `verifyChartRenders(expect)` | Verify chart/table renders |
| `savePanel()` | Save panel with networkidle wait |
---
### **Test Data**
Test data files located in `test-data/` directory:
- `joins/test_app_users.json` - 5 user records
- `joins/test_web_requests.json` - 12 web request records
- `joins/test_sessions.json` - 8 session records
- `dashboard-functions/test_records.json` - 7 records with user_name and
score fields
---
### **Fixes Included**
| Issue | Fix |
|-------|-----|
| Org context mismatch on remote environments | Navigate to
`/web/dashboards?org_identifier=${ORGNAME}` |
| Streams not appearing in dropdown | Page reload after dashboard
creation to refresh stream list |
| Save panel race condition | Added `waitForLoadState("networkidle")`
after save click |
| Stream selection timing | Retry mechanism with debug logging |
| Test 5 timeout | Increased to 5 minutes for 6-panel test |
---
<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><details><summary>5
files</summary><table>
<tr>
<td><strong>dashboard-chart.js</strong><dd><code>Enhance stream
selection and add Y-axis function methods</code> </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-573a312576fce62d8e14f2bbb5f9b7d9a552d746304dce3d79862edddd24de76">+106/-14</a></td>
</tr>
<tr>
<td><strong>dashboard-create.js</strong><dd><code>Add smart panel
addition for empty and existing dashboards</code></dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-c3c5add2b934580a91a79bb580634b70e2376b0452113008a0911102db3863e2">+25/-1</a>
</td>
</tr>
<tr>
<td><strong>dashboard-joins.js</strong><dd><code>New JoinHelper for
configuring and validating joins</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-f88eb0cf951ec45e97befde5c83a2c187bb46db3f6cb27bc0cb88d48c5f45b78">+351/-0</a>
</td>
</tr>
<tr>
<td><strong>dashboard-panel-actions.js</strong><dd><code>Add next-panel,
row count and chart render verifications</code> </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-d29713fdcc11cbc93bda29da5261da389226cd718e4292a1c2cd96629f573a80">+76/-1</a>
</td>
</tr>
<tr>
<td><strong>global-setup.js</strong><dd><code>Include org_identifier in
login navigation URL</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-06323dad7214f86b41b62e121e716eeea0054bc4d950c6bcf4a0efe53894acc8">+4/-3</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>6
files</summary><table>
<tr>
<td><strong>dashboard-join.spec.js</strong><dd><code>Consolidated
dashboard joins feature E2E tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-552f4ba6f199ade20dbab2c54b8573422fd644587ed1575262a7aa34f8041174">+1160/-0</a></td>
</tr>
<tr>
<td><strong>dashboard-nested-functions.spec.js</strong><dd><code>Multi-panel
dashboard functions E2E tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-d2a9855da60f5fd3820832815036c368a680e2885033ad1a7a2bcbd060e2a750">+372/-0</a>
</td>
</tr>
<tr>
<td><strong>test_records.json</strong><dd><code>Add test data for
dashboard functions tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-3a09d97f4091ae2f4dc97ebc14199c5d94efb878a6ebfa7da686cad5450ddda0">+7/-0</a>
</td>
</tr>
<tr>
<td><strong>test_app_users.json</strong><dd><code>Add user data for
dashboard joins tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-7c5af3decd88c4f9031fd83282844872f4a0a65eea2b51a46aac849aa4a5c129">+7/-0</a>
</td>
</tr>
<tr>
<td><strong>test_sessions.json</strong><dd><code>Add session data for
dashboard joins tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-836e072600882ffa58662a4867ac17d2ce799dd338daac585203ccaa01275e3c">+10/-0</a>
</td>
</tr>
<tr>
<td><strong>test_web_requests.json</strong><dd><code>Add web request
data for dashboard joins tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-1c4b00b1929e9a01de1cb8129161c49dc1563a5dde1c4b5e770a307245155382">+14/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>cleanup.spec.js</strong><dd><code>Extend cleanup regex for
join and function test streams</code> </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+8/-1</a>
</td>
</tr>
</table></details></td></tr></tbody></table>
</details>
---
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
|
||
|
|
ac60e181dd |
feat: dashboard join support for auto sql (#9343)
# Nested Functions and Joins - User Guide ## Overview This guide covers two powerful features that enable sophisticated data analysis in OpenObserve: - **Nested Functions**: Combine multiple functions together to create complex calculations - **Joins**: Merge data from multiple streams (data sources) based on common fields These features work in the **Auto SQL** mode of dashboard panels, allowing you to write advanced queries without deep SQL knowledge. --- ## What's New ### Why These Features? **Before:** - Limited function composition - you could only use basic, single-level functions - No way to combine data from multiple streams in one query - Complex analytics required exporting data and manual processing **Now:** - Compose unlimited nested functions with full DataFusion support - Join multiple streams directly in the dashboard panel editor - Create sophisticated analytics queries with a visual interface ### Key Benefits ✓ Calculate complex metrics (error rates, percentiles, conditional aggregations) ✓ Build advanced dashboards without custom code ✓ Support for all DataFusion aggregate and scalar functions --- ## Nested Functions ### What Are Nested Functions? Nested functions let you combine multiple functions together - using the output of one function as input to another. Think of it like a cooking recipe where each step builds on the previous one. **Simple Example:** - Basic: `AVG(response_time)` - calculates average response time - Nested: `ROUND(AVG(response_time), 2)` - calculates average AND rounds it to 2 decimal places ### Supported Functions OpenObserve supports **all DataFusion functions**, giving you powerful analytics capabilities: **Aggregate Functions** (work across multiple rows): - `count`, `sum`, `avg`, `min`, `max` - basic aggregations - `median`, `stddev`, `variance` - statistical functions - `percentile_cont` - calculate percentiles (e.g., p95, p99) - `string_agg` - combine text values **Mathematical Functions**: - `round`, `ceil`, `floor` - rounding operations - `abs`, `power`, `sqrt` - mathematical operations - `log`, `log10`, `log2` - logarithmic functions - `sin`, `cos`, `tan` - trigonometric functions **String Functions**: - `concat`, `upper`, `lower`, `trim` - `substring`, `length`, `replace` **Conditional Functions**: - `CASE WHEN ... THEN ... ELSE ... END` - conditional logic - `COALESCE` - return first non-null value 📖 **Full Reference**: [DataFusion Aggregate Functions](https://datafusion.apache.org/user-guide/sql/aggregate_functions.html) | [DataFusion Scalar Functions](https://datafusion.apache.org/user-guide/sql/scalar_functions.html) --- ### Using Nested Functions (Step-by-Step) #### Step 1: Create or Edit a Dashboard Panel Open your dashboard and create a new panel or edit an existing one. Make sure you're in **Auto SQL** mode (not Custom SQL). #### Step 2: Select a Function In the Y-Axis or column configuration, click **Select Function** to choose your base function. <img width="795" alt="Nested Function - Adding Layers" src="https://github.com/user-attachments/assets/0b6b134e-59b8-48b1-a4ae-52fb4800d772" /> In this example, we're using the `Concat` function to combine multiple fields (namespace and pod name). #### Step 3: Add Nested Layers Click the function icon to add another function layer. You can nest functions multiple times. <img width="793" alt="Nested Function - Select Base Function" src="https://github.com/user-attachments/assets/4bd9e03e-1104-4e82-b2ec-a34e6bb64870" /> Here we're building a nested function: - Inner layer: `Avg(severity)` - calculates average severity - Outer layer: `Ceil()` - rounds up the average to the nearest integer #### Step 4: Build Complex Expressions For advanced analytics, you can combine nested functions with conditional logic using `CASE WHEN` statements. <img width="1340" alt="Complex Nested Function with CASE WHEN" src="https://github.com/user-attachments/assets/4c3e3623-bfad-44c4-a760-e10cc94d4a95" /> This example shows a sophisticated calculation: ```sql ROUND(100.0 * SUM(CASE WHEN COALESCE(severity, 0) >= 4 THEN 1 ELSE 0 END) / COUNT(_timestamp), 2) ``` **What this does:** 1. `COALESCE(severity, 0)` - replaces null severity with 0 2. `CASE WHEN severity >= 4 THEN 1 ELSE 0` - returns 1 for high severity, 0 otherwise 3. `SUM(...)` - counts high severity events 4. Divide by `COUNT(_timestamp)` - calculates percentage 5. Multiply by `100.0` - converts to percentage 6. `ROUND(..., 2)` - rounds to 2 decimal places **Result**: Percentage of high-severity events, rounded to 2 decimals #### Step 5: View the Generated SQL Switch to the **Raw** tab to see the complete SQL query that was generated from your nested function configuration. <img width="1388" alt="View Generated SQL" src="https://github.com/user-attachments/assets/d7f6111a-26c6-4dd0-9e9f-e26092fe6368" /> You can review the auto-generated SQL in the Query section at the bottom of the panel editor. The chart visualization updates in real-time as you build your nested functions. --- ## Joins ### What Are Joins? Joins allow you to combine data from two or more different streams (data sources) based on common fields between them. **Example:** **employee_data_join** stream: ```json [ {"employee_id": 1, "name": "Alice", "department_id": 1}, {"employee_id": 2, "name": "Bob", "department_id": 2}, {"employee_id": 3, "name": "Charlie", "department_id": null}, {"employee_id": 4, "name": "David", "department_id": 1}, {"employee_id": 5, "name": "Eve", "department_id": 3} ] ``` **dept_data_join** stream: ```json [ {"department_id": 1, "department_name": "HR"}, {"department_id": 2, "department_name": "Engineering"}, {"department_id": 3, "department_name": "Sales"}, {"department_id": 4, "department_name": "Marketing"} ] ``` A join lets you combine these streams to see the department name alongside each employee, matched by `department_id`. ### Types of Joins OpenObserve supports three types of joins: | Join Type | Description | When to Use | |-----------|-------------|-------------| | **INNER JOIN** | Returns only records with matches in both streams | When you need data that exists in both sources | | **LEFT JOIN** | Returns all records from left stream + matching records from right | When you want all data from your primary source, with supplemental info where available | | **RIGHT JOIN** | Returns all records from right stream + matching records from left | When you want all data from your secondary source, with supplemental info where available | > **Note:** UNION and CROSS joins are not currently supported. --- ### Using Joins (Step-by-Step) #### Step 1: Access the Joins Section In your dashboard panel editor, locate the **Joins** section. Click the **+** button to add a join. <img width="1725" alt="Access Joins Interface" src="https://github.com/user-attachments/assets/35db4f28-c526-43a2-bdd1-470e188f53d7" /> In this example: - **Primary stream**: `employee_data_join` (contains employee names) - We'll join it with `dept_data_join` (contains department information) - The interface shows available fields from both streams in the left panel #### Step 2: Configure the Join Click on the **Joins** dropdown and select the stream you want to join. Then configure: 1. **Joining Stream**: Select the stream to join (e.g., `employee_data_join`) 2. **Join Type**: Choose from LEFT, INNER, or RIGHT using the visual toggle 3. **On Stream**: Select the target stream (e.g., `dept_data_join`) <img width="1725" alt="Configure Join Type" src="https://github.com/user-attachments/assets/35db4f28-c526-43a2-bdd1-470e188f53d7" /> The interface displays: **"Performing a Left Join between employee_data_join and dept_data_join"** Notice the visual toggle showing three join types: - **Left** (selected in this example) - **Inner** - **Right** #### Step 3: Define the Joining Clause Set up the join condition by specifying which fields to match between the two streams: **Clause 1:** - **Select Field** (Left): Choose a field from the first stream (e.g., `department_id`) - **Select Operator**: Choose comparison operator (usually `=`) - **Select Field** (Right): Choose the matching field from the second stream (e.g., `department_id`) You can add multiple clauses using the **+** button for complex join conditions (e.g., joining on multiple fields or adding additional filters). #### Step 4: View the Results After configuring the join, the data table will show combined results from both streams. <img width="1724" alt="Join Results" src="https://github.com/user-attachments/assets/94ca9f33-6cfa-4ad1-9b84-bee9db34f912" /> In this example: - **Name** column from `employee_data_join` (Alice, Bob, Charlie, David, Eve) - **Department Name** column from `dept_data_join` (HR, Engineering, HR, Sales) - Data successfully joined on `department_id` #### Step 5: Review the Generated SQL Check the **Query** section at the bottom to see the generated SQL: ```sql SELECT employee_data_join.name as "x_axis_1", stream_0.department_name as "x_axis_2" FROM "employee_data_join" LEFT JOIN "dept_data_join" AS stream_0 ON employee_data_join.department_id = stream_0.department_id ``` The SQL query shows exactly how OpenObserve is combining your data streams. --- --- ## Examples ### Example 1: String Concatenation with Nested Functions **Use Case**: Combine multiple fields into a single display value ```sql Concat(k8s_namespace_name, '-', k8s_pod_name) ``` This joins namespace and pod names with a hyphen separator. ### Example 2: Statistical Analysis with Nested Math Functions **Use Case**: Calculate rounded average of a metric ```sql Ceil(Avg(severity)) ``` This calculates the average severity level and rounds up to the nearest whole number. ### Example 3: Conditional Percentage Calculation **Use Case**: Calculate percentage of high-severity events ```sql ROUND(100.0 * SUM(CASE WHEN COALESCE(severity, 0) >= 4 THEN 1 ELSE 0 END) / COUNT(_timestamp), 2) ``` **Breakdown:** - Handles null values with `COALESCE` - Counts events where severity >= 4 - Calculates percentage of total events - Rounds to 2 decimal places ### Example 4: Employee-Department Join **Use Case**: Show employee names with their department information ```sql SELECT employee_data_join.name as "Name", dept_data_join.department_name as "Department Name" FROM employee_data_join LEFT JOIN dept_data_join ON employee_data_join.department_id = dept_data_join.department_id ``` This displays all employees with their department names, showing null for employees without a department assignment. ### Example 5: Complex Analytics - Joins + Nested Functions **Use Case**: Calculate error rate per service with deployment information ```sql SELECT logs.service_name, deployments.version, COUNT(*) as total_requests, ROUND((COUNT(CASE WHEN logs.status_code >= 500 THEN 1 END) * 100.0 / COUNT(*)), 2) as error_rate_percent FROM service_logs as logs LEFT JOIN deployments ON logs.service_name = deployments.service_name GROUP BY logs.service_name, deployments.version ORDER BY error_rate_percent DESC ``` This combines: - Join between service logs and deployment data - Nested functions for conditional counting and percentage calculation - Grouping and sorting for analysis --- ## Tips and Best Practices ### Nested Functions Best Practices ✅ **Start Simple**: Build your function one layer at a time - Begin with inner function: `AVG(response_time)` - Add outer layers: `ROUND(AVG(response_time), 2)` ✅ **Test Each Layer**: Verify results before adding complexity - Test the inner function first - Add one layer at a time and check output ✅ **Handle Null Values**: Use `COALESCE` to avoid unexpected nulls ```sql COALESCE(AVG(response_time), 0) ``` ✅ **Use Clear Aliases**: Name your calculated fields descriptively ```sql ROUND(AVG(response_time), 2) as avg_response_ms ``` ✅ **Check for Division by Zero**: Protect against zero denominators ```sql CASE WHEN COUNT(*) > 0 THEN (SUM(errors) * 100.0 / COUNT(*)) ELSE 0 END as error_rate ``` ### Joins Best Practices ✅ **Choose the Right Join Type**: - **INNER JOIN**: Both streams must have matching data - **LEFT JOIN**: Keep all records from primary stream - **RIGHT JOIN**: Keep all records from secondary stream ✅ **Verify Field Compatibility**: - Match data types (don't join string to number) - Ensure field names are correct - Check that values actually match between streams ✅ **Consider Performance**: - Join on indexed fields when possible - Test with limited data first --- ## FAQ ### Q: Can I nest more than 2 functions? **A**: Yes! You can nest as many functions as needed. Example: ```sql ROUND(CEIL(AVG(COALESCE(response_time, 0))), 2) ``` ### Q: What's the difference between LEFT and RIGHT joins? **A**: - **LEFT JOIN**: Keeps all records from the first (left) stream - **RIGHT JOIN**: Keeps all records from the second (right) stream - Choose based on which dataset you want to preserve completely ### Q: Can I join more than 2 streams? **A**: Yes! Click the **+** button in the Joins section to add additional joins. You can chain multiple joins together. ### Q: Do nested functions impact performance? **A**: Complex nested functions may take longer to compute, especially on large datasets. Test with small time ranges first and optimize your expressions. ### Q: Can I use Custom SQL instead of Auto SQL? **A**: Yes! If you prefer writing raw SQL, switch to **Custom SQL** mode. However, Auto SQL provides a visual interface that's easier for building queries. --- ## Additional Resources 📚 **DataFusion Documentation**: - [Aggregate Functions](https://datafusion.apache.org/user-guide/sql/aggregate_functions.html) - COUNT, SUM, AVG, etc. - [Scalar Functions](https://datafusion.apache.org/user-guide/sql/scalar_functions.html) - ROUND, CONCAT, CASE, etc. 🔗 **OpenObserve Resources**: - [GitHub Repository](https://github.com/openobserve/openobserve) - [PR #9343 - Feature Implementation](https://github.com/openobserve/openobserve/pull/9343) - [OpenObserve Documentation](https://openobserve.ai/docs/) 💬 **Get Help**: - [GitHub Issues](https://github.com/openobserve/openobserve/issues) - Report bugs or request features - [Community Discussions](https://github.com/openobserve/openobserve/discussions) - Ask questions and share ideas --- Design at: https://github.com/openobserve/designs/tree/main/joins --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Shrinath Rao <shnath@openobserve.ai> |
||
|
|
e96db6332b |
test(dashboard): fix flaky tests in deployed environment (#9511)
### **User description** …riables ___ ### **PR Type** Tests, Enhancement ___ ### **Description** - Refine chart-render wait logic with class checks - Integrate values-stream helper in variable dropdown - Standardize relative time ranges to 30m - Improve streaming test with API wait loops ___ <details> <summary><h3> File Walkthrough</h3></summary> <table><thead><tr><th></th><th align="left">Relevant files</th></tr></thead><tbody><tr><td><strong>Formatting</strong></td><td><details><summary>2 files</summary><table> <tr> <td><strong>apiCleanup.js</strong><dd><code>Remove extraneous newline at EOF</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-537fe76c0d8e26e81c5f77c83bd0ee35daaa973822105c809bf83171a26b33c5">+1/-1</a> </td> </tr> <tr> <td><strong>cleanup.spec.js</strong><dd><code>Remove trailing blank line</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+1/-0</a> </td> </tr> </table></details></td></tr><tr><td><strong>Enhancement</strong></td><td><details><summary>4 files</summary><table> <tr> <td><strong>dashboard-panel-actions.js</strong><dd><code>Refine waitForChartToRender class checks</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-d29713fdcc11cbc93bda29da5261da389226cd718e4292a1c2cd96629f573a80">+27/-10</a> </td> </tr> <tr> <td><strong>dashboard-variables.js</strong><dd><code>Add stream helper and input typing delay</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-67d38d39bb67f4a0cbfa473ee81ad50b1fffebc40c635417e58905f3c865a6e2">+18/-3</a> </td> </tr> <tr> <td><strong>dashboard-streaming.spec.js</strong><dd><code>Add API wait loops in streaming test</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-92f44296937f53cb448371d1c61510c8c910fbecab83b02b8e89490d5832be19">+36/-4</a> </td> </tr> <tr> <td><strong>streaming-helpers.js</strong><dd><code>Implement waitForValuesStreamComplete utility</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-ba793998d7c077815ee18543001a519b7d45a9236990b60d256124a4b30d48cb">+65/-1</a> </td> </tr> </table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>6 files</summary><table> <tr> <td><strong>dashboard-geoMap.spec.js</strong><dd><code>Update time range to 30m</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-6ae8394cd6b915e6d55a179cf6c7dc32992b8ebbd5d9aac177c0cbd1b9f351b3">+1/-1</a> </td> </tr> <tr> <td><strong>dashboard-html-chart.spec.js</strong><dd><code>Set html chart time to 30m</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-02c503aa87193168f5aa83c8105c376ea0c4dc45e6c7bd6f255b693bf7ebc462">+1/-1</a> </td> </tr> <tr> <td><strong>dashboard-multi-y-axis.spec.js</strong><dd><code>Update multi-y-axis time to 30m</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-e90516a105c0b17c8e04c18e2b67ac10af213dbdd208fa4414cdcb7e377e6ee5">+2/-2</a> </td> </tr> <tr> <td><strong>dashboard-transpose.spec.js</strong><dd><code>Change transpose time range to 30m</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-da631007cea76a4bc59e4acd1195b59ae4131cd5208d21a9c1f94d3913911dc4">+1/-1</a> </td> </tr> <tr> <td><strong>dashboard.spec.js</strong><dd><code>Adjust gauge and table time ranges to 15m</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-d0fa0042783dc109334b05266edce228bad97adcb568dd1e447920596238e9b4">+5/-5</a> </td> </tr> <tr> <td><strong>dashboard2.spec.js</strong><dd><code>Standardize dashboard2 time to 30m</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-8c9189e9e3950fff987c45ee8116d89f15f8fdec5baad209bef6f5858f3b3045">+7/-7</a> </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>Fix typo in run_files list</code> </dd></td> <td><a href="https://github.com/openobserve/openobserve/pull/9511/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+1/-0</a> </td> </tr> </table></details></td></tr></tr></tbody></table> </details> ___ --------- Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech> |
||
|
|
cc3a6110ae |
test: add ingestion config UI tests (#9643)
### **User description**
- Added IngestionConfigPage POM with 20+ methods for page interactions
- Created 20+ comprehensive tests for ingestion configuration (3 P0, 8
P1, 1 P2)
- Tests cover: Navigation, Copy functionality, Configuration content,
Search
- Fixed all hardcoded waitForTimeout() calls with element-based waits
- Fixed search test selector to use .data-sources-recommended-tabs
.q-tab
- All tests passing (46.3s execution time)
___
### **PR Type**
Tests, Enhancement
___
### **Description**
- Added IngestionConfigPage POM for ingestion interactions
- Introduced comprehensive ingestion configuration tests
- Updated PageManager to include new POM
- Tests cover navigation, copy, content, search
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["PageManager"]
B["IngestionConfigPage POM"]
C["Ingestion config tests"]
A -- "imports" --> B
C -- "uses" --> A
```
<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>ingestionConfigPage.js</strong><dd><code>Implement
ingestion config page object</code>
</dd></summary>
<hr>
tests/ui-testing/pages/generalPages/ingestionConfigPage.js
<ul><li>Created <code>IngestionConfigPage</code> class<br> <li> Defined
selectors for navigation, tabs, copy, search<br> <li> Implemented
navigation, copy, search, assertion methods<br> <li> Replaced hardcoded
waits with element-based waits</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9643/files#diff-22a47625a9849c4d6b6a0944d864db20d03453666f9cbfaaeb2cf5b57e00d5c5">+147/-0</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Tests</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>page-manager.js</strong><dd><code>Integrate ingestion
config POM</code>
</dd></summary>
<hr>
tests/ui-testing/pages/page-manager.js
<ul><li>Imported <code>IngestionConfigPage</code><br> <li> Added
<code>ingestionConfigPage</code> to <code>PageManager</code>
constructor</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9643/files#diff-565eab8b3c767ae50c9d05e591621d14f66b81af84d6b5ea6efe136c1c3933df">+2/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>ingestion-config.spec.js</strong><dd><code>Add
ingestion configuration tests</code>
</dd></summary>
<hr>
tests/ui-testing/playwright-tests/Ingestion/ingestion-config.spec.js
<ul><li>Added navigation tests for recommended/custom pages<br> <li>
Added copy functionality tests for Fluentd and Prometheus<br> <li> Added
configuration content validation tests<br> <li> Added recommended page
search and filter test</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9643/files#diff-35352597cf8f8ded17cd9c0abac4efb41cb255a1f69f110129a1b0427b4c8870">+159/-0</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
---------
Co-authored-by: Claude <noreply@anthropic.com>
|
||
|
|
bac710bb41 |
test(e2e): add language translation coverage tests (#9641)
## Summary - Add comprehensive Playwright tests for translation coverage across 10 supported languages - Tests verify translation coverage across all 12 sidebar modules (Home, Logs, Metrics, Traces, RUM, Pipelines, Dashboards, Streams, Reports, Alerts, Data Sources, IAM) and their sub-pages - Implements tiered pass criteria: ≥80% (ideal), 70-79% (acceptable with warning), <70% (fail) ## Languages Tested - German (Deutsch) - Spanish (Español) - French (Français) - Italian (Italiano) - Dutch (Nederlands) - Portuguese (Português) - Turkish (Türkçe) - Japanese (日本語) - Korean (한국어) - Chinese Simplified (简体中文) ## Files Added - `pages/generalPages/languagePage.js` - Page object with all translation testing logic - `playwright-tests/LanguageTests/*.spec.js` - Individual test files per language (10 files) ## Test Plan - [x] All 10 language tests pass locally (parallel execution ~1.6 min with 5 workers) - [x] German at 78% passes as "acceptable" with warning - [x] Other languages at 88% pass as "ideal" **Note**: These tests are designed for scheduled/nightly runs, not PR validation (each test takes ~45s). |
||
|
|
13f5fa239a | test: add Playwright tests for theme management (#9636) | ||
|
|
16b5acaaa7 |
fix(e2e): resolve join test failure with unique stream names (#9635)
## Summary
- Fixed join test failure caused by "stream is being deleted" error
- Uses unique stream names with `testRunId` to avoid conflicts (SDR
pattern)
- `ingestionJoinUnion()` now generates unique stream names like
`e2e_join_a_<runId>`
- `selectIndexAndStreamJoinUnion()` accepts stream names as parameters
## Root Cause
Fixed stream names (`e2e_join_a`, `e2e_join_b`) caused conflicts when
streams were being deleted from previous test runs. The ingestion would
fail with:
```
{"code":400,"message":"Error# stream [e2e_join_a] is being deleted"}
```
## Test plan
- [x] Run `npx playwright test playwright-tests/Logs/join.spec.js --grep
"selecting field and SQL Mode"` - passes
- [x] Cleanup pattern `/^e2e_join_/` already exists in cleanup.spec.js
|
||
|
|
e0d23c42a7 |
fix(e2e): resolve SDR test failures with test isolation and retry logic (#9632)
## Summary - Add unique testRunId to pattern and stream names for test isolation during parallel execution - Add retry logic to `checkPatternExists` for backend indexing delays (3 attempts with 2s wait) - Add search box filtering in `selectStream` for reliable stream selection in long lists - Add retry logic for Stream Detail button in stream association page - Fix ingestion retry with exponential backoff for "stream being deleted" errors - Update regexPatternManagement test with unique pattern names to avoid conflicts ## Test plan - [x] All 23 SDR tests pass reliably in parallel execution - [x] Verified tests pass when run individually and as a suite - [x] No regressions in other test suites |
||
|
|
138808f6a7 |
test: add regression tests for bugs fixes (#9630)
…#9308, #9193, #9117) Added comprehensive E2E regression test suite for critical UI bugs: P0 Tests: - #9337: Query expand icon not working after stream explorer navigation - #9388: Stream switching shows wrong table fields (BLOCKER) P1 Tests: - #9455-1: Download empty results notification (CSV + JSON) - #9455-2: Download validation without stream selection - #9308: OpenAPI button redirect from Help menu - #9193: Enrichment table color contrast in light mode - #9117: SQL mode conversion with pipe operators Test Results: 7/7 passing (100%) - Follows OpenObserve test patterns and page object model - Proper tagging (@P0/@P1, feature tags, @regressionBugs) - Comprehensive logging with testLogger - All tests run independently in parallel Files: - tests/ui-testing/playwright-tests/RegressionSet/ui-regression.spec.js --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
790bd9a0bd | test: e2e streams race condition fix (#9631) | ||
|
|
45231df7b4 |
test: refactor and optimize enrichment table tests (#9629)
This commit improves the enrichment table test suite with significant performance gains and code quality improvements. ## Performance Improvements - **58% faster execution**: 3.3m → 1.4m - Moved logs data ingestion from beforeEach to only tests that need it (2 of 9 tests) - Removed unnecessary navigation calls after file uploads - Cleaned up excessive debug logging ## Test Fixes - Fixed button selector strategy using position-based nth() approach - Fixed search method - standardized on searchEnrichmentTableInList() - Fixed disabled field verification using Playwright's toBeDisabled() - Fixed delete confirmation dialog selector specificity - Increased authentication timeout from 5s to 15s for first test in suite ## Code Quality Improvements - Added helper function setupLogsData() for tests requiring logs - Added missing tags to 6 tests for better filtering - Standardized cleanup patterns across all tests - Improved code comments explaining test flow - Consistent use of "already on list" pattern ## Test Coverage - 9 total tests covering: 1. Upload with exploration 2. Upload with VRL processing 3. CSV validation error 4. Name field validation error 5. Append functionality 6. Cancel workflow 7. Search/filter 8. Edit mode 9. Delete confirmation All 9 tests passing with improved reliability and maintainability. Files modified: - tests/ui-testing/pages/generalPages/enrichmentPage.js - tests/ui-testing/playwright-tests/GeneralTests/enrichment.spec.js - tests/ui-testing/playwright-tests/utils/enhanced-baseFixtures.js Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
fd1cf3462b |
fix(e2e): resolve histogram bar chart canvas click timeout (#9628)
## Summary
- Fix TimeoutError in `logsqueries.spec.js` histogram bar chart test
caused by ECharts canvas DOM re-rendering
- Add retry mechanism to `clickBarChartCanvas()` to handle canvas
element detachment
- Add proper assertions using page object pattern
## Changes
- **logsPage.js**: Added retry mechanism (3 attempts) with network idle
wait and stabilization delay
- **logsPage.js**: Added `expectBarChartCanvasVisible()` assertion
method
- **logsqueries.spec.js**: Ensure histogram toggle is ON before test
- **logsqueries.spec.js**: Use `waitForLoadState('networkidle')` for
reliability
- **logsqueries.spec.js**: Add visibility assertions before clicking
canvas
## Test plan
- [x] Test passes locally
- [x] Test passes on repeat runs (verified with `--repeat-each=2`)
- [x] Sentinel code quality audit passed
|
||
|
|
1acd977f31 |
test: add share link E2E tests for logs page (#9619)
## Summary - Add 10 comprehensive E2E tests for the share link feature on the logs page - Add clipboard permissions to playwright config for share link functionality - Add share link page object methods to logsPage.js with Firefox compatibility fixes ## Test Coverage | Priority | Tests | Coverage | |----------|-------|----------| | P0 (Smoke) | 2 | Button visibility, success notification, stream & time preservation | | P1 (Functional) | 4 | SQL mode, histogram toggle, complete state, loading state | | P2 (Edge Cases) | 4 | No stream, multiple clicks, SQL query, redirect/org/consistency | ## Changes - `tests/ui-testing/playwright-tests/Logs/shareLink.spec.js` - New test file with 10 tests - `tests/ui-testing/playwright.config.js` - Added clipboard permissions - `tests/ui-testing/pages/logsPages/logsPage.js` - Added share link methods and Firefox fixes ## Test Plan - [x] All 10 tests pass locally (1.5 minutes runtime with parallel execution) - [ ] Tests pass in CI pipeline |
||
|
|
e945212449 | test: added cleanup patterns for streams (#9579) | ||
|
|
7efa71f8ed | test(dashboard): add test cases for table chart JSON mode (#9500) | ||
|
|
c05fe5d8b0 |
fix: user should be able to delete the first condition in pipeline condition node (#9522)
Co-authored-by: Shrinath Rao <shnath@openobserve.ai> |
||
|
|
29aee1e9c3 | test: fix for failing severity color test on env (#9593) | ||
|
|
bcdc05bca9 |
test: add automated severity color mapping tests for issue #9439 (#9576)
Tests #9439 - Added comprehensive tests for all 8 severity levels (0-7) - Implemented POM methods in logsPage.js for severity color validation - Created test data file with 16 test records (integer and string formats) - Tests verify correct color mapping for each severity level - Includes automatic test stream creation and cleanup - All tests pass successfully with no impact on existing tests --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
f269b7b90f | test: fixed schema and schema load tests on env (#9553) | ||
|
|
d1dc54ff42 |
test: updated cleanup spec file to follow framework and add more pipe… (#9543)
…line patterns |
||
|
|
6ae38d5ce2 |
test(e2e): refactor pipeline condition tests and fix data ingestion timeout (#9528)
## Summary
Refactored pipeline condition tests into 2 new spec files for better
organization and maintainability, fixed data ingestion timeout issue,
and added comprehensive test coverage for pipeline conditions.
## Changes
- Refactored pipeline condition tests into 2 new spec files for better
organization
- Added 14 new comprehensive test cases (7 UI-based + 7 API-based
validation tests)
- Fixed beforeEach timeout issue by reducing data ingestion from 3,800+
to 10 records per stream
- Added cleanup patterns for `e2e_conditions_*` streams to prevent data
accumulation
- Updated apiCleanup.js to include 7 new stream names in pipeline
cleanup
- Removed outdated comments referencing conditional wait logic
- Added page object methods for condition testing in pipelinesPage.js,
logsPage.js, and streamsPage.js
## Test Coverage
### pipeline-conditions.spec.js (7 tests - all passing ✅)
- Basic condition operations with multiple operators (=, !=, Contains,
NotContains, >=)
- Condition groups, nesting, and reordering
- Field validation and error messages
- Complex operator precedence (A OR B AND C)
- Multiple conditions (A, B, C, D)
- Condition node deletion
- Comparison operators validation
### pipeline-conditions-validation.spec.js (7 tests - API-based)
- Operator precedence validation
- Nested groups with AND/OR logic
- Numeric comparisons
- String operators (case-insensitive Contains)
## Performance
- Reduced test execution time from 180s timeout to ~4.6 minutes for full
suite
- 100% pass rate for active UI tests (7/7)
## Files Changed
- `.github/workflows/playwright.yml` - Updated test configuration
- `tests/test-data/data_100.json` - Added test data for validation tests
- `tests/test-data/sample_pipeline_template.json` - Added pipeline
template
- `tests/ui-testing/pages/apiCleanup.js` - Added stream cleanup patterns
- `tests/ui-testing/pages/pipelinesPages/pipelinesPage.js` - Added
condition testing methods
- `tests/ui-testing/pages/logsPages/logsPage.js` - Added data ingestion
helpers
- `tests/ui-testing/pages/streamsPages/streamsPage.js` - Added stream
management helpers
-
`tests/ui-testing/playwright-tests/Pipelines/pipeline-conditions.spec.js`
- Refactored UI tests
-
`tests/ui-testing/playwright-tests/Pipelines/pipeline-conditions-validation.spec.js`
- New API validation tests
- `tests/ui-testing/playwright-tests/cleanup.spec.js` - Added
e2e_conditions_* pattern
## Testing
All 7 UI-based tests passing with 100% pass rate.
|
||
|
|
9056a2c92d |
feat: revamp Conditions in alerts and pipelines (#9267)
Co-authored-by: Uddhav Dave <uddhav@MacBook-Pro.local> Co-authored-by: sai nikhil kethe <nikhil@openobserve.ai> Co-authored-by: Shrinath Rao <shnath@openobserve.ai> |
||
|
|
b3ed038bc4 | test: updated cleanup spec file (#9487) |