Commit Graph
232 Commits
Author SHA1 Message Date
Hengfei Yang 610cd70a13 fix: generate and store the ext auth salt on a new install instead of refusing to start (#15191) 2026-10-08 09:56:01 +00:00
Prabhat Sharmaandgithub-actions[bot] 4020426135 feat(metrics): metrics v2 — alerts from charts, compare, forecast, formulas, Used in, builder round-trip, staleness markers and Prometheus 3.x functions (#15150)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-08 04:50:02 +00:00
Ashish Kolheandgithub-actions[bot] 46678ea8da fix: tighten input validation, auth and outbound request checks (#15054)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-08 00:54:05 +00:00
Vamsi Karthik R 92a62c2d6c test(rum): end-to-end coverage for Product Analytics and its schema-state fixes (#15131) 2026-10-07 10:05:59 +00:00
Neha P 3b1c5f4c7e test(logs): fix the false-green paths in the #15086 coverage, and move it onto logsPage (#15138) 2026-10-07 05:10:21 +00:00
Amey PawarandHengfei Yang 4c50b0c9cf feat(stream): refuse non-widening type changes in update_fields (#15047)
Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com>
2026-10-07 03:38:06 +00:00
Hengfei Yang 96b31990c8 fix(metrics): correct OTLP sums that can go down still stored as counters (#15134) 2026-10-06 10:40:31 +00:00
Neha P e6deef9737 test(logs): UI and API coverage for the #15086 logs changes (#15116) 2026-10-06 09:26:24 +00:00
Amey PawarandHengfei Yang 779f09fabc fix(ingest): parse RFC3339 timestamps with a 2- or 5-digit fraction and a zone (#15059)
Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com>
2026-10-06 08:56:02 +00:00
Amey PawarandHengfei Yang 7707ee4de6 fix(metrics): store an OTLP sum that can go down as a gauge (#15113)
Co-authored-by: Hengfei Yang <hengfei.yang@gmail.com>
2026-10-06 08:51:42 +00:00
Amey Pawar 7fcb4ae1fa fix(search): refuse malformed multi-stream requests instead of panicking (#15030) 2026-10-06 07:06:50 +00:00
Amey Pawar 870ba9c56f fix(pipelines): start each scheduled window where the previous one ended (#15042) 2026-10-06 07:04:08 +00:00
c575b3a91a feat(rum): product analytics with named events and saved funnels (#15070)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Prabhat Sharma <prabhat@openobserve.ai>
2026-10-03 21:28:18 +00:00
Prabhat Sharmaandgithub-actions[bot] b75978cd37 feat(alerts): anomaly value band on the Charts tab, with direction, window-share and band-width settings (#15052)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-03 00:13:16 +00:00
Neha P 5cd1d86469 fix(functions): repair an import fix-up that could not write, with E2E + API coverage (#15043) 2026-10-02 07:41:47 +00:00
uddhavdave ff3cc7ab04 fix(prompts): folder-scoped RBAC for prompts (#15008) 2026-09-30 13:39:39 +00:00
Neha P ee32552c6f test(regression): cover 11 closed logs, streams, pipeline and enrichment bugs (#14978) 2026-09-30 09:30:33 +00:00
uddhavdave 301abd269a fix(prompts): enforce per-prompt RBAC and gate protected labels (#14942) 2026-09-29 08:34:48 +00:00
Vamsi Karthik R 1b50f7ca0a test: regression coverage for retested bug fixes (#14376, #14317, #14648, #11283, #14636, #14640, #14917) (#14927) 2026-09-28 19:46:23 +00:00
Neha P db61c88aa6 test(regression): cover 10 closed logs, pipeline and enrichment bugs (#14932) 2026-09-28 13:33:31 +00:00
65e0e7edf6 feat(prompts): add managed prompt registry (#14818)
Co-authored-by: sai nikhil kethe <nikhil@openobserve.ai>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-28 10:18:16 +00:00
Vamsi Karthik R 33c0239410 test: cover the bug fixes confirmed by retest, and drop the #13243 workarounds (#14842) 2026-09-27 19:35:38 +00:00
Neha P 0cbdb03dc2 test: regression coverage for 29 closed Needs-Automation issues (#14883) 2026-09-25 12:42:57 +00:00
Bhargav ad9e9c4b33 fix: Fix/2724 rum oo to o2 (#14853) 2026-09-24 10:54:41 +00:00
Neha P 5e4a992f6a fix(anomaly): reject a detection_function the trainer cannot deserialize (#14761) 2026-09-24 04:55:52 +00:00
Neha P 6f6d53d771 test(anomaly): cover the condition surface at the HTTP boundary (#14798) 2026-09-23 14:22:33 +00:00
0b1e67bc2c test(autoe2e): generated E2E tests for #14601 (dashboard-cell-explorer-log-detail) (#14703)
Co-authored-by: Shrinath-O2 <214651540+Shrinath-O2@users.noreply.github.com>
Co-authored-by: ktx-akshay <akshay.patil@kiara.tech>
Co-authored-by: Neha P <neha@openobserve.ai>
2026-09-22 11:32:05 +00:00
Bhargav c8184b3101 fix(tests): give each realtime pipeline its own source stream (#14731) 2026-09-22 09:08:04 +00:00
Bhargav 7158e9a2bb test: search backend API regression coverage (PromQL + histogram) (#14437) 2026-09-22 08:46:34 +00:00
Shrinath Rao cb083f3826 fix(ingest): count and warn a wholly-discarded batch's window drops (#14706) 2026-09-21 13:48:51 +00:00
Neha P ab5413a475 fix: enforce realtime pipeline exclusivity against the persisted source (#14661) 2026-09-21 13:37:48 +00:00
Shrinath RaoandShrinath-O2 edcb3c835e test(autoe2e): generated E2E tests for #14613 (splunk-hec-ingestion-window) (#14641)
Co-authored-by: Shrinath-O2 <214651540+Shrinath-O2@users.noreply.github.com>
2026-09-21 12:20:32 +00:00
Neha P 80d9d6ff91 test: regression coverage for 4 closed Needs-Automation bugs, and repair the alert wizard's stream select (#14689) 2026-09-21 12:17:22 +00:00
Shrinath Rao b2e058a202 test: regression coverage for 4 Needs-Automation issues (1 API + 3 Logs UI regression) (#14538) 2026-09-21 06:14:44 +00:00
Neha P 8dcaf5e8e8 test: cover report folders (#11219) and the incident status filter (#12611) (#14646) 2026-09-20 08:33:59 +00:00
Neha P b607d0a623 fix(alerts): repair three clone-dialog bugs, and cover the clone surface (#14621) 2026-09-18 14:44:18 +00:00
Neha P 2c341ca4ae test(api): cover 8 closed Needs-Automation issues (#14598) 2026-09-18 08:09:45 +00:00
Shrinath Rao b85030e7d9 test(promql): guard left-open range-selector boundary (#14546) (#14584) 2026-09-17 14:11:04 +00:00
3be8821d93 fix: correctly handle silence for pending period (main) (#14564)
Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com>
Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2026-09-17 14:04:37 +00:00
Neha P f3db1f5477 test(workflows): cover folders and folder-scoped RBAC [merge after o2-enterprise#2653] (#14577) 2026-09-17 12:18:23 +00:00
Neha P 5cecdc0f7f fix(alerts): send a name-resolved expression summary on composite list rows (#14458) 2026-09-16 17:39:49 +00:00
Hengfei Yang 1263f05595 fix(ci): honor fuzz health-check settings under the CI profile (#14527) 2026-09-16 09:12:13 +00:00
Neha P 94a82a2ef8 test(alerts): real E2E coverage for composite alerts (#14456) 2026-09-13 06:05:30 +00:00
Ashish Kolheandgithub-actions[bot] 2a19a61a31 fix(dbm): Metrics tab — database load, themed catalog, health ratios, and the o2_dbm_kind panel-failure fix (#14401)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-11 05:40:02 +00:00
udevandsai nikhil kethe f27440841b fix(ai): improve provider testing, playground feedback, and experiment results (#14174)
Co-authored-by: sai nikhil kethe <nikhil@openobserve.ai>
2026-09-08 09:41:15 +00:00
Neha P 0fb66d4f26 test: fail-loud when WORKFLOWS_REQUIRED=1 instead of silent skip (#14040) 2026-08-31 12:06:53 +00:00
Neha P e74d5ea210 test(workflows): parametrized condition-eval matrix (17 cases) (#13999) 2026-08-27 11:55:36 +00:00
Prabhat Sharma fea71e02d4 feat(alerts): alert library — browse, preview and install curated alerts (#13922)
## Alert Library

A curated catalog at `/alert-library`: browse packs of ready-made
alerts, see
which ones can actually run against the streams this org already
receives,
preview a verdict against real data, and install one or many.

The library is a **peer page** of Alerts / Notification Destinations /
Templates
— flat routing, presented as tabs via a shared `AlertSectionTabs` in
`OPageLayout #header-tabs` (the pattern `PipelineSectionTabs` already
ships).

### What landed, by phase

| Phase | What |
| --- | --- |
| Data layer | S3 manifest fetch, cache, readiness resolution
(`useAlertLibrary`, `constants/alertLibrary`, `types/alertLibrary`) |
| Gallery | Rail (packs / categories, multi-select, segmented switch),
stat-strip availability facets, cards |
| Drawer | Detail view with query preview and customizable tunables |
| Install | Bulk-install wizard — destination selection, per-alert
tunables, stale-session hardening |
| Prefill | Carry a library alert (query, trigger, threshold, severity)
into the alert editor |

### Design decisions worth knowing

- **Rail navigates, strip filters.** Availability is deliberately not in
the rail
  — carrying both overflowed it and pushed a facet group below the fold.
- **Colour marks the exception only.** No "Ready" pill (it would
describe ~75 of
  86 cards and signal nothing); only unusable cards carry a label.
- **A failed `/streams` call leaves readiness unknown**, rather than
claiming
"none of your data matches" — that claim would be about the request, not
the
org, and it is the most alarming thing this page can say. Counts read
`—`
until there is an answer, and a failed *refresh* keeps the verdict it
already had.
- **No "Installed" tile** — installed detection doesn't exist yet, and a
tile
  reading a permanent zero is dishonest UI.
- **`severity: warning` renders as `medium`** — the badge group's scale
is
critical/high/medium/low/info, and medium is the amber it also gives P3,
which
  is exactly the priority a warning alert installs as.
- Pack and category names come from the manifest, so they render as
`raw()` data —
  a pack added upstream needs no frontend release.

### Design-system changes (used by the library, applied app-wide)

- **`warning-quiet` badge tone** — one variant whose values differ by
theme: the
soft amber wash in light, a neutral chip in dark. Neither the filled
amber chip
nor the neutral one was right in both, because the two ramps aren't
symmetric.
- **Border tokens now meet WCAG 2.1 SC 1.4.11.** Every border token
measured
under 3:1 (`border-strong` was 2.52:1). `border-default` firms to
grey-300 and
  controls get a token that clears 3:1.
- Nav: Reliability's flyout groups its four alerting entries under one
**Alerts**
header, declared in the same order as the tab strip those pages carry.
Flyout
  levels are sized by depth.
- `sensors-off` icon added to the `OIcon` registry.

### Fixes that rode along

- **metrics**: a shared URL whose `metrics_data` blob omits panel query
fields no
longer blanks the whole metrics page — blob queries are filled out to
the panel
  schema before being laid over.
- **dashboards**: a PromQL series with no legend template was named
`JSON.stringify(metric)`, so fifty series read identically for the width
of the
chip. Series are now named by the labels that actually differ,
preferring the
ones that say *which workload* it is (namespace / service / pod / host).
Correlation's semantic groups refine that when loaded, but nothing is
fetched
to render a chart — that endpoint is enterprise-only and a chart must
render
  the same on OSS.
- **alerts**: preview evaluates against the alert's real trigger;
deleting a row
no longer reloads the list behind it; peer tabs no longer shift when
switching
  alerting pages.
- **ui**: badge-only select options no longer render bold.

### Tests

- `test(search)`: pins the streaming-aggregate **wire contract** at the
HTTP
boundary. Under streaming aggregates each partition carries the
cumulative
merged state (last frame is the answer) while ordinary partitions are
disjoint
and must be summed. No pytest had ever received `streaming_aggs: true` —
the
emitter could have flipped to per-partition deltas with the whole suite
green
while dashboards, Logs and the alert preview all silently over-counted.
- `test(e2e)`: four helpers that passed only while an org stayed small —
an
assertion reading past a 20-row page, an unfiltered `OSelect` that
virtualises
past 50 entries, a tab click landing on the rename pencil, and two
builder
  tests asserting on whichever metric sorted first.
- New unit specs across the library components, composable, facets,
tunables and
  install path.

### Notes

- **i18n**: en-US only; CI generates the other 14 locales.
- **No backend changes** — this branch is entirely `web/` plus test
helpers.
2026-08-23 20:32:28 +00:00
Vamsi Karthik R 99b1a23773 test(slo): E2E + API suite for SLOs (#13836)
Adds automated test coverage for **SLOs** (#13547, #13577, #13579,
#13704, #13761, #13784), which shipped with none. **149 tests** — 77
Playwright + 72 pytest — all three SLI types, both query languages,
happy / negative / edge paths. Clean branch off `main`.

**UI (Playwright · `tests/ui-testing`)**
- `pages/sloPages/` — 4 page objects (verified `data-test` selectors,
hydration + Monaco-sync waits, OSelect commit-retry, virtualized-list
filtering).
- `playwright-tests/SLO/slo-crud.spec.js` (24) — create
count/time-slice/grouped through the form, detail, edit, SLI-type
change, tags, pause, delete, filters; negative: dismissed delete, empty
search, cancel, unmeasured SLI is absent not zero.
- `playwright-tests/SLO/slo-form-validation.spec.js` (20) — server
errors surfacing in the form, conditional fields per SLI type, count +
time-slice previews, **PromQL count and time-slice created end to end**;
negative: no stream, invalid aggregate, over-long name, target
boundaries.
- `playwright-tests/SLO/slo-alert-sli.spec.js` (8) — **the `alert` SLI
type**: source picker, create, config carries only the alert id, detail
names the source; negative: ineligible source offered-but-disabled,
grouped alert SLI, slice finer than source cadence.
- `playwright-tests/SLO/slo-timeslice.spec.js` (10) — **#13761 P0
regression** (measured SLI, not the preview), PromQL, previews, gaps,
language-flip clearing.
- `playwright-tests/SLO/slo-alerts.spec.js` (15) — burn-rate +
error-budget kinds, presets, edit, freeze door, burndown; negative: no
destination, cancel, blank/invalid name.
- `playwright-tests/utils/slo-seed.js` — backdated seeding, metrics
seeding, eligible-source-alert fixture, ground-truth query, fail-fast
env guard, transient-store retry, full fixture teardown (alerts →
streams → destinations → templates).

**API (pytest · `tests/api-testing`)**
- `tests/slos/test_slo_validation.py` (72) — full REST surface
(create/get/update/enable/delete/groups/slo-eligible), validation on
**both create and update** (name, target, window, slice, config shapes,
comparators, float-threshold round-trip), boundaries (target
0.001/99.999, name 256 vs 257, threshold 0/negative/1e12/NaN, unicode
names), alert-source eligibility (silence-gated, too-infrequent, cron),
PromQL config shapes, auth 401/404.

**CI**
- Two shards: `SLO` (`workers: 3`) and `SLO-Measurement` (`workers: 1`).
Split because the backfill job runs with
`ZO_SCHEDULER_SLO_BACKFILL_CONCURRENCY=1`, so measurement specs sharing
an instance starve each other's waits — `fullyParallel` races spec
*files*, which `mode:'serial'` cannot prevent. The 3-worker pin is
SQLite: at 5, concurrent SLO/alert/destination writes trip `database is
locked` on the single-node meta store.
- New optional per-shard `ingest_allowed_upto` (`240`) alongside the
existing `quick_mode_enabled`: the workflow default of 5 **hours**
silently drops the 8 days of history an SLO window needs, while still
answering `200`. Other shards keep the default. Same precedent as
`api-testing.yml`'s `48`.

**Feature code**: 9 additive `data-test`/`dataTest` attributes in
`SloDetail.vue`, `SloList.vue`, `SloAlertCondition.vue` — no logic
changes, `vue-tsc` clean. The stat tiles, tabs and burn-window inputs
had no stable selectors; `OStatStrip`/`OTab` already forward the
attribute.

**Behaviour**: self-cleaning (`e2e_slo_*`, worker-scoped since
`afterAll` runs per worker).

**Verified in CI** on this branch: `e2e / SLO` **52 passed** (1.8m,
workers pinned to 3), `e2e / SLO-Measurement` **25 passed** (11.3m,
workers pinned to 1) — the measurement shard passing confirms the
per-shard `ingest_allowed_upto` took effect, since those tests are
impossible under the 5-hour default. pytest **72 passed** locally; in
CI's 599-test run one setup delete hit a transient 500 (see findings)
and now retries.

**Findings for the feature owner** (reported, not fixed here):
- A blank "good when" shows `Request failed with status code 422` —
`pruned()` drops the empty key, so the API's real 400 message never
reaches `save()`.
- A rejected alert name shows no banner: `SloAlertForm.submit()` returns
on `nameError` before setting `saveError`.
- `avg(latency_ms); DROP TABLE users--` is accepted at create time
(parsed only at measurement).
- The name-length message says "less than 256 characters" but 256 is
accepted — 257 is the first rejection.
- Duplicate alert names on one SLO are accepted (duplicate SLO names are
a 409), and the panel lists them by name, so they are indistinguishable.
- SLO names accept characters that break the list's own
`slos-slolist-edit-${name}` selectors; alert names correctly reject
them.
- All chart/preview root `data-test` ids are unreachable — a parent's
fallthrough attribute overrides the child root's.
- Both edit forms hydrate asynchronously, so a blank form can flash
before the stored values appear.
- `DELETE /slos/{id}` on a freshly-created SLO returned **500** once
under CI load (not reproducible locally in 12 rapid iterations).
Contention is arguably a retryable 503, and the body carried no
actionable message.
- **A scheduled alert whose source stream is deleted is retried
forever** (`Stream "…" not found in schema`), and the SLO backfill lane
shares the scheduler's worker budget — so accumulated dead alerts
*starve SLO measurement*. Observed: 65 of them held coverage at 1 of 7
chunks indefinitely; deleting them restored 0.143 → 1.0 in 240s.
Harmless in CI (fresh instance per shard) but it degrades any long-lived
environment. The suite now cleans up after itself; the retry-forever
behaviour itself may deserve a look.

**Paired ENT PR: openobserve/o2-enterprise#2434.** ENT's matrix is this
repo's manifest plus an overlay, merged by this repo's
`build-ci-matrix.js`, so both SLO shards reach ENT automatically —
verified: 31 merged shards, both SLO entries carrying
`ingest_allowed_upto=240` and their worker pins, no other shard
affected. What ENT was missing is *consuming* those two fields, which
#2434 adds. Merge the two together: this one alone leaves ENT booting
the SLO shards on the 5-hour ingest window, and #2434 alone is inert.

*(An earlier review reported ENT as using an inline matrix with no SLO
shard — that turned out not to be the case.)*
2026-08-17 18:50:29 +00: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