58 Commits
Author SHA1 Message Date
Shrinath Rao f624c0b157 test(streams): don't count GitHub 429 as a broken doc link (#16202) 2026-11-02 09:21:55 +00:00
Huaijin 495e414f49 fix(search): isolate concurrent queries that share a trace id (#15515) 2026-10-20 09:15:43 +00:00
Huaijin bde25eedf8 fix(search): only prune partitions when the stream is read once (#15514) 2026-10-20 05:39:55 +00:00
c99cb0d516 fix(logs): logs finesse phase 1 — severity inference, auto-run, free-text FTS search, J/K, line permalinks (#15234)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Neha P <neha@openobserve.ai>
2026-10-12 16:50:32 +00:00
17e771a6c7 feat(ingestion): add GPU → NVIDIA DCGM Exporter recommended data source (#14903)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Bhargav <BJP232004@GMAIL.COM>
2026-10-07 06:21:56 +00:00
Hengfei YangandHuaijin 6785abe1f8 feat(metrics): generate sample blocks in MIDX during compaction (#14711)
Co-authored-by: Huaijin <haohuaijin@gmail.com>
2026-09-23 16:58:11 +08:00
ktx-akshay 33c6e9e0e1 test(dashboards): cover CTE/subquery match_all queries through the panel search path (#13838)
## What

First test coverage for the dashboard **panel** endpoints and the
**dashboard
search path**, running CTE/subquery `match_all` queries as real
dashboard panels.

Nothing in the repo previously touched either:
`grep -rn "/panels\|search_type=dashboards" tests/api-testing/` returned
zero hits.

## Why

Panels query `_search?type=logs&search_type=dashboards&dashboard_id=…` —
a
different route into the engine than the Logs page (`search_type=ui`).
The
`match_all` + FST projection rewrite fixed in #13808 runs inside it, so
a query
that passes via Logs can still regress on a dashboard.

The rewrite has to preserve the projection of the block the predicate
sits in.
When that block is the whole statement, the projection is obvious. When
it's a
CTE body feeding a JOIN, a window, or a four-branch UNION ALL, it has to
preserve
the *CTE's* output schema while the outer query reads different columns
from it —
which is where it went wrong.

## Coverage

**71 distinct queries across 29 combination families**, all with
`match_all`
inside a `WITH …` body or a derived table:

| Axis | Variants |
|---|---|
| Nesting depth | 1, 2, 3, and 5-level CTE chains |
| Nesting kind | CTEs and derived tables (and one query using both) |
| UNION ALL | 2, 3, and 4 separate `match_all` branches |
| JOIN | CTE⋈CTE, derived⋈derived, cross-stream |
| Window | `ROW_NUMBER`, `RANK`, `DENSE_RANK`, partitioned aggregates |
| Negation | `NOT match_all`, and mixed with positive `match_all` |
| Combined with | `COUNT(DISTINCT)`, `CASE`, `HAVING`, `histogram()` |

Each case creates a real panel, runs it via the dashboard search path,
then
asserts row count against the DuckDB oracle and that no expected column
was
dropped from the projection. A further 30 cases run the same SQL through
**both**
Logs and dashboard and diff the results — that's what catches a rewrite
firing on
only one path.

Queries are reused from the existing query-agent corpus rather than
duplicated,
so the two suites can't drift: query-agent verifies the values via the
Logs path,
this verifies the same SQL survives the dashboard path.

Cases are **discovered by classifying the SQL**, not from a hand-written
ID list,
so new combinations added to the corpus are picked up automatically.
Test ids
name the shape (`Q1022-cte1_union_cdist_4ma`), so a failure identifies
the
combination without opening the corpus.

Plus 14 tests for the panel endpoints themselves — AddPanel /
UpdatePanel /
DeletePanel, contract + CRUD lifecycle + 7 error paths derived from
`DashboardError` in `src/core/src/http.rs`.

## Changes

| File | |
|---|---|
| `tests/dashboards/test_dashboard_cte_panels.py` | new — 103 tests |
| `tests/dashboards/test_dashboard_panels.py` | new — 14 tests |
| `tests/dashboards/conftest.py` | new — shared fixtures |
| `support/panel_queries.py` | new — discovery + panel helpers |
| `support/endpoints/dashboards.py` | +78, additive |
| `support/endpoints/search.py` | +36, additive |
| `support/factories.py` | +73, additive |

The three shared-file edits are **187 added lines, 0 modified** —
nothing
existing can break.

## Results

168 tests in tests/api-testing/tests/dashboards/ (117 new + 51
pre-existing)
166 passed, 1 skipped, 1 xfailed     # full nested-query corpus present
74 passed, 2 skipped, 1 xfailed     # current corpus on main


Repeated 2× and 4× respectively, no flakes.

Discovery scales with the corpus: on main it finds 8 nested `match_all`
cases,
and 71 once the larger sentinel set is present. Cases that aren't in the
corpus
skip with an explanatory message instead of failing, so this is safe to
merge in
either order.
2026-08-17 09:47:17 +00:00
Neha PandClaude Opus 4.7 8a4f7ea23b test(query-agent): add 70 match_all sentinel queries for FST rewrite path coverage (#13824)
## Summary

Adds Q1003–Q1072 (70 queries) to
`tests/test-data/query-agent/queries/full_text_search.json`. All
exercise the `match_all` + FST projection rewrite path fixed in #13808,
under diverse plan shapes.

Structural patterns mirror real production customer queries (fan-out
UNION ALL, multi-CTE, CSE-triggering scalar wrappers on the FTS field)
but use **only test-fixture fields and values** — no customer
identifiers.

## Shape coverage

| Family | Range | Count | What it exercises |
|---|---|---|---|
| A. Subquery + `match_all` + GROUP BY | Q1003–Q1012 | 10 | Simple
inline-view aggregations |
| B. CTE with fan-out UNION ALL, `match_all` per branch | Q1013–Q1027 |
15 | Dominant customer pattern (multi-branch UNION + per-branch FTS +
LIKE/regex + outer aggregate) |
| C. CTE + scalar wrapper on `log`
(trim/upper/split_part/regexp_replace/substring/concat/length) +
`match_all` | Q1028–Q1037 | 10 | **CSE-trigger sentinels** — the
wrappers cause DataFusion CSE to insert the intermediate
`ProjectionExec` that #13808 fixes |
| D. Deep multi-CTE + `match_all` + regex/LIKE/CASE combos | Q1038–Q1047
| 10 | Deep plan trees, many projection candidates |
| E. Edge cases (DISTINCT, HAVING, CASE, IN-list) | Q1048–Q1052 | 5 |
Corner combinations |
| F. `match_all` inside JOINs (self-join, LEFT JOIN, cross-stream) |
Q1053–Q1058 | 6 | JOIN builders inject their own projections |
| G. `match_all` + window functions (ROW_NUMBER, RANK, DENSE_RANK,
SUM/COUNT OVER) | Q1059–Q1063 | 5 | Window planning inserts projections
above filter |
| H. Negated `match_all` (NOT, AND NOT, UNION of pos/neg) | Q1064–Q1066
| 3 | Rewriter's negation code path |
| I. Multiple `match_all` in same query (AND, OR, nested) | Q1067–Q1069
| 3 | Two FST fields injected simultaneously |
| J. `histogram` + `match_all` time-series | Q1070–Q1072 | 3 | Common
customer pattern; histogram optimizer + FST rewriter together |

## Verification

- All 70 queries have DuckDB oracle results auto-populated via
`compute_counts.py`.
- Two initial cross-stream JOIN queries (Q1055, Q1058) were rewritten to
disambiguate the FTS field between streams — now they scope `match_all`
inside a per-stream CTE before joining.
- Audit for customer-token leakage (pharma, tomcat, o2_test, usgm,
storenumber, tagname, cash, credit_card, etc.) returns **zero hits**
across Q1003–Q1072.

## Implementation notes

- Added generator script
[tests/test-data/query-agent/gen_q1003_q1052.py](tests/test-data/query-agent/gen_q1003_q1052.py)
alongside existing `gen_q201_q400.py` / `gen_q511_q556.py` convention.
Deterministic regeneration.
- Wide JSON churn across the other 12 category files is
`compute_counts.py` re-baselining expected results against a fresh
`BASE_TS` (`base_ts_override.json` is untracked); tuple-order shuffles
are harmless under `results_mode: rowsort`.
- Coverage is most meaningful under the `remove_filter_with_index_false`
CI leg (added in #13810), where `match_all` actually reaches
`RewriteMatchPhysical`. Under the default flag (`true`), the index
optimizer removes `match_all` before the rewriter runs, masking the bug
path.

## Test plan

- [ ] `api_query_agent / single_node_opt_true` — green
- [ ] `api_query_agent / single_node_opt_false` — green
- [ ] `api_query_agent / remove_filter_with_index_false` — green (this
is the leg that actually validates the rewriter under all 70 shapes)
- [ ] Q1003–Q1072 all pass on both memtable and parquet phases

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-08-17 06:42:06 +00:00
Neha PandClaude Opus 4.7 7fbce61fd1 test: add Q1001 + Q1002 sentinels for match_all/CSE + widen CI matrix (#13810)
Two regression sentinels for the FST projection rewrite path fixed in
openobserve/openobserve#13808 (currently in the merge queue on
branch-v0.40.0 and awaiting the main-branch counterpart):

  Q1001 — CTE with trim(log) alias, match_all in WHERE, column-pruned
  outer SELECT. Mirrors the shape of the PR's own unit test
  (test_cse_projection_schema_propagation) — CSE inserts a
  ProjectionExec between filter and datasource; a regression in the
  rewriter's f_down handling would surface here.

  Q1002 — five-CTE pipeline (filtered → in_shop → scoped → normalized
  → cleaned) mixing match_all with LIKE, split_part, regexp_replace ID
  normalization, and GROUP BY aggregation. Higher structural pressure:
  more intermediate ProjectionExec nodes and more chances for a stale
  column index to leak through.

Uses only test-fixture fields (log, resource_path, page_url,
http_method); no customer identifiers.

Also adds a third leg to the query-agent CI matrix that runs with
ZO_FEATURE_QUERY_REMOVE_FILTER_WITH_INDEX=false — exercises the
non-index-filter path that the match_all projection rewriter also
touches.

The wide JSON churn across the other query files is compute_counts.py
re-baselining expected results against a fresh BASE_TS
(base_ts_override.json is untracked); tuple-order shuffles are harmless
under results_mode: rowsort.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-08-13 09:46:15 +00:00
7f647109fc fix: preserve projection schema when rewriting match_all (#13808)
## Summary

Forward-port of #13798 to `main`.

- rebuild `ProjectionExec` expressions against the rewritten child
schema before DataFusion validates the projection
- carry full-text search fields through intermediate projections and
preserve the original `FilterExec` output schema
- reject a full-text search field that a projection already exposes as
an alias for a different expression, instead of silently searching the
wrong data
- add a regression for a projection sitting between the filter and the
datasource

## Root cause

`RewriteMatchPhysical` expanded the `NewEmptyExec` projection with
full-text search fields. When an optimizer rule (CSE, for example) had
inserted an intermediate `ProjectionExec`, adding the FST field changed
the child column positions while the projection still referenced its
columns by their old indices, so DataFusion rejected the plan.

The old `filter_projection` was also computed as positions inside
`parquet_projection`, i.e. in the datasource output space. That is only
valid when the filter reads the datasource directly. It is now mapped by
name against the actual filter input schema, and the field order of
`filter.schema()` is preserved so the operators above the filter keep
reading the same columns.

Two latent issues are fixed along the way:

- a scan with `projection == None` (all columns) was narrowed down to
only the FST fields
- `schema.index_of(...).unwrap()` in the datasource rewrite panicked
instead of returning a plan error

## Differences from #13798

`main` is on DataFusion 54 and builds the filter through
`FilterExecBuilder`, so step 5 uses `apply_projection` and keeps
`with_fetch`.

The regression test also differs. The CTE query used in #13798 no longer
produces an intermediate projection on DataFusion 54 — CSE does not
extract `btrim(log)` there — so the test would be vacuous.
`test_projection_between_filter_and_scan` builds the offending plan
shape directly instead, which does not depend on optimizer internals.

## Verification

- `cargo test -p search --no-default-features --lib
datafusion::optimizer::physical_optimizer::rewrite_match` — 7 passed, 0
failed
- `test_projection_between_filter_and_scan` fails on `main` without the
fix (`SchemaError: Unable to get field named "__common_expr_1"`)

---------

Co-authored-by: Neha P <neha@openobserve.ai>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-08-13 07:53:44 +00:00
Hengfei Yang 8303be0b4c refactor: rename AlertManager node role to Scheduler (#13696)
## Summary

- rename the `AlertManager` node role to `Scheduler` across Rust
services, jobs, protobuf bindings, UI labels, and tests
- emit `scheduler` as the canonical role name
- continue accepting legacy `alertmanager` and `alert_manager`
configuration values
- keep protobuf enum value `5` unchanged for wire compatibility

## Why

The role schedules and executes alerts, reports, pipelines, synthetics,
and other background work. `Scheduler` describes that broader
responsibility more accurately.

## Compatibility

- existing role configuration values remain accepted through parser and
serde aliases
- the protobuf numeric value remains stable
- coordinated changes are included in the Enterprise, Helm chart, and
documentation repositories

## Verification

- `cargo test -p config test_role`
- `cargo test -p openobserve-node`
- `cargo check -p openobserve-jobs`
- targeted web tests: 307 passed, 13 skipped
- Rust formatting and targeted Prettier checks
2026-08-07 13:30:38 +00:00
Neha PandClaude Opus 4.7 9af9a47fea test: add error path, explain analyze, and concurrency stress tests for query agent (#12809)
## Summary
- **Phase 4 — Error Paths** (`test_4_error_paths.py`): 28 cases across 8
categories that send intentionally invalid SQL and assert 4xx not 5xx.
Self-contained, runs in ~24s without data dependency.
- **Phase 5 — Concurrency Stress** (`test_5_concurrency.py`): 26 queries
(2 per category) run simultaneously at 5/10/15 worker levels via
ThreadPoolExecutor. Each thread gets its own client. Catches deadlocks
and thread-safety bugs.
- **EXPLAIN ANALYZE** (`test_explain_analyze.py`): Verifies
EXPLAIN/EXPLAIN ANALYZE return 200 with plan output and no
`partial_error`. Also validates EXPLAIN ANALYZE on cross-schema
dot-notation queries returns 4xx (not 500 crash).
- **Fix**: `load_all_queries()` now skips JSON files without a
`"queries"` key.

## Test plan
- [x] Error path tests pass on pentest (28/28, all return 400)
- [ ] CI run: `rye run pytest tests/query_agent/test_4_error_paths.py
-v`
- [ ] CI run: `rye run pytest tests/query_agent/test_5_concurrency.py
-v`
- [ ] CI run: `rye run pytest tests/query_agent/test_explain_analyze.py
-v`

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-14 05:08:33 +00:00
Neha PandClaude Opus 4.7 0be7644721 test: common data seed for real-issue verification (#13029)
Yesterday's real-bug proof-of-concept showed the pipeline plumbing
works, but every real bug came back INCONCLUSIVE because the Tester (via
Playwright MCP) opened pages on an **empty OpenObserve instance**. There
was nothing to observe — no streams, no alerts, no pipelines, no traces.

This PR adds a common data seed the engine runs before every dispatch.
**Pairs with
[o2-enterprise#XXXX](https://github.com/openobserve/o2-enterprise/pull/XXXX)
— both must merge together.**

## Files added

| File | Contents |
|------|----------|
| `seed/seed-common.sh` | Main orchestrator. POSTs everything via HTTP
Basic auth (matches OSS Playwright's `data-ingestion.js` — header-based,
no creds on CLI args). |
| `seed/traces_seed.json` | 5-span OTLP payload (synthetic — OSS doesn't
ship a static traces JSON; `trace-ingestion.js` generates
programmatically) |
| `seed/metrics_seed.json` | 3-metric OTLP payload (HTTP counter +
latency gauge + memory gauge; synthetic for the same reason) |
| `seed/alerts_seed.json` | 3 alerts (one scheduled, one real-time, one
disabled) |
| `seed/pipeline_seed.json` | 1 pipeline (default → ci_pipeline_out) |

## What runs (in order)

1. **Fixture logs** → `ci_seed_stream` (kept for fixture #90001 backward
compat via existing `logs_seed.json`)
2. **Bulk logs** (~3.8k entries from existing
`tests/test-data/logs_data.json`) → 4 streams: `default`,
`e2e_automate`, `web_logs`, `k8s_logs`. **Same file** OSS Playwright's
`globalSetup` uses.
3. **OTLP traces** → `default` trace stream
4. **OTLP metrics** → `default` metrics stream
5. **3 alert definitions** (POST /api/{org}/{stream}/alerts)
6. **1 pipeline** (POST /api/{org}/pipelines)

Idempotent — all ingestion is best-effort; single-endpoint failures log
the HTTP status code but don't abort the seed. Unpopulated areas still
yield INCONCLUSIVE downstream (better than the whole engine failing at
seed).

## Coverage for the 10 Needs-Testing bugs we're firing next

| Bug | Data type needed | Seed step |
|-----|------------------|-----------|
| #12452 SQL editor overflow | logs | 2 |
| #11700 Streams spacing | streams (auto-created via ingest) | 2 |
| #5042 Include search cmd+enter | logs | 2 |
| #12603 Traces page issues | traces | 3 |
| #12820 Alerts UX | alerts | 5 |
| #6750 Multi-window custom time | alerts | 5 |
| #10530 Pipeline cron alignment | pipeline | 6 |
| #12647 Pipelines popup overflow | pipeline | 6 |
| #9252 Pipeline destination verbiage | pipeline | 6 |
| #12803 Language translation | any page (no seed needed) | — |

## Validated end-to-end

Fixture #90002 dispatched on the paired branches ([run
28657529004](https://github.com/openobserve/o2-enterprise/actions/runs/28657529004))
— all 26 pipeline steps completed successfully, including the new Seed
step showing 6 sub-seeds with their HTTP status codes.

## What's NOT in this PR

- The old `seed/seed.sh` stays for one merge cycle (deprecated in the
README) — will delete once two clean real-bug batches confirm
seed-common works
- No `Test-Assist-CI-Verified` label changes
- No qa-reports table updates

## Test plan

- [x] Fixture #90002 with `source_ref=feat/test-assist-common-seed` —
all 26 steps green
- [ ] After merge (this + ENT PR): dispatch on any real bug — expect
seed step to run before Scout, and Tester to find non-empty pages

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

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-03 15:37:05 +00:00
Neha PandClaude Opus 4.7 7ad182b167 test(test-assist-ci): vision-preprocessor fixture + caller filter fix (#12973)
Consolidated OSS-side changes for the vision preprocessor rollout. Two
things bundled here — both small, both OSS-only, related by "unblocks
test-assist real-issue verification."

## Change 1 — Caller filter fix (originally in #12972, now closed)

**One-line fix** for `.github/workflows/test-assist-caller.yml`:

```yaml
# BEFORE — broken (silently skipped every /verify-bug comment on real issues)
github.event.issue.pull_request == null

# AFTER — truthy negation, evaluates correctly for undefined fields
!github.event.issue.pull_request
```

Yesterday: 5 `/verify-bug` comments on real issues (#12452, #12647,
#12603, #12820, #11700 — all by @neha00290, MEMBER association) produced
5 caller runs with `conclusion: skipped` and empty steps arrays. Root
cause: `== null` compared against an *undefined* field in GHA expression
context returns unexpected results → the entire OR short-circuited to
false.

The council caller uses the truthy check in the opposite direction
(`github.event.issue.pull_request` alone → *requires* a PR). We use the
negation of the same pattern — proven, works.

## Change 2 — Vision preprocessor fixture
(`bug-002-image-attachment.json`)

Adds fixture #90002 whose repro info lives **entirely in an image
attachment**:
- body has `Steps to Reproduce: _No response_`
- body embeds a stable github.com/user-attachments/... permalink
(streams-page screenshot from real bug #11700)

Pairs with the ENT-side vision preprocessor PR (adds extract-attachments
+ describe-via-GLM-4.6V-Flash steps before Analyst). Success = pipeline
extracts the image, GLM describes it, Analyst uses the description →
produces `area: Streams` + `testability >= MEDIUM` instead of skipping
for "no repro steps."

`expected-verdicts.json` updated with the pipeline-signal expectations
for #90002.

## Why bundled

Both changes unblock real-bug verification. The caller fix means
`/verify-bug` starts dispatching; the fixture proves the vision
preprocessor works on visual-only bugs. Reviewing them together is
faster than in isolation.

## Test plan

- [x] YAML parses; fixture JSON valid; expected-verdicts JSON valid
- [ ] After merge (this + ENT PR): comment `/verify-bug` on any
Needs-Testing issue → expect caller job to RUN (not skip) → engine
dispatched
- [ ] After merge: dispatch fixture 90002 via workflow_dispatch →
confirm vision preprocessor produces non-empty
`bug-90002-attachments.md` → confirm Analyst produces `area: Streams` +
non-SKIP testability

Closes #12972.

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-01 14:46:20 +00:00
Neha PandClaude Opus 4.7 ea039d0940 ci: add test-assist-ci caller + fixture data (#12946)
## Summary

Thin OSS caller for the upcoming **Test-Assist** automated
bug-verification pipeline — first piece of a 3-PR rollout. Mirrors the
existing [`docgen-caller.yml`](.github/workflows/docgen-caller.yml) and
[`e2e-council-caller.yml`](.github/workflows/e2e-council-caller.yml)
patterns: the heavy engine will live in `o2-enterprise`; this caller
only gates the trigger and dispatches via `ORG_ADMIN_TOKEN`.

- **`.github/workflows/test-assist-caller.yml`** — caller workflow with
two doors (`workflow_dispatch` + `/verify-bug` issue comments by org
members). Defaults to `fixture_mode=true` / `write_mode=false` so the
engine can't post to real issues until explicitly flipped.
- **`tests/test-data/test-assist-ci/`** — fixture issue (#90001) + log
seed data + `expected-verdicts.json` contract. Lets the engine soak in
`FIXTURE_MODE=true` against synthetic data without touching real
`Needs-Testing` issues.
- **`tests/ui-testing/.gitignore`** — adds `_ci_tmp/` for the throwaway
specs the engine generates per run.

### Differences from docgen / e2e-council callers

| Dimension | docgen / e2e-council | test-assist |
|---|---|---|
| Operates on | PRs | **Issues** (`.issue.pull_request` filter dropped)
|
| Comment trigger | `/docgen`, `/e2e` | `/verify-bug` |
| Inputs | pr_number, dry_run | issue_number, **fixture_mode**,
**write_mode** |
| Default safety | dry_run=true on comment | write_mode=false on every
door |

### Rollout sequencing

1. **This PR** — OSS caller + fixtures + gitignore (no engine yet →
caller will 404 on dispatch; intentional)
2. **Follow-up ENT PR** —
`o2-enterprise/.opencode/agents/test_assist_ci/` (6 opencode sub-agents
+ README)
3. **Follow-up ENT PR** —
`o2-enterprise/.github/workflows/test-assist.yml` (the engine itself)

## Test plan

- [ ] CI: workflow YAML parses (verified locally via `python3 -c "import
yaml; yaml.safe_load(open(...))"` — passes)
- [ ] After ENT engine PR merges: trigger via `workflow_dispatch` with
default inputs (`issue_number=90001`, `fixture_mode=true`,
`write_mode=false`) → expect engine ack + fixture verdict in job
summary, **no** GitHub writes
- [ ] After soak: trigger `workflow_dispatch` with `fixture_mode=false`
on a hand-picked `Needs-Testing` issue, `write_mode=false` → verdict in
summary only
- [ ] After verdict accuracy is calibrated: org member comments
`/verify-bug` on a real issue, `write_mode=true` flipped via repo vars →
comment + labels post

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-01 05:24:27 +00:00
Neha PandClaude Opus 4.7 b0f4b0e46f test: expand query-agent suite from 672 to 1,000 queries (#12856)
## Summary

Expands the query-agent regression test suite from **672 → 1,000
queries** by adding 328 complex queries (Q672–Q999) across all 13
categories.

## What changed

- **`data_gen.py`**: `NUM_QUERIES` bumped from 675 → 1000 so
`build_dataset()` generates records for all query IDs
- **13 query JSON files**: 328 new queries appended, with
DuckDB-computed expected results via `compute_counts.py`
- **`gen_q672_q999.py`**: new generation script (idempotent — re-running
skips all existing queries)

## New query patterns added

Targets DataFusion-upgrade-fragile areas identified from past breakage:

| Pattern | Examples |
|---|---|
| 3-stream JOINs + correlated EXISTS | Q672–Q677 |
| FULL OUTER JOIN between streams | Q693–Q696 |
| Window + DISTINCT (FIRST_VALUE, LAST_VALUE, NTH_VALUE) | Q717–Q730 |
| Named WINDOW clauses | Q731–Q736 |
| LAG/LEAD with CASE trend detection | Q742–Q751 |
| match_all + GROUP BY + HAVING | Q792–Q796 |
| INTERSECT/EXCEPT with CTEs | Q822–Q849 |
| Deep CTE chains (3+ CTEs, self-joins) | Q757–Q791 |
| Correlated scalar subqueries in SELECT | Q769–Q776 |
| Histogram with JOIN between streams | Q901–Q905 |

## Issues fixed

- **4 duplicate IDs** (Q545–Q548) existed in both `cte_subquery.json`
and `full_text_search.json` — renumbered FTS copies to available gaps
(Q025, Q611, Q631, Q1000)
- **27 queries** using OO-specific functions (match_all, spath,
regexp_like, window-inside-aggregate) annotated with `skip_sqllogictest:
true`

## Final breakdown

| Category | Before | After |
|---|---|---|
| cte_subquery | 89 | 124 |
| aggregation | 71 | 99 |
| string_functions | 70 | 92 |
| combined | 73 | 88 |
| full_text_search | 58 | 88 |
| window | 48 | 88 |
| basic_select | 71 | 86 |
| histogram | 57 | 79 |
| union | 34 | 62 |
| cross_stream | 16 | 61 |
| date_time | 37 | 60 |
| pagination | 22 | 42 |
| math_functions | 26 | 31 |
| **Total** | **672** | **1,000** |

- **956** queries use sqllogictest mode (DuckDB-verified results)
- **44** use legacy assertion mode (OO-specific functions, histograms)

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-24 14:24:11 +00:00
Neha PandClaude Opus 4.7 7d3e67903e ci: add single_node_opt matrix mode to query agent tests (#12756)
## Summary

- Adds a matrix strategy to the query agent SQL regression suite jobs in
both `api-testing.yml` and `query-agent.yml`
- Each job now runs with `ZO_FEATURE_SINGLE_NODE_OPTIMIZE_ENABLED=false`
and `ZO_FEATURE_SINGLE_NODE_OPTIMIZE_ENABLED=true`
- Verifies both DataFusion physical optimizer paths produce identical
query results
- Matrix legs run in parallel with `fail-fast: false`
- All artifact/log names include the matrix label to avoid collisions

## Test plan

- [ ] PR CI shows two `api_query_agent` matrix legs
(single_node_opt_false and single_node_opt_true), both pass
- [ ] `/query-agent` PR comment triggers both modes and posts per-mode
results comments

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-18 14:16:31 +00:00
Neha PandClaude Opus 4.7 494025f83b test: add ~100 query-agent queries covering re_match, production patterns, deep nesting, edge cases (#12735)
## Summary
- Expands the query agent test suite from **574 → 675 queries** across
13 category files
- **20 re_match queries** — testing `\d`, `[abc]`, `^anchor`, `a|b`,
coercion, boolean mode, COALESCE+CASE patterns found 224x in production
- **19 production-inspired queries** —
histogram+re_match+CASE+percentage, COALESCE chains,
re_match+re_not_match combined
- **19 deep-nesting queries** — INTERSECT, EXCEPT, subquery-in-HAVING,
double-NOT-EXISTS, 2-level correlated subqueries
- **15 edge-case queries** — empty results, division-by-zero via NULLIF,
STDDEV of single row, NULL grouping, BETWEEN edge
- **10 window-depth queries** — multiple window functions, WINDOW clause
reuse, NTH_VALUE, NTILE, CUME_DIST
- **5 histogram+re_match queries** — covering production pattern of
histogram + filtered metric extraction
- **5 FTS combo queries** — match_all +
histogram/re_match/window/aggregation
- **5 aggregation edge queries** — multiple FILTER clauses, STRING_AGG
with ORDER BY, HAVING complexity
- Expected values regenerated by DuckDB oracle

## Test plan
- [ ] CI passes (memtable + parquet phases)

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-17 12:51:13 +00:00
4f3c0fcba3 fix(tests): verify match_all FTS result correctness and enforce Tantivy readiness (#12717)
## Summary

Fixes a test gap where `match_all` Tantivy queries could return wrong
results after a DataFusion upgrade without being caught by existing
assertions.

### Problem

After a DataFusion upgrade merge, the DataFusion access plan was no
longer used for `match_all` queries, causing Tantivy to return wrong
results. The existing tests only compared row counts against a DuckDB
oracle that emulates `match_all` with `LIKE '%term%'` — so wrong rows
that still matched the LIKE pattern passed undetected.

Additionally, `node/flush` does not generate Tantivy indexes
immediately. The default `ZO_MAX_FILE_RETENTION_TIME=600s` means
WAL→parquet→Tantivy conversion can lag, so FTS queries may fall back to
a non-Tantivy path during tests.

### Changes

1. **Content verification**
([conftest.py](tests/api-testing/tests/query_agent/conftest.py)): Every
hit from a `match_all` query that returns the `log` field is now checked
— each search term word must be present in `log`. A hard assertion fails
if Tantivy returns rows that don't contain the search terms.

2. **Tantivy readiness gate**
([test_2_parquet.py](tests/api-testing/tests/query_agent/test_2_parquet.py)):
After `node/flush`, the test now polls with a `match_all('warehouse')
LIMIT 1` query (up to 120s timeout) to confirm Tantivy indexes are built
before running FTS assertions. Previously only COUNT(*) was checked.

3. **Multi-word match_all emulation**
([compute_counts.py](tests/test-data/query-agent/compute_counts.py)):
`match_all('ACK batch')` now translates to `(log LIKE '%ACK%' AND log
LIKE '%batch%')` — per-token AND conditions matching Tantivy's
token-level search semantics, instead of the old phrase match `log LIKE
'%ACK batch%'`.

4. **Regenerated expected results** across all query JSON files.

## Test plan

- [ ] Run query agent test suite against an environment with Tantivy
enabled
- [ ] Verify `match_all` content assertions catch intentionally
corrupted results
- [ ] Confirm post-flush Tantivy readiness poll works within the timeout

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Huaijin <haohuaijin@gmail.com>
2026-06-17 08:30:33 +00:00
Neha PandClaude Opus 4.7 1484f920a9 test: expand query agent suite to 570 queries with production SQL patterns (#12534)
## Summary

- Added **46 new queries** (Q511-Q556) to the query agent regression
suite, bringing the total from 524 to **570 unique queries**
- Mined from real production SQL patterns (june7.sql) and adapted to use
existing test data fields
- Fixed **15 pre-existing duplicate IDs** (Q226-Q240 existed in both
aggregation.json and basic_select.json — renumbered to Q557-Q571)

## New query distribution

| Category | New | Description |
|---|---|---|
| string_functions | +10 | spath() + str_match_ignore_case, split_part()
+ chr(), multi-COALESCE chains, CAST AS VARCHAR |
| histogram | +7 | 30-second/min intervals, COUNT FILTER, SUM(CASE
WHEN), NULL breakdowns |
| date_time | +6 | arrow_cast(), date_trunc(), to_timestamp_micros(),
timestamp arithmetic, LAG for gaps |
| combined | +6 | count(distinct) in CASE WHEN, re_match + re_not_match
combo, FILTER in aggregation, HAVING percentages |
| full_text_search | +5 | re_match + re_not_match, regexp_like,
match_all(), str_match_ignore_case with COALESCE |
| cte_subquery | +4 | CTE with spath, CTE with COALESCE fallbacks,
correlated subquery |
| aggregation | +2 | IS NOT NULL exploration patterns, multi-column
GROUP BY |
| window | +2 | NTILE with COALESCE PARTITION, LAG with delta
calculation |
| basic_select | +2 | Complex COALESCE + CAST chains, NULLS LAST
ordering |
| cross_stream | +1 | LEFT JOIN on dual keys across streams |
| union | +1 | UNION ALL with different metric types |

## New OO-specific functions covered

Four functions previously had **zero test coverage**:
- `chr()` — 1 query (string splitting by character code)
- `arrow_cast()` — 1 query (DataFusion timestamp arithmetic)
- `date_trunc()` — 1 query (minute-level timestamp bucketing)
- `to_timestamp_micros()` — 1 query (microsecond-to-timestamp
conversion)

Plus expanded coverage of rare functions: `spath()` (+3), `split_part()`
(+3).

## Test modes

- **38/46** new queries have full sqllogictest comparison (DuckDB
computed expected results)
- **8/46** use legacy assertions for OO-specific functions that DuckDB
cannot replicate (spath, arrow_cast, date_trunc, to_timestamp_micros)
- Overall suite: **533** sqllogictest, **37** legacy

## Changes

| File | Change |
|---|---|
| `data_gen.py` | `NUM_QUERIES` 520 → 575 |
| `gen_q511_q556.py` | New: query generation script |
| 13 category JSON files | Updated with new queries + dedup fix |

## Verification

- `compute_counts.py` ran successfully on all 570 queries
- 0 duplicate IDs across all 13 category files
- Only gap: Q025 (pre-existing)

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-10 06:24:40 +00:00
Neha PandClaude Sonnet 4.6 146d5e7612 feat(tests): vortex file format test suite (scenarios 1–83) (#12472)
## Summary

- Adds **239 new tests** covering the vortex columnar file format across
78 scenarios from the test plan
- **`tests/api-testing/tests/vortex/`** — 9 test modules (83 tests):
format conversion, schema evolution, data integrity, FTS, downsampling,
API format awareness, server config, and performance/stress
- **`tests/api-testing/tests/query_agent/test_3_vortex.py`** — 156
tests: the full 155-query SQL correctness suite + scenario 39
(self-join) run post-flush against vortex files
- **`api-testing.yml`** — adds `--ignore=tests/vortex` to the OSS
default-set run; vortex tests require the enterprise binary with
`ZO_FILE_FORMAT=vortex` and are gated to enterprise CI only

## Test plan coverage

| Module | Scenarios |
|--------|-----------|
| `test_format_conversion.py` | 1–13, 7, 8, 9, 10 |
| `test_schema_evolution.py` | 14–25 |
| `test_data_integrity.py` | 55–62 |
| `test_fts.py` | 51–54 |
| `test_downsampling.py` | 47–50 |
| `test_api_format.py` | 71–73 |
| `test_config.py` | 66–67 |
| `test_performance.py` | 74–78 |
| `test_3_vortex.py` | 26–46 (155 queries + JOIN) |

## Enterprise CI

Two dedicated jobs added in the companion `openobserve/o2-enterprise` PR
on the same branch:
- **`api_query_agent_vortex`** — runs `test_3_vortex.py` with
`ZO_FILE_FORMAT=vortex`
- **`api_vortex_format_tests`** — runs the full `tests/vortex/` suite
with 4-phase server lifecycle (parquet→vortex→parquet→vortex+compaction)

OSS CI is unchanged except for the ignore rule — no vortex tests run
against the OSS binary.

## Test checklist

- [ ] `tests/vortex/` collects cleanly: `83 tests collected`
- [ ] `tests/query_agent/test_3_vortex.py` collects cleanly: `156 tests
collected`
- [ ] Enterprise CI `api_query_agent_vortex` job passes
- [ ] Enterprise CI `api_vortex_format_tests` job passes

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 13:57:17 +00:00
Neha PandClaude Opus 4.7 008398163b test: add more queries to query regression (#12487)
## Summary
- Adds **100 new structural-pattern queries** (Q411-Q510) across all 13
categories, bringing the suite from 425 to **525 queries**
- Adds **cross-stream JOIN/UNION support**: `stream_offset` in
data_gen.py, `STREAM2` in conftest, dual-table DuckDB oracle
- 15 cross-stream queries (Q401-Q415) covering INNER/LEFT/RIGHT JOIN,
EXISTS/NOT EXISTS, UNION ALL across streams
- Bumps data_gen.py from 510 to 520 query capacity

## Changes
- **Infrastructure**:
[conftest.py](tests/api-testing/tests/query_agent/conftest.py),
[compute_counts.py](tests/test-data/query-agent/compute_counts.py),
[data_gen.py](tests/test-data/query-agent/data_gen.py)
- **New file**:
[cross_stream.json](tests/test-data/query-agent/queries/cross_stream.json)
— 15 queries
- **12 categories**: 85 queries across aggregation, basic_select,
combined, cte_subquery, date_time, full_text_search, histogram,
math_functions, pagination, string_functions, union, window

## Test plan
- [x] `compute_counts.py` generates expected results for all 525 queries
- [ ] Run `pytest tests/query_agent/ -v` against target environment (565
tests expected)

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-08 04:38:40 +00:00
Neha PandClaude Opus 4.7 0334dda9a3 test: add data variety and NULL stress to query agent data generation (#12485)
## Summary

Two high-value improvements to the query agent regression test data:

1. **Data variety** — Per-field rotation offsets (`qi*13 + i*7`) replace
the old uniform `idx % len(pool)` approach. Previously all fields picked
from the same pool position, creating only 5 fixed row shapes per query.
Now field-value combinations vary independently per field.

2. **NULL stress** — 8 fields (`bot_flag`, `info_tag`,
`upstream_error_code`, `page_url`, `endpoint_path`, `resource_path`,
`variant_tag`, `threat_flag`) get `None` for 40% of records per query.
This exercises `IS NULL` / `IS NOT NULL` / `COALESCE` paths that were
previously untested.

## Changes
- `data_gen.py`: Rewrote `make_record()` with per-field rotation and
NULL injection
- 24 queries: Adjusted WHERE/HAVING filters to match new data
distribution
- All 12 query JSONs: Regenerated expected results via
`compute_counts.py`

## Impact
- 400 queries all have results (18 pre-existing legacy/skip queries
unchanged)
- No change to record count (still 5/query, 2000 total) — test time
unaffected (~7 min)

## Test plan
- [x] `compute_counts.py` regenerates all expected results
- [ ] Run `pytest tests/query_agent/ -v --tb=short` against dev
environment

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 08:11:47 +00:00
Neha PandClaude Opus 4.7 5eb63395f1 test: broaden coverage with structural query templates (#12482)
## Summary
- Adds 200 new SQL queries (Q201-Q400) across all 12 categories,
extracted as structural templates from production `june6.sql` query
patterns
- All queries use the existing synthetic `FIELD_POOL` schema — zero real
stream/field names
- Bumps `data_gen.py` from 200 → 400 queries (4000 records total, 10 per
query)
- Introduces new structural patterns previously missing from the suite

## New patterns
- **CONCAT + COALESCE chains**: Multi-field string construction for
display messages
- **CASE WHEN inside histogram COUNT**: Platform mapping + conditional
aggregation
- **Multi-field LIKE / NOT LIKE OR chains**: Text search across 4-8
fields
- **NOT IN + IS NOT NULL**: Exclusion filters with null safety
- **Long IN lists**: 5+ values in WHERE clauses
- **Percentage calculations**: `100.0 * COUNT(CASE WHEN ...) / COUNT(*)`
patterns
- **approx_percentile_cont in subqueries**: P95/P99 in nested SELECTs
- **Histogram with breakdown**: `GROUP BY _time, breakdown` pattern
- **char_length CASE fallbacks**: `CASE WHEN char_length(f) > 0 THEN f
ELSE fallback END`
- **CTE with multiple subquery references**: Self-join and multi-CTE
patterns

## Distribution
| Category | New | Range |
|----------|-----|-------|
| aggregation | 25 | Q201-Q225 |
| basic_select | 25 | Q226-Q250 |
| combined | 20 | Q251-Q270 |
| cte_subquery | 25 | Q271-Q295 |
| date_time | 10 | Q296-Q305 |
| full_text_search | 20 | Q306-Q325 |
| histogram | 25 | Q326-Q350 |
| math_functions | 8 | Q351-Q358 |
| pagination | 7 | Q359-Q365 |
| string_functions | 15 | Q366-Q380 |
| union | 12 | Q381-Q392 |
| window | 8 | Q393-Q400 |

## Test plan
- [x] `compute_counts.py` generates DuckDB expected results for all 400
queries
- [ ] CI: 800 tests (400 × 2 phases) pass

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 02:31:06 +00:00
Neha PandClaude Opus 4.7 4d48bbb21b test: expand query agent regression suite (#12479)
## Summary
- Expands the SQL regression catalog from **155 to 200 queries** across
all 12 categories
- Adds **7 queries** extracted from abc.sql (Q156-Q162) — synthesized
from real-world OpenObserve SQL patterns with all data/fields/streams
generated from scratch
- Adds **230 auto-generated queries** (Q163-Q392) from templates to
cover query format diversity
- Both test phases pass: **200 memtable + 200 parquet = 400 total**

## Key changes
- **data_gen.py**: 43 new fields (record_type, site_name, latency_ms,
payload_size, alert_tags, phase_data, db_info, etc.), generates 3920
deterministic records
- **compute_counts.py**: new translations for regexp_like,
str_match_ignore_case, approx_distinct, json_get_str/json_get_json
chaining; empty-aggregate result detection (OO returns 0 rows vs
DuckDB's 1 NULL row)
- **conftest.py**: PID-based stream name suffix for cross-invocation
isolation (prevents data accumulation)

## Test plan
- [x] test_1_memtable.py — 392 passed
- [x] test_2_parquet.py — 392 passed
- [x] All 7 abc.sql queries pass (Q156-Q162)
- [x] No real stream names, field names, or data copied from external
sources

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 04:59:20 +00:00
Neha PandClaude Sonnet 4.6 73ce75c883 fix(tests): bump query_agent ingest timeout 120s → 300s (#12444)
## Summary

- ENT CI runners are slower than local/OSS runners — the
`ingest_query_agent_data` fixture was hitting the 120s timeout before
1550 records became searchable, causing all 310 query_agent tests to
fail at setup
- Bumped `wait_until` timeout to 300s

## Test plan
- [ ] OSS `api_query_agent_tests` passes as before
- [ ] ENT `api_query_agent_tests` no longer hits WaitTimeout on ingest

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:56:50 +00:00
Neha PandClaude Opus 4.7 eb7cce9b96 test: query agent SQL regression suite — 155 queries, sqllogictest-style, two-phase (#12384)
## Summary

155-query SQL regression test suite covering 12 categories. Adding a new
query requires zero test code changes — drop a JSON entry into the right
category file and run `compute_counts.py`.

**Sqllogictest-style comparison**: DuckDB pre-computes full expected
result sets (not just row counts). The test runner extracts actual
values from OO hits, sorts both sides, and compares cell-by-cell with 5%
relative float tolerance. This catches value-level regressions that
row-count-only checks miss.

Two-phase execution: **memtable** (pre-flush) then **parquet**
(post-flush + Tantivy). **310/310 pass**.

## Architecture

```
tests/
├── api-testing/tests/query_agent/
│   ├── conftest.py            # Shared fixtures, run_query(), tolerance comparison
│   ├── test_1_memtable.py     # Phase 1: all queries pre-flush (FTS skipped)
│   └── test_2_parquet.py      # Phase 2: post-flush (module-scoped fixture triggers flush)
└── test-data/query-agent/
    ├── data_gen.py             # Deterministic data generator (single source of truth)
    ├── compute_counts.py       # DuckDB oracle: computes expected result sets
    ├── base_ts_override.json   # Locks BASE_TS so compute and tests share same timestamps
    └── queries/                # 12 JSON files, 155 queries with expected results
```

### How it works

1. **Deterministic data** — `data_gen.py` generates 10 records per query
(1550 total) with a warehouse/supply-chain IoT schema. Each query Q{N}
gets isolated timestamps. `BASE_TS` is locked via
`base_ts_override.json` so compute and tests share identical timestamps
(prevents histogram bucket drift on minute boundaries).

2. **Unique stream per session** — `STREAM =
f"query_agent_test_{int(time.time())}"` prevents accumulated-data bleed
from prior runs.

3. **DuckDB oracle** — `compute_counts.py` loads the same dataset into
DuckDB, creates a pre-filtered VIEW per query (so time filters work for
CTEs, subqueries, UNIONs — no fragile SQL injection), translates
OO-specific functions, and writes `expected.results` blocks into the
query JSONs.

4. **Histogram translation** — `histogram(_timestamp, 'N unit')` is
translated to integer arithmetic matching OO's `date_bin` with origin at
2001-01-01T00:00:00 UTC. Verified against DataFusion CLI — 100/100
records match across all interval types (15s, 30s, 1m, 2m, 3m, 4m, 5m).
ISO timestamp post-processing converts epoch-µs bucket values to
`YYYY-MM-DDTHH:MM:SS` strings matching OO's serialization format.

5. **Sqllogictest comparison** — `run_query()` checks for
`expected.results`. When present, it extracts column values from hits as
strings, sorts both actual and expected (`results_mode: "rowsort"`), and
compares cell-by-cell with 5% relative float tolerance (handles
cross-engine floating-point drift in AVG/STDDEV/etc.).

6. **Two-phase testing** — `test_1_memtable.py` runs all queries
pre-flush (FTS sqllogictest skipped — Tantivy indexes don't exist yet).
`test_2_parquet.py` has a module-scoped `post_flush` fixture that
triggers `/node/flush`, re-polls until data is searchable, then runs all
queries with full assertions.

### Comparison modes

| Mode | Count | Mechanism |
|------|-------|-----------|
| **Sqllogictest** | 140 | Cell-by-cell comparison with 5% float
tolerance |
| **Skip sqllogictest** | 9 | DuckDB results for documentation, fall
back to legacy assertions |
| **Legacy** | 6 | 5 auto-interval histograms + Q122 (STRING_AGG
DISTINCT ORDER BY) |

**Skip sqllogictest queries** — known OO-DuckDB divergence:

| Query | Reason |
|-------|--------|
| Q037 | ROW_NUMBER tie-breaking differs between engines |
| Q058 | Self-join pairings non-deterministic across engines |
| Q072 | FULL OUTER JOIN histogram — NULL handling differs |
| Q080 | FTS `match_all` + histogram — Tantivy vs SQL LIKE |
| Q111 | ROW_NUMBER ties in pagination |
| Q117 | STRING_AGG ordering differs between engines |
| Q121 | STRING_AGG concatenation order |
| Q127 | UNION across 5 overlapping groups — boundary records compete
for LIMIT spots |
| Q152 | PERCENT_RANK tie-breaking differs between engines |

### Key design decisions

| Decision | Why |
|----------|-----|
| Full result-set comparison | Catches value-level regressions (e.g.,
ROUND producing wrong decimal) |
| `rowsort` mode | DuckDB and OO order ties differently — sorting both
sides eliminates spurious failures |
| 5% float tolerance | Cross-engine AVG/STDDEV/PERCENTILE differ at
least-significant digits |
| `''` = `'None'` normalization | OO serializes NULL as empty string;
DuckDB uses `"None"` |
| DuckDB VIEW for time filtering | WHERE injection into CTEs/subqueries
is fragile — VIEW filters at scan level |
| Dynamic columns excluded | `_timestamp` and `_time` differ between
compute time and test time |
| OO-dropped LAG columns excluded | `prev_tput`, `hours_2_back`,
`delta_from_prev`, `temp_diff` |
| Histogram → DuckDB integer math | DuckDB lacks `date_bin`; integer
formula verified via DataFusion CLI |
| BASE_TS override file | Prevents histogram timestamp drift when
compute and test run at different minutes |
| 1s time window margins | Minimizes cross-query data bleed while
capturing all 10 records |
| `pytest.fail()` on fixture failure | Stops all tests instead of
running 310 against an empty stream |

### Categories covered

| Category | Queries | Description |
|---|---|---|
| aggregation | Q001-Q020 | GROUP BY, COUNT, AVG, SUM, MIN, MAX, FILTER,
HAVING |
| basic_select | Q021-Q035 | WHERE, IN, BETWEEN, LIKE, ORDER BY,
DISTINCT, CASE |
| combined | Q036-Q045 | JOINs, multi-condition filters, combined
aggregations |
| cte_subquery | Q046-Q062 | CTEs, subqueries, derived tables, EXISTS |
| date_time | Q063-Q073 | Date parsing, formatting, extraction, interval
arithmetic, histogram |
| full_text_search | Q074-Q082 | match_all, match against fields |
| histogram | Q083-Q093 | histogram() bucketing, aggregation over
buckets |
| math_functions | Q094-Q102 | ROUND, SQRT, ABS, POWER, arithmetic
expressions |
| pagination | Q103-Q112 | LIMIT, OFFSET, combination with filters and
sorts |
| string_functions | Q113-Q122 | SUBSTR, CONCAT, UPPER, LOWER, TRIM,
LIKE patterns |
| union | Q123-Q134 | UNION ALL, UNION (dedup), CTE + UNION combinations
|
| window | Q135-Q155 | ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, SUM/AVG
OVER |

## Test plan

- [x] All 155 queries pass in both phases (310/310)
- [x] 140 queries with sqllogictest cell-by-cell comparison
- [x] 17 histogram queries converted from legacy to sqllogictest
- [x] 9 queries with skip_sqllogictest for known OO-DuckDB divergence
- [x] 6 queries in legacy mode (auto-interval histograms + Q122)
- [x] BASE_TS locked via override file — no timestamp drift
- [x] Dedicated CI job (`api_query_agent_tests`) runs in parallel

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-03 09:30:02 +00:00
+5 ae22a74e62 feat: ux improvement main (#11838)
#11720

Design at:

https://github.com/openobserve/designs/blob/main/dashboards/ux-improvement-dialog/design.md

---------

---------

Co-authored-by: ktx-vaidehi <134508096+ktx-vaidehi@users.noreply.github.com>
Co-authored-by: Abhay Padamani <141122205+ktx-abhay@users.noreply.github.com>
Co-authored-by: Sai Nikhil <nikhil@openobserve.ai>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: ktx-akshay <akshay.patil@kiara.tech>
Co-authored-by: Bhargav <BJP232004@GMAIL.COM>
Co-authored-by: ktx-mihir <mihir.patel@kiara.tech>
Co-authored-by: ktx-riya <riya.kukadiya@kiara.tech>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Omkar Kesarkhane <127078473+omkarK06@users.noreply.github.com>
Co-authored-by: omkark06 <omkar@zinclabs.io>
Co-authored-by: ktx-vaidehi <vaidehi.akhani@kiara.tech>
Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2026-05-28 11:00:49 +00:00
ktx-akshay 84c72f98b9 test: add automation coverage for Sankey chart visualization (#10761) 2026-03-06 12:18:07 +05:30
Neha PandClaude da65a0ec8d test: add broadcast joins tests (#10557)
Add comprehensive API tests for logs-to-logs joins with asymmetric data
sizes:
- 29 test cases covering INNER/LEFT/RIGHT/FULL joins, aggregations,
filters
- Subquery tests with IN/NOT IN, substr, length, CONCAT functions
- Tests run with both ZO_FEATURE_JOIN_MATCH_ONE_ENABLED=true and false
- Test data: logs_small.json (10 records) and logs_large.json (50
records)

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-19 18:38:42 +05:30
Neha PandClaude 5ee7aff96d test: add search patterns E2E tests and pipeline cron display assertion (#10544)
## Summary
- Add E2E tests for the Search Patterns feature (Enterprise feature)
- Add assertion to verify pipeline cron expression displays correctly in
the pipeline list after import
- Add page object methods for Search Patterns feature to logsPage.js

## Test Details

### Search Patterns Tests (`@enterprise` tag)
10 new tests covering:
- **P0 Smoke Tests**: Toggle visibility, switching to patterns view,
patterns loading, statistics display
- **P1 Functional Tests**: Pattern card display, include/exclude
buttons, details dialog, navigation
- **P2 Edge Cases**: Anomaly badge display, navigation button states

### Pipeline Cron Display
- Adds `expectScheduledPipelineCronDisplayed()` method to verify cron
expression is visible in the Frequency column
- Applied to both scheduled pipeline import tests

## Files Changed
- `tests/ui-testing/pages/logsPages/logsPage.js` - Added 20+ Search
Patterns selectors and methods
- `tests/ui-testing/pages/pipelinesPages/pipelinesEP.js` - Added cron
display verification method
- `tests/ui-testing/playwright-tests/Logs/searchPatterns.spec.js` - New
spec file with 10 tests
- `tests/ui-testing/playwright-tests/Pipelines/pipelineImport.spec.js` -
Added cron assertion

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-18 14:54:31 +05:30
Neha PandClaude 93d4914b52 test: add API tests for cross-stream type JOIN with enrichment tables (#10173)
### **User description**
Tests the feature from PR #5452 - joining logs with enrichment tables
using both enrichment_tables.{table} and enrich.{table} prefixes.

Test cases:
- JOIN with enrichment_tables prefix
- JOIN with enrich prefix (shorter alias)
- LEFT JOIN preserves all rows
- JOIN with GROUP BY aggregation
- JOIN with WHERE clause filtering
- Verify enriched columns appear in results
- Both prefixes return identical results

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


___

### **PR Type**
Tests


___

### **Description**
- Add API tests for enrichment table cross-stream JOIN

- Test both `enrichment_tables` and `enrich` prefixes

- Include LEFT JOIN, aggregation, and WHERE filter scenarios

- Validate enriched column presence and prefix equivalence


___



<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>test_enrichment_table_join.py</strong><dd><code>Tests
for enrichment table JOIN suite</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

tests/api-testing/tests/test_enrichment_table_join.py

<ul><li>New test suite <code>TestEnrichmentTableJoin</code> with 7
methods<br> <li> Fixture setup/teardown for enrichment table
creation<br> <li> Tests cover prefix variants, LEFT JOIN, aggregation,
filtering<br> <li> Utility helpers for multipart upload and SQL
search</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10173/files#diff-59300e59ac91f497cbad0e9df7ee3c47ade382b0f37382da4f25861eac3e2628">+338/-0</a>&nbsp;
</td>

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

</details>

___

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-23 19:21:57 +05:30
Shrinath RaoandClaude Opus 4.5 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>&nbsp; </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>&nbsp;
&nbsp; </td>
</tr>
<tr>
<td><strong>dashboard-joins.js</strong><dd><code>New JoinHelper for
configuring and validating joins</code>&nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-f88eb0cf951ec45e97befde5c83a2c187bb46db3f6cb27bc0cb88d48c5f45b78">+351/-0</a>&nbsp;
</td>
</tr>
<tr>
<td><strong>dashboard-panel-actions.js</strong><dd><code>Add next-panel,
row count and chart render verifications</code>&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-d29713fdcc11cbc93bda29da5261da389226cd718e4292a1c2cd96629f573a80">+76/-1</a>&nbsp;
&nbsp; </td>
</tr>
<tr>
<td><strong>global-setup.js</strong><dd><code>Include org_identifier in
login navigation URL</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-06323dad7214f86b41b62e121e716eeea0054bc4d950c6bcf4a0efe53894acc8">+4/-3</a>&nbsp;
&nbsp; &nbsp; </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>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </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>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-d2a9855da60f5fd3820832815036c368a680e2885033ad1a7a2bcbd060e2a750">+372/-0</a>&nbsp;
</td>
</tr>
<tr>
<td><strong>test_records.json</strong><dd><code>Add test data for
dashboard functions tests</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-3a09d97f4091ae2f4dc97ebc14199c5d94efb878a6ebfa7da686cad5450ddda0">+7/-0</a>&nbsp;
&nbsp; &nbsp; </td>
</tr>
<tr>
<td><strong>test_app_users.json</strong><dd><code>Add user data for
dashboard joins tests</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-7c5af3decd88c4f9031fd83282844872f4a0a65eea2b51a46aac849aa4a5c129">+7/-0</a>&nbsp;
&nbsp; &nbsp; </td>
</tr>
<tr>
<td><strong>test_sessions.json</strong><dd><code>Add session data for
dashboard joins tests</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-836e072600882ffa58662a4867ac17d2ce799dd338daac585203ccaa01275e3c">+10/-0</a>&nbsp;
&nbsp; </td>
</tr>
<tr>
<td><strong>test_web_requests.json</strong><dd><code>Add web request
data for dashboard joins tests</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-1c4b00b1929e9a01de1cb8129161c49dc1563a5dde1c4b5e770a307245155382">+14/-0</a>&nbsp;
&nbsp; </td>
</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>cleanup.spec.js</strong><dd><code>Extend cleanup regex for
join and function test streams</code>&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/9685/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+8/-1</a>&nbsp;
&nbsp; &nbsp; </td>
</tr>
</table></details></td></tr></tbody></table>

</details>

---

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-19 07:30:12 +05:30
Neha PandClaude 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>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

tests/ui-testing/pages/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>&nbsp;
</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>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</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>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td>
    <details>
<summary><strong>ingestion-config.spec.js</strong><dd><code>Add
ingestion configuration tests</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</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>&nbsp;
</td>

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

</details>

___

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-12-16 17:51:24 +05:30
ktx-akshay 7efa71f8ed test(dashboard): add test cases for table chart JSON mode (#9500) 2025-12-11 15:46:31 +05:30
Neha PandClaude 52b2759bfa test: add INTERSECT and EXCEPT query tests for PR #9544 (#9601)
Added 4 new test cases to verify the join optimization fix:
- INTERSECT query: Common user_ids in both streams
- EXCEPT query: Users without orders
- INTERSECT with WHERE clause: Active users with orders
- EXCEPT with multiple columns: Users details without orders

Also improved test_joinqueries.py by adding a 3-second sleep after data
ingestion to allow proper indexing before querying.

Co-authored-by: Claude <noreply@anthropic.com>
2025-12-11 14:06:13 +05:30
Neha PandClaude 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>
2025-12-10 19:09:52 +05:30
Shrinath Rao 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.
2025-12-09 15:49:28 +05:30
Neha P 8a158884c8 test: match_all_camelcase_tests (#9345)
- Verify full camel case token search: DbException should be found when
searching for complete camel case identifiers
- Verify atomic token search: UserAccountService should be searchable
and return matching results for full service class names
- Verify XML acronym tokenization: XMLHttpRequest should be properly
tokenized and discoverable through match_all queries
- Verify camel case with numbers: OAuth2TokenHandlershould handle mixed
alphanumeric camel case tokens correctly
- Verify multi-word service search:UserManagementService should support
complex multi-word camel case service names
2025-11-27 15:04:13 +05:30
Shrinath Rao f61b715a1e test: Cleanup Mechanism and ENV Runs for e2e tests (#8839)
### **PR Type**
Enhancement, Tests


___

### **Description**
- Add robust alerts cleanup utilities

- Improve UI flows and resiliency

- Support deployed env testing delays

- Add CI cleanup and health checks


___

### Diagram Walkthrough


```mermaid
flowchart LR
  UI["Playwright UI flows hardened"]
  API["APICleanup cascade (Alerts→Folders→Destinations→Templates)"]
  CI["CI workflow targets deployed env"]
  Delay["Configurable test step delay"]
  Data["Global ingestion more robust"]

  UI -- "uses" --> API
  CI -- "runs cleanup.spec" --> API
  CI -- "health checks + env vars" --> Data
  Delay -- "slows page ops" --> UI
  Data -- "ingest logs with parsing" --> UI
```



<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>7
files</summary><table>
<tr>
<td><strong>alertDestinationsPage.js</strong><dd><code>Add search,
cascade-safe delete, bulk prefix cleanup</code>&nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-57e5c53b4ef998b3d8708149620ff94dcc46807927f1a3a9e9f28ed3ebe25b0a">+178/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>alertTemplatesPage.js</strong><dd><code>Add template search,
in-use handling, prefix cleanup</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-f4ebd248b2140051e74dbbbd1aabe344f01c80704ce5857e9c28a04350e018f3">+177/-2</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>alertsPage.js</strong><dd><code>Harden alert actions, bulk
deletion, search across folders</code></dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-79ee01d6d7f145f19207b93b87143b545a1188cfc6a82bc8c45fecfbf68f8a1d">+280/-9</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>apiCleanup.js</strong><dd><code>New API-based cascade
cleanup utility</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-537fe76c0d8e26e81c5f77c83bd0ee35daaa973822105c809bf83171a26b33c5">+399/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>page-manager.js</strong><dd><code>Wire APICleanup into
PageManager</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-565eab8b3c767ae50c9d05e591621d14f66b81af84d6b5ea6efe136c1c3933df">+4/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>baseFixtures.js</strong><dd><code>Add configurable test step
delay hooks</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-c4c5ee7fbb248d1ab14d3d4e33ffb9626f9aab74c9e0207fcfc08051c8c3c7ee">+46/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>global-setup.js</strong><dd><code>Harden login and ingestion
with diagnostics</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-06323dad7214f86b41b62e121e716eeea0054bc4d950c6bcf4a0efe53894acc8">+61/-22</a>&nbsp;
</td>

</tr>
</table></details></td></tr><tr><td><strong>Bug
fix</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>commonActions.js</strong><dd><code>Fix ingestion URLs to use
org variable</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-4d726dd2bdb34b2c90a31798ff49b6df5bc952bd049b7c38bebb18b6db0076e2">+4/-4</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

</table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>4
files</summary><table>
<tr>
<td><strong>alerts-e2e-flow.spec.js</strong><dd><code>Pre-move folder
cleanup and stabilization</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-32972e38c1fe0e8bb887f9f254b3130916a36f96ea924f9987493d44efefeab9">+13/-3</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>alerts-import.spec.js</strong><dd><code>Use dedicated
invalid import test data</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-62b6ec4818685eacc0a934d68aaadfd73b512ef4f4be25fcd5135b97c2844912">+1/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>cleanup.spec.js</strong><dd><code>New pre-test API cleanup
spec</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-c214275a512fa285a7e4f2ab61dfcb42d71a0436b0e4241f94d7b45693587983">+29/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>invalid-alert.json</strong><dd><code>Add invalid alert
sample for import tests</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-c695f71048e9393a45d3e3e3e415696559fecf3ba85712e7c3f366092f53f424">+24/-0</a>&nbsp;
&nbsp; </td>

</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>playwright.yml</strong><dd><code>Target deployed env; add
cleanup job and health checks</code>&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8839/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3">+123/-65</a></td>

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

</details>

___
2025-11-04 23:54:54 +05:30
Shrinath Rao d70c75e4bc test: added tests for ent repo - not to be run, but maintained (#8956) 2025-11-04 22:26:50 +05:30
923348bb43 fix: ux changes for logs page (#8790)
### **PR Type**
Enhancement, Bug fix, Documentation


___

### **Description**
- Extracted inline styles to scoped SCSS

- Improved logs UI/UX and theming

- Fixed flicker and pagination UX

- Added reusable toolbar and collapse styles


___

### Diagram Walkthrough


```mermaid
flowchart LR
  SearchBar["SearchBar.vue"] -- "toolbar, toggles, menu UX" --> Styles["New SCSS modules"]
  IndexList["IndexList.vue"] -- "field list pagination, loading" --> Styles
  SearchResult["SearchResult.vue"] -- "histogram/table layout refactor" --> Styles
  Index["Index.vue"] -- "splitter/collapse UX, visualize container" --> Styles
  TenstackTable["TenstackTable.vue"] -- "table hover/headers theme" --> Styles
  DetailTable["DetailTable.vue"] -- "wrap toggle, layout" --> Styles
  History["SearchHistory.vue"] -- "wrap toggle, warning pill" --> Styles
  Scheduler["SearchSchedulersList.vue"] -- "rounded btn, external styles" --> Styles
  TransformSel["TransformSelector.vue"] -- "toolbarized toggle, icons" --> Styles
  FunctionSel["FunctionSelector.vue"] -- "class hooks, styles" --> Styles
  SyntaxGuide["SyntaxGuide.vue"] -- "dark mode class, ext styles" --> Styles
  JsonPreview["JsonPreview.vue"] -- "externalized styles" --> Styles
  App["App.vue"] -- "theme root class" --> AppStyles["app.scss: global scrollbar, collapse btn"]
```



<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>31
files</summary><table>
<tr>
<td><strong>SearchBar.vue</strong><dd><code>Toolbar/UI cleanup, toggles
and menus restyle</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-81893de4edf186b0556f610acb280c87baa2ffe67d3b48a60a866094c7635baf">+272/-585</a></td>

</tr>

<tr>
<td><strong>IndexList.vue</strong><dd><code>Field list pagination UX,
loading state, helpers</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-08f058f883b659e713e606991a7ea37ae1ff016b7cccef970489ab5840dc3d09">+133/-419</a></td>

</tr>

<tr>
<td><strong>SearchResult.vue</strong><dd><code>Histogram/table layout
classes, external styles</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-5e65533aa4754bb6d0074fda18ffc1ecacded3b9ca6bc28a161c3f6b12f20195">+30/-283</a></td>

</tr>

<tr>
<td><strong>Index.vue</strong><dd><code>Splitter/collapse UX, visualize
container cleanup</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0323c3da69b369843c5d72bf4df5b00ca6b5147192a213baf331659ecf92af62">+99/-57</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>DetailTable.vue</strong><dd><code>Wrap toggle restyle and
list/table CSS extraction</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-80552b5d25fa6cef9fbbe430b1865d761c4b132284c2d2175afceea8cbabc8c7">+19/-79</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>SearchSchedulersList.vue</strong><dd><code>Minor button
rounding, moved styles to SCSS</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0c0a4097c53f07712d35562b1336602bf24faddedab77a9f5717f5582dcac2f1">+2/-137</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>TenstackTable.vue</strong><dd><code>Table container class
and theming adjustments</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-bc3c669f5ab65a42ae378df1f7d6b35014c9c220790bdcc72b47f55d1385dc22">+5/-104</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>SearchHistory.vue</strong><dd><code>Wrap toggle restyle and
externalized styles</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-9dd167bd5e272b2057f53c16b905047eec00655a3552daad240a964d67a6f56d">+13/-100</a></td>

</tr>

<tr>
<td><strong>TransformSelector.vue</strong><dd><code>Toolbarized
transform toggle and SCSS import</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0037d8dd9cfbacc26309b26e98ae953e7ccbd0891ac2fd01c6314ebd7eed9d2c">+25/-47</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>JsonPreview.vue</strong><dd><code>Moved component styles to
shared SCSS</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-3985073134d35ff074742944b114d0905524038b42e6d2ac887fef2c8436fb16">+1/-109</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>SyntaxGuide.vue</strong><dd><code>Dark-mode class hook and
SCSS extraction</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-c6e8bb651fadd2b15b5b97f5b6069a57813fb97cc3d06eef983af4def33e8806">+5/-67</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>FunctionSelector.vue</strong><dd><code>Class hooks and SCSS
module inclusion</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-11d9577516700b94b5f3325e77214d0d886473e690db8c9ea981613c9fb89b68">+5/-3</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>VisualizeLogsQuery.vue</strong><dd><code>Externalized
layout/splitter styles</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-979b01d943d58c5d70faeeac5948b7f02f0b2392a12b84ef07ba7f7393ab0261">+1/-50</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>DateTime.vue</strong><dd><code>Rounded buttons and hover
feedback</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-c06c96ba750be6fc82f517a53ba809efff8aa619aba203b871d4d2aeb7f64f60">+6/-2</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>App.vue</strong><dd><code>Theme root class binding for
global styles</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-7322e6842f92edbe4a6e810d63f066ec95e64806d64a02b52e2b9bef2a73db91">+7/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>app.scss</strong><dd><code>Global scrollbar, collapse
button, toggles polish</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-5703d12504b0395cbfbbfad02a592bc391496026e5f03743102ce06c210ea05f">+142/-2</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>search-result.scss</strong><dd><code>New SCSS for search
result layout and table</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-e98f726aae49bdd5f8a426c8023eed612f3f33d52b0d458b7730990b3aafc41e">+235/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>detail-table.scss</strong><dd><code>New SCSS for detail
table and panels</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-63d5673331a5ee1ab792d07831e4a6dbb0d2d40d2ad628652d57944e47a96338">+55/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>logs-page.scss</strong><dd><code>New SCSS for logs page
structure and splitter</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-3d8458bb7b934b0529dcb35f85e008a4404510435ee4a636ff86e20cfd2970c9">+1401/-0</a></td>

</tr>

<tr>
<td><strong>search-schedulerlist.scss</strong><dd><code>New SCSS for
scheduler list views</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-42bbf309982cfcfd1cca270e80a2bddd35947e59dd91f600f5c85788af1e0802">+136/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>index-list.scss</strong><dd><code>New SCSS for field/index
list</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0a3be477d7575f8e412bf8092f91901dd1330c8458ebc2b24f96107647cfe200">+139/-0</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>search-history.scss</strong><dd><code>New SCSS for search
history page</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-01ae0807917e4de78780d9ec549ae2b57e3004e7be72cd77536ac5ae75bda3ed">+97/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>transform-selector.scss</strong><dd><code>New SCSS for
transform selector controls</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-131c7ba7388ebe94d30b7f42ca12c30b0840a9f8d69622b68e573e829d9fa7d6">+99/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>syntax-guide.scss</strong><dd><code>New SCSS for syntax
guide dialog</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-7173f5473b8fed57af19a3017f9823e68099745dc181f7996f0024fa8099535c">+78/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>tenstack-table.scss</strong><dd><code>New SCSS for data
table and resizer</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-0175daf538e52ff95480cb40fadf8e26564474f15e39c5fe2d628f2d7e72aa78">+99/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>function-selector.scss</strong><dd><code>New SCSS for
function selector</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-16e97b00c534fae20daf24545e4e6a37b83f59e22668eddfd2083c9d778a9032">+58/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>visualizelogs-query.scss</strong><dd><code>New SCSS for
visualize logs layout</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-263f2af1f510ef9047a88f4cf438ffdc7b22cc598a56071900b898899d5bdab3">+50/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>json-preview.scss</strong><dd><code>New SCSS for JSON
preview and menus</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-27d0a0d1ec327559e1c09ffec34a7fc937db12580f53d61f10897f378af7d6ff">+17/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>quasar-overrides.scss</strong><dd><code>Quasar overrides
aligned to new tokens</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-563af58e60b7250169ebe9ced59dfe163a801a106d7f20964a8d20000b320af5">+16/-15</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>_variables.scss</strong><dd><code>Variables updated for rem
units and theming</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-b3e37ee00c17b89ad1177c5592504277aa645b374095c065ea8b3782df5e89a2">+1/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>quasar-variables.sass</strong><dd><code>Quasar variables
tuned for new UI</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-bb2b39e6af7e949bef75bce0c7021310c42dd0945c30f963e3c8b599598bfdaa">+2/-2</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

</table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>1
files</summary><table>
<tr>
<td><strong>ui-guidelines.md</strong><dd><code>UI guidelines
documentation added</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8790/files#diff-8c5e2f35601f7d06e3389626dd501fc84e694efd6cf0faab6dfaf92445483dfa">+1056/-0</a></td>

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

</details>

___

---------

Co-authored-by: Ashish Kolhe <ashish.j.kolhe@gmail.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2025-10-13 17:13:07 +05:30
Neha PandShrinath Rao 7218fa3439 test: e2e-cte-queries (#8070)
### **PR Type**
Tests


___

### **Description**
- Add advanced CTE logs query e2e tests

- Cover strings, NULLs, joins, unions

- Add error-rate and aggregation analysis

- Add complex multi-part query typing/validation


___

### Diagram Walkthrough


```mermaid
flowchart LR
  CTEs["Add advanced CTE query tests"]
  String["String ops & NULL handling"]
  Joins["JOINs and UNIONs"]
  Analytics["Error-rate and aggregations"]
  Robust["Multi-part typing + validation"]
  CTEs -- "new tests" --> String
  CTEs -- "new tests" --> Joins
  CTEs -- "new tests" --> Analytics
  CTEs -- "new tests" --> Robust
```



<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>logsqueries.cte.spec.js</strong><dd><code>Expand CTE
logs e2e coverage with advanced cases</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

tests/ui-testing/playwright-tests/Logs/logsqueries.cte.spec.js

<ul><li>Add tests for string manipulation CTEs<br> <li> Add NULL
handling and LEFT JOIN CTE tests<br> <li> Add UNION and error-rate
analysis CTE tests<br> <li> Add complex multi-part CTE with typing and
validation</ul>


</details>


  </td>
<td><a
href="https://github.com/openobserve/openobserve/pull/8070/files#diff-153f79d86888d9e3a82f42a15242cacb3a126c263aee91cada88ae04dffacd36">+110/-0</a>&nbsp;
</td>

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

</details>

___

---------

Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2025-08-27 18:24:39 +05:30
Neha P 8eda4d0bf9 test: e2e-cte(with-queries)-testcases (#7704) 2025-07-25 15:02:33 +08:00
Neha P 5dfc889c18 test: e2e-match-all-phrase-tests (#7656) 2025-07-23 21:16:28 +05:30
c2c7ea6a95 test: match_all queries pytest (#7208)
### **User description**
match_all queries pytest


___

### **PR Type**
Tests


___

### **Description**
- Add tests for match_all streaming queries


___



### **Changes walkthrough** 📝
<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>test_streaming.py</strong><dd><code>Add match_all
streaming test cases</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></summary>
<hr>

tests/api-testing/tests/test_streaming.py

<li>Added "match_all query one" test case<br> <li> Added "match_all
query two" test case<br> <li> Added "match_all query three" test case


</details>


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

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

___

> <details> <summary> Need help?</summary><li>Type <code>/help how to
...</code> in the comments thread for any questions about PR-Agent
usage.</li><li>Check out the <a
href="https://qodo-merge-docs.qodo.ai/usage-guide/">documentation</a>
for more information.</li></details>

---------

Co-authored-by: Taiming Liu <liutaiming3@gmail.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2025-06-19 11:57:32 +05:30
+2 0d9f47966b feat: Organization revamp (#5579)
Fixes #5131 
Addresses #5408 

### Revamp
- Created a new table to store organizations in the `organizations`
table. Earlier, we never stored organizations in any table, rather we
used to store the organizations in the meta table as part of the `user`
json.
- The users and organization membership relations are now moved to its
own separate tables - `users` and `org_users`.

### New changes

**API changes** -
- `/organizations` - `POST` api to create an org and save it in the meta
table. In non-enterprise version, currently only the root user can
create the org. For enterprise version with rbac enabled, anyone with
`CREATE` access for organizations can create the organization and
becomes an admin. Root user can always create an organization.
- `/{org_id}/rename` - `PUT` api to rename the existing org. Only root
user and the admins of the org can access this API.

The payload for following APIs are changed -
- `POST api/{org_id}/roles` - `{"name":"new_role"}` is changed to
`{"role":"new_role"}
- `POST api/{org_id}/users/{user}` -
`{"role":"viewer","custom_role":["role_name"]}` is the new payload where
`custom_role` is optional and is array of custom roles (only works in
enterprise with rbac enabled) which will be assigned to the user. The
value of `role` can be standard role or as well as any custom role (when
it is custom role, the standard role assigned to the user is decided
based on the enterprise env variable - `O2_DEX_DEFAULT_ROLE`).
- `POST api/{org_id}/users`- the payload -
```
{"email":"user@user.com","role":"viewer","custom_role":["create_org_permission"],"password":"12345678", "first_name": "", "last_name":""}
```

- `PUT api//{org_id}/users/{email_id}` the payload -
```
{"first_name":"Hello","last_name":"j","role":"viewer","isExternal":false,"change_password":false,"password":"","custom_role":["create_org_permission"]}
```


A new ENV variable is introduced - `ZO_CREATE_ORG_THROUGH_INGESTION`
(default `false`) which if true, an org will automatically created when
ingesting data to a new org. If false, user can not create org by
ingesting data to new org, they need to first call the `POST
/organizations` API.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## Release Notes

**New Features**
- Added a `cloud` feature for enhanced organizational management
capabilities.
- Introduced new methods for managing organizational users and
asynchronous message processing.
- Enhanced user invitation and membership features, including improved
role handling.
- Implemented configurable ingestion URL support across various
components.
- Added new functionality for user management and organization handling
in the super cluster architecture.

**Improvements**
- Refined user authentication and authorization processes, including
error handling.
- Updated database schema to support multi-organization architecture.
- Enhanced pagination settings and UI components for better user
experience.
- Improved handling of organization names and user roles in
notifications and alerts.
- Streamlined service account token management with visibility
enhancements.
- Enhanced the `AddUpdateOrganization` component with improved user
input handling and validation.
- Updated the `AppOrganizations` component to dynamically load the
appropriate organization management interface.
- Improved the `ServiceAccountsList` component with updated pagination
options and token handling logic.

**Bug Fixes**
- Resolved issues with user role assignments and organization management
inconsistencies.
- Corrected routing and navigation logic for login and logout processes.
- Addressed various error handling scenarios in user and organization
processes.
- Fixed issues with the visibility of service account options in the
`EditGroup` and `EditRole` components based on the cloud configuration.

**Breaking Changes**
- Significant restructuring of user and organization data models.
- Changes to authentication workflows and configuration handling.
- Removal of certain components related to user and organization
management.
- Updated the logic for determining the ingestion URL across various
components.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com>
Co-authored-by: Bhargav <BJP232004@GMAIL.COM>
Co-authored-by: Taiming Liu <liutaiming3@gmail.com>
Co-authored-by: hengfei yang <hengfei.yang@gmail.com>
Co-authored-by: harshiv-7 <harshiv@openobserve.ai>
Co-authored-by: Huaijin <haohuaijin@gmail.com>
Co-authored-by: Zhao.wei <weizhao029@gmail.com>
Co-authored-by: ShyamOOAI <shyam@openobserve.ai>
Co-authored-by: oasisk <ashish.j.kolhe@gmail.com>
Co-authored-by: sai nikhil kethe <nikhil@openobserve.ai>
Co-authored-by: Yashodhan Joshi <yashodhan@openobserve.ai>
Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com>
2025-05-25 21:53:55 -07:00
ktx-akshay dbd6c1017b test(dashboard): add geomap and map test cases (#6722) 2025-05-06 19:14:13 +05:30
Shyam PanjiyarandTaiming Liu c3364cbab0 test: Import destination alert playwright (#6631)
1. Import webhook and email destination
2. Import scheduled and realtime alert

---------

Co-authored-by: Taiming Liu <liutaiming3@gmail.com>
2025-04-28 10:45:46 +05:30
Shyam PanjiyarandHengfei Yang e8f348819e test: Import Template Destination Alerts Playwright (#6205)
1. Import webhook and email Template

---------

Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com>
2025-04-23 11:55:46 +05:30