openobserve/web
Omkar Kesarkhane bbed40d8f4
feat(synthetics): author-owned locators, and step-scoped run evidence (#13563)
## Summary

Three synthetics workstreams on one branch: author-owned locators (Phase
2b), retirement of version-1 monitors (Phase 2c), and making a failed
browser step diagnosable without leaving the Steps tab.

Everything else in the synthetics suite passes (422 tests across the 21
suites the evidence work touches).

## Author-owned locators (Phase 2b)

The recorder proposes a locator bundle; the author owns its order.
Schema, combined-locator build/read, provenance pinned across the
recorder bridge, and the payload contract tested from both sides.

`337911158d` `e63f8f429f` `50b811a865` `2a978b9408` `c8c081c3c5`
`35ef1c36cb`

## Version-1 retirement (Phase 2c)

Stop creating v1 monitors, delete the v1 migration path and its step
fields, drop `steps_version` from the schema.

`b58b03077d` `75984ad222` `68a33e885d` `a2bffae7b7`

## Run detail — evidence, scoped to the step

Implements §5.3 of `docs/synthetics/step-failure-evidence-design.md`
("render the bundle, scoped to the step"), which was specified and never
built: only the kind-grouped run-level Evidence tab shipped.

**Per-step page activity.** The expanded step now shows the
`evidence.ndjson` events attributed to it — severity-ranked, capped at
5, with "View all N →" deep-linking into the Evidence tab pre-filtered
to that step. One shared `OTable` wrapper renders rows for both surfaces
so they cannot drift, and one composable fetches the bundle once for
both.

`a483796d57` `a7cbe0a3e0` `f63973285e` `eb7ec4f3e6` `1ed226febe`
`e3d969bcb2`

**Settle signals were attributed to the wrong step.**
`failure_detail.settle_signals` accumulates across the whole journey. On
live run `3HFCZ3fm` it held 13 signals — one from step 2, six from step
8, two from step 14 — while the failed step 15 owned none of them, and
the panel rendered all 13 under step 15. The signal that mattered
(`stale POST **/_search_stream, 30274ms`) belongs to step 14, which the
run's own error string says, and step 14 displayed nothing.
`last_attempt_steps[i].settle_signals` had carried correct per-step
attribution all along and was read by nothing.

`6ba6f8d633`

**Artifact URLs carried no origin.** `artifactUrl()` returned a bare
path while every other call in that service goes through `http()` with
`baseURL: store.state.API_ENDPOINT`. Artifact URLs go to `<img src>` and
`fetch()` directly, so in dev they resolved against Vite on `:8081`,
which has no `/api` route and no proxy — every screenshot and evidence
bundle 404'd. Verified against a running backend with a real key:
`:8081` → 404, `:5080` → 200. Production, served from the API's own
origin, is unchanged.

`baa7407cb5`

**The locator ladder was invisible.** `candidates_tried` lists only the
rungs the probe stood on, so a step that matched on its primary looked
identical to a step that had no second candidate — both one row, both a
grey `used_as_primary` badge. On live run `3HGDMrlU` the failing assert
had one authored locator and every `assert`/`fill` step in that journey
is built the same way, while `click` steps average 2.4 candidates. The
section now leads with "N of M tried", names a one-rung ladder as having
no fallback, labels outcomes in words instead of enum values, and dims
unreached rungs the way the timeline dims a skipped step.

`c05e1ce133`

## Test plan

- `npx vitest run src/views/synthetics src/components/synthetics/results
src/components/synthetics/StepEvidence.spec.ts
src/composables/synthetics src/composables/useSyntheticEvidence.spec.ts
src/services/synthetics.spec.ts` → 422 passing
- `npm run type-check` → clean
- `npm run lint:design:strict` → 2 pre-existing regressions above (see
Known failing)
- Behaviour on the run-detail changes was verified against live records
from `OpenObserve Sys Query` and `OpenObserve Cloud Happy Path` rather
than fixtures alone

## Not covered

- The "Add a fallback locator" action from the locator-ladder work needs
a step-level deep link; `synthetics/edit/:id` has no step anchor, so the
warning states the finding without an action.
- Browser-level confirmation of the artifact-URL and locator-ladder
changes is outstanding — the local backend's search service was
returning `tcp connect error` during verification, so those two were
confirmed against records and by unit test rather than in a running
page.
2026-07-31 11:19:46 +00:00
..
cypress/e2e
public feat: service discovery (#9469) 2025-12-04 13:58:09 +05:30
scripts fix: table migration to same components (#13451) 2026-07-30 12:18:23 +00:00
src feat(synthetics): author-owned locators, and step-scoped run evidence (#13563) 2026-07-31 11:19:46 +00:00
test-results fix: logs correlation UI fixes (#9703) 2025-12-23 17:21:16 +05:30
tests/unit fix: remove quasar leftovers (#13180) 2026-07-14 11:35:46 +00:00
.gitignore fix: Data sources tab for AI integration (#12478) 2026-06-16 10:06:46 +00:00
.nvmrc build(web): add CI-parity verify script and pin Node version (#13393) 2026-07-23 06:21:39 +00:00
.prettierignore build: FE code format check for improved maintainability (#13351) 2026-07-24 07:11:39 +00:00
.prettierrc.json build: FE code format check for improved maintainability (#13351) 2026-07-24 07:11:39 +00:00
.stylelintrc.json refactor: design token migration + CI guards (#13173) 2026-07-20 18:06:21 +00:00
AGENTS.md feat: per-group and per-series alerting, and SLO measurement (#13547) 2026-07-31 07:23:22 +00:00
README.md
coverage.sh fix: Trace Details UI improvements (#10550) 2026-02-18 20:25:32 +05:30
cypress.config.ts chore: update copyright year to 2026 (#11166) 2026-04-07 09:57:53 +08:00
env.d.ts feat: ux improvement main (#11838) 2026-05-28 11:00:49 +00:00
eslint.config.js build: FE code format check for improved maintainability (#13351) 2026-07-24 07:11:39 +00:00
eslint.sh
index.html fix: change primary buttons text (#9189) 2025-11-21 11:02:46 +05:30
package-lock.json feat: per-group and per-series alerting, and SLO measurement (#13547) 2026-07-31 07:23:22 +00:00
package.json fix: dashboard builder redesign (#13419) 2026-07-28 10:59:27 +00:00
postcss.config.js fix: Patterns UI change (#11711) 2026-05-11 07:09:10 +00:00
run_all.sh feat: simplify service discovery feature (#10946) 2026-03-30 13:47:40 +05:30
sbom.json chore: regenerate SBOMs (2026-07-20) (#13280) 2026-07-21 09:57:26 +08:00
serve.json
tsconfig.app.json build: add UI code quality checks and enhance linting processe (#13174) 2026-07-21 12:47:06 +00:00
tsconfig.config.json feat: Revamp metrics explorer (#13144) 2026-07-14 07:50:56 +00:00
tsconfig.json fix: automate update process of feature master list on about us page (#10010) 2026-01-17 18:06:23 +05:30
tsconfig.node.json fix: minor and patch version upgrade (#9741) 2025-12-25 15:51:10 +05:30
tsconfig.vitest.json feat: Revamp metrics explorer (#13144) 2026-07-14 07:50:56 +00:00
tsconfig.vitest.tsbuildinfo feat: Revamp metrics explorer (#13144) 2026-07-14 07:50:56 +00:00
vite.config.ts feat(synthetics): pick net or browser agent in the private-agent setup drawer (#13496) 2026-07-28 01:19:05 +00:00
vitest.chat-history.config.ts feat: Ai metering for cloud (#10824) 2026-03-13 00:57:31 +05:30
vitest.config.ts fix: remove quasar leftovers (#13180) 2026-07-14 11:35:46 +00:00

README.md

web

This template should help get you started developing with Vue 3 in Vite.

VSCode + Volar (and disable Vetur) + TypeScript Vue Plugin (Volar).

Type Support for .vue Imports in TS

TypeScript cannot handle type information for .vue imports by default, so we replace the tsc CLI with vue-tsc for type checking. In editors, we need TypeScript Vue Plugin (Volar) to make the TypeScript language service aware of .vue types.

If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a Take Over Mode that is more performant. You can enable it by the following steps:

  1. Disable the built-in TypeScript Extension
    1. Run Extensions: Show Built-in Extensions from VSCode's command palette
    2. Find TypeScript and JavaScript Language Features, right click and select Disable (Workspace)
  2. Reload the VSCode window by running Developer: Reload Window from the command palette.

Customize configuration

See Vite Configuration Reference.

Project Setup

npm install

Compile and Hot-Reload for Development

For stand-alone UI development environment, create .env file and which contains below environment variable

VITE_OPENOBSERVE_ENDPOINT=http://localhost:5080/
npm run dev

Type-Check, Compile and Minify for Production

npm run build

Run Unit Tests with Vitest

npm run test:unit

Run End-to-End Tests with Cypress

npm run test:e2e:dev

This runs the end-to-end tests against the Vite development server. It is much faster than the production build.

But it's still recommended to test the production build with test:e2e before deploying (e.g. in CI environments):

npm run build
npm run test:e2e

Lint with ESLint

npm run lint