Commit Graph
870 Commits
Author SHA1 Message Date
416a6cce32 feat: work group v2 — slot-based admission (#10990)
## Summary

Design at:
https://github.com/openobserve/designs/blob/main/infrastructure/work-group/work_group_v2_impl.md

This PR adds slot-based distributed admission control for search queries
and fixes file dispatch consistency when a subset of querier nodes is
selected per query.

To enable this feature we need to set:

```
O2_WORK_GROUP_MAX_NODES_PER_QUERY > 0
O2_WORK_GROUP_NODE_SELECTION_STRATEGY = org | stream
```

### Slot-based admission

- Add `TryAcquire / StartQuery / ReleaseQuery` gRPC RPCs — Follow nodes
reserve slots before execution starts and self-release via
`FlightEncoderStream::drop`
- Wire slot admission in both Arrow Flight search and PromQL paths,
co-located with the existing org/user concurrency queue check
- Delegate DataFusion `target_partitions` / `memory_size` to enterprise
`get_resource_limit()`, which applies per-query slot fraction with
optional dynamic expansion
- TTL sweep interval derived from `slot_reserved_ttl_ms / 4` (min 100
ms) instead of a hardcoded 500 ms
- Move `QUERY_PENDING_NUMS` / `QUERY_RUNNING_NUMS` metric updates to
after slot admission completes (a blocked request is no longer counted
as "running")

### Consistent-hash file dispatch fix (`max_nodes_per_query > 0`)

- Add `get_node_from_consistent_hash_within(key, role, group, allowed)`
to `infra::cluster`: walks the global ring clockwise from `hash(key)`
but skips nodes outside `allowed`. Preserves all consistent-hash
properties (even distribution via vnodes, minimal remapping on
membership change) while confining dispatch to the selected subset
- `partition_file_by_hash` now passes only the selected querier nodes as
the `allowed` set, so every file maps to one of the N selected nodes —
no more fallback-to-index-0 imbalance when `strategy=org/stream`
- File-list broadcast (enterprise) pre-computes per-item target nodes
using the same filtered ring walk via `broadcast_item_targets()` in
`o2-enterprise`, so broadcast and dispatch always agree on which node
owns each file

### Proto fix

- Reserve field 10 in `QueryStatus` (was `WorkGroup` enum / varint wire
type) and move `work_group` string to field 13 — prevents wire-type
mismatch during rolling upgrades

### Other fixes from code review

- `get_first_stream_key()` now returns `"{stream_type}/"` sentinel
instead of `""` for multi-stream / cross-index queries, so
`select_nodes` always receives a non-empty deterministic key
- PromQL node selection uses `"metrics/"` stream key (consistent with
the sentinel format) instead of bare `"metrics"`
- Move `_orig_trace_id` binding inside `#[cfg(feature = "enterprise")]`
block in `FlightEncoderStream::drop`

## Key config (all default to safe/off values)

| Env var | Default | Description |
|---|---|---|
| `O2_WORK_GROUP_MAX_NODES_PER_QUERY` | `0` | Nodes per query; 0 = all
nodes (disables slot admission) |
| `O2_WORK_GROUP_NODE_SELECTION_STRATEGY` | `all` | `all` / `org` /
`stream` |
| `O2_WORK_GROUP_SHORT_SLOT_RATIO` | `0.8` | Max fraction of node slots
for short queries |
| `O2_WORK_GROUP_DYNAMIC_RESOURCE` | `true` | Expand DataFusion
allocation on idle nodes |

## Test plan

- [x] Default (`max_nodes_per_query=0`): behavior identical to before,
zero overhead
- [x] `strategy=org`, `max_nodes_per_query=3`, 10-node cluster: each org
consistently uses the same 3 nodes; files distributed evenly across
those 3 nodes (no node-0 pile-up)
- [x] Broadcast routes each file to the same node that
`partition_file_by_hash` selects at query time → cache hits on
re-queries
- [x] Slot admission: 3rd request waits when budget=2 and 2 queries
running; slots released on completion
- [x] PromQL queries respect slot budget
- [x] Rolling upgrade: old node sends `QueryStatus` without field 10
conflict

## Related

Requires companion PR in `o2-enterprise`:
https://github.com/openobserve/o2-enterprise/pull/1378

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

---------

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-05 05:31:37 +00:00
773c87018b feat: add configuration option to show field as JSON in dashboard (#11091) (#11104)
Design at:

https://github.com/openobserve/designs/tree/main/dashboards/show-field-as-json-default-value-env

---------

Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech>
Co-authored-by: Abhay Padamani
<141122205+ktx-abhay@users.noreply.github.com>

---------

Co-authored-by: ktx-vaidehi <134508096+ktx-vaidehi@users.noreply.github.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Abhay Padamani <undefined@users.noreply.github.com>
2026-04-03 07:34:12 +00:00
ByteBaker d25fbf97c1 fix: do not show service account token post creation (#11110)
So far, service account token could be viewed and copied even after an
SA was created. This was bad design and posed risk of impersonation.

The changes prevent this from happening by returning only the redacted
token in the API response. Full token with create API itself, and
removing GET API to get the service account details (which returned raw
token).

The same affects token rotation as well.
2026-04-01 19:29:42 +00:00
ByteBaker 881a6611c0 feat: simplify service discovery feature (#10946)
## Core changes

- **Schema**: `service_streams_dimensions` table dropped entirely.
Service rows gain `disambiguation JSONB`, `set_id`, and
`field_name_mapping JSONB`. Incidents: `correlation_key VARCHAR`
replaced with `group_values JSONB`.
- **Migrations**: 6 new sea-orm DSL migrations (raw SQL strings removed
for cross-backend consistency; GIN index creation remains raw SQL — no
native sea-orm support).
- **`ServiceIdentityConfig`**: `fqn_priority_dimensions` replaced with
`distinguish_by` list. `max_total_service_rows` renamed from
`max_total_services` (unit = rows, not logical services).
- **Meta types**: `CorrelationConfidence`, `ConfidenceLevel`,
`DimensionMatchDetail` removed from `correlation.rs`.
`SemanticFieldGroup` → `FieldAlias` (fields are aliases to group IDs,
not full group descriptors).
- **Handlers**: Authorization checks added to list, correlate, and
get-config endpoints. `_grouped` endpoint removed; `_recommendations`
endpoint added.
- **Cleanup job**: Leader election added (smallest UUID ingester wins);
hardcoded 1h interval + 30-day stale threshold replace the removed
configurable env vars.
- **Processing mode removed**: Compactor-mode path removed; single
ingester-only path remains.
- **UI**: FQN priority config replaced with `distinguish_by` field
selector. New `ServiceIdentitySetup.vue` guided setup flow.
`is_scope`/`is_stable`/`normalize` toggles removed from semantic group
editor. ~13-14 FQN-related i18n keys removed from each of 12 locale
files.

## Env var changes

Removed (15):
- `O2_SERVICE_STREAMS_SAMPLE_EVERY_NTH_STREAM` → renamed (see below)
- `O2_SERVICE_STREAMS_SAMPLE_EVERY_NTH_FILE`
- `O2_SERVICE_STREAMS_RECORD_SAMPLE_PERCENT`
- `O2_SERVICE_STREAMS_STABLE_DIMENSION_THRESHOLD`
- `O2_SERVICE_STREAMS_TRANSIENT_DIMENSION_THRESHOLD`
- `O2_SERVICE_STREAMS_MAX_STREAMS_PER_SERVICE`
- `O2_SERVICE_STREAMS_MIN_CORRELATION_CONFIDENCE`
- `O2_SERVICE_STREAMS_PROCESSING_MODE`
- `O2_SERVICE_STREAMS_BATCH_MAX_SERVICES`
- `O2_SERVICE_STREAMS_CLEANUP_INTERVAL_MINS`
- `O2_SERVICE_STREAMS_STALE_THRESHOLD_HOURS`
- `O2_SERVICE_STREAMS_MAX_TOTAL_DIMENSIONS`
- `O2_SERVICE_STREAMS_MAX_TOTAL_VALUES`
- `O2_SERVICE_STREAMS_CHANNEL_CAPACITY`
- `O2_SERVICE_STREAMS_MAX_FLUSH_RETRIES`

Renamed:
- `O2_SERVICE_STREAMS_SAMPLE_EVERY_NTH_STREAM` →
`O2_SERVICE_STREAMS_SAMPLE_RATE` (default: 10)

Kept:
- `O2_SERVICE_STREAMS_ENABLED` (default: false)
- `O2_SERVICE_STREAMS_SAMPLE_WINDOW_SECS` (default: 300)
- `O2_SERVICE_STREAMS_BATCH_FLUSH_INTERVAL_SECS` (default: 600)
- `O2_SERVICE_STREAMS_MAX_TOTAL_SERVICES` (default: 500,000)

Added:
- `O2_SERVICE_STREAMS_TRACKED_ALIAS_IDS` — comma-separated alias group
IDs tracked system-wide by default; "service" always implicit

Design at: designs/correlation/proposal-v2
2026-03-30 13:47:40 +05:30
Sai Nikhil 1a9837bd12 fix: pass search inspect env via config (#11051) 2026-03-30 10:25:31 +05:30
udev 1c7a3135de feat: add patch panel apis (#11025) 2026-03-28 03:15:34 +05:30
Subhra264 6a6914213d fix: Include the error field in alert/pipeline history query (#11050)
Currently the alert/pipeline history api does not include the error
field in the history query from the triggers stream. This pr fixes this.
2026-03-27 18:40:36 +05:30
ByteBaker 9c245882d2 fix: anomaly status verbiage + owner issue 2026-03-25 14:15:38 +05:30
477ec39db2 feat: add support for sourcemaps for RUM (#10259)
This ads support for sourcemaps in RUM

Design at :
https://github.com/openobserve/designs/blob/main/application-monitoring/rum/sourcemap-be.md

---------

Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com>
Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com>
Co-authored-by: sai nikhil kethe <nikhil@openobserve.ai>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-24 21:18:06 +05:30
Subhra264 11e16f47eb fix: don't do unnecessary lowercasing of user emails (#10938) (#10985) 2026-03-23 10:04:53 +01:00
ByteBaker f7b5bcdc91 chore: enable service graph by default, drop runtime config knobs
Remove O2_SERVICE_GRAPH_ENABLED and O2_SERVICE_GRAPH_QUERY_TIME_RANGE_MINUTES.
Service graph now runs unconditionally on enterprise ingester nodes.
Query window defaults to 60m constant; UI time range picker controls actual queries.

Also remove checks for this on the UI. Keep only enterprise level checks.
2026-03-23 12:17:53 +05:30
Huaijin 825a57eea8 fix: traces latest stream api (#10993)
- close #10986
2026-03-23 13:19:53 +08:00
udev d3f6a333f9 feat: summary for tool responses (#10955) 2026-03-20 18:22:22 +05:30
Hengfei Yang b6e8ce9400 fix: show fts field values (#10975) 2026-03-20 14:57:30 +08:00
36c2ef4418 feat: anamoly detection p2 (#10940)
Design at: anomaly-detection

---------

Signed-off-by: loaki07 <rustyloaki@gmail.com>
Co-authored-by: Bhargav <BJP232004@GMAIL.COM>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Loakesh Indiran <undefined@users.noreply.github.com>
Co-authored-by: ByteBaker <42913098+ByteBaker@users.noreply.github.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
2026-03-19 21:36:06 +05:30
Hengfei Yang f53c858035 feat: add configuration option for field values in FST logs page (#10951) 2026-03-18 17:28:19 +08:00
Hengfei Yang fcb04b9a76 fix: node list api should working on querier (#10937) 2026-03-17 20:04:26 +08:00
Ashish Kolhe ec0dc67d5a fix: for prometheus metadata api (#10934) 2026-03-17 15:25:35 +05:30
Subhra264 3760b55cf9 fix: multi-window dashboard should support vrl functions (#10860)
Currently dashboard with Multi-window set up does not really run the
result array vrl functions. This pr adds support for vrl function when
`/_search_multi_stream` is used. When `per_query_response` is true, and
the vrl function is result array vrl function, the function is applied
on the whole combined response (including both the time windows). The
input of the result array vrl function becomes a 2d array where each
child array represent a time window.

Otherwise, if `per_query_response` is false, or the vrl function is not
result array vrl function, then the function is applied individually on
every result of every time-window queries.
2026-03-16 13:04:28 +05:30
udevandHarsh Mahajan 32fdd60b2d fix: assistant issues (#10893)
- **require confirmation to update_stream_settings**
- **fix: adding query param into doc**
- ** fix: partial text rendering and traces search**

---------

Co-authored-by: Harsh Mahajan <007harshmahajan@gmail.com>
2026-03-13 17:25:50 +05:30
Hengfei Yang 9e7336897e fix: extract auth for ratelimit (#10887) 2026-03-13 15:21:31 +08:00
Sai Nikhil d2861433fa fix: search inspector UI (#10749) 2026-03-13 09:57:29 +08:00
udev a1ba8b1b71 feat: Ai metering for cloud (#10824) 2026-03-13 00:57:31 +05:30
Hengfei Yang 76c4f5c423 fix: trace stream api (#10880) 2026-03-12 22:38:43 +08:00
Subhra264 31d1ad6a23 fix: Add Alert history datepicker and consider max query range set for triggers stream in the organizations (#10796) 2026-03-12 10:28:16 +08:00
Loakesh Indiran b82271f70b feat: add anomaly detection (#10538) 2026-03-11 10:25:46 +08:00
udev 876c6b2686 fix: tool calls for get schema and navigation button (#10801) 2026-03-10 13:23:43 +08:00
ByteBaker 5274c7368b feat(incidents): RCA reanalysis — delta analysis, in-flight tracking, usage tracking (#10788) 2026-03-09 18:40:46 +08:00
e9c39a4295 feat: cross linking support for dashboards and logs page (#10652)
Design at:
https://github.com/openobserve/designs/tree/main/cross-linking

---------

Co-authored-by: loaki07 <rustyloaki@gmail.com>
Co-authored-by: Loakesh Indiran <66478092+Loaki07@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-05 16:17:31 +05:30
Sai NikhilandYashodhan Joshi a8b22a2da2 fix: show usage chart on license page (#10692)
Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com>
Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com>
2026-03-05 08:05:26 +05:30
418ccaa01e fix: llm evaluations (#10612)
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-04 17:55:01 +05:30
Hengfei Yang d961b34f00 refactor: standardize sort order handling in trace queries (#10725) 2026-03-03 12:11:50 +08:00
Hengfei Yang de338650bb chore: enhance search inspector API (#10720) 2026-03-03 09:35:38 +08:00
Subhra264 90a279134b feat: introduce rbac for logs patterns, logs insights and cache refresh (#10662) 2026-03-01 16:20:10 +08:00
Hengfei Yang d8f219d85e feat: add keyword field to values_stream API (#10690) 2026-02-27 20:57:48 +08:00
Omkar Kesarkhane fe7d9f12a9 fix: Traces list UI improvements (#10670) 2026-02-27 19:32:34 +08:00
Huaijin b170136e4b fix: profiling file path (#10681) 2026-02-27 15:02:35 +08:00
Hengfei Yang a513d51eb4 feat: support order by duration for traces (#10676) 2026-02-27 15:02:00 +08:00
ByteBaker 75a56bf496 feat: service graph edge latency trend & interaction overhaul
Backend:
- New enterprise-only endpoint: GET /{org_id}/traces/service_graph/edge/history
- Returns time-series P50/P95/P99 latency with request-count-weighted baselines
- OSS returns 403; empty result returned gracefully if stream doesn't exist

Frontend — Interaction Model:
- Click-to-panel replaced with hover tooltip for edge interactions
- Tooltip shows compact stats (request count, error rate, latencies) on hover
- "Show trend" button fetches and renders a live P50/P95/P99 sparkline inline
- Tooltip stays open when moused-over; results cached per edge key
- Edge panel component retained, now includes its own latency trend chart section

Frontend — Edge Coloring:
- Edges now colored relative to 24h weighted-average P95 baseline when available
- Falls back to absolute threshold coloring when no baseline data exists

Frontend — Chart Rendering:
- Switched to SVG render mode for sharper output
- devicePixelRatio passed to chart init to fix blurry Retina display rendering
- View type switch no longer recreates chart (no chartKey increment); prevents replay of expand animation
- Tooltip handlers re-registered after every view switch for both tree and graph modes

Tests:
- Updated to reflect removed edge panel flow
- chartKey stability on view switch now asserted (was: increment expected)
2026-02-26 17:07:34 +05:30
Huaijin fd347c8e63 fix: export tracing to _meta org when ZO_SEARCH_INSPECTOR_ENABLED enable (#10650) 2026-02-25 16:06:01 +08:00
ByteBaker f196ac62e9 fix: clippy & fmt 2026-02-25 13:34:08 +05:30
ByteBaker 50117dc279 fix(incidents): race conditions, input validation, and TitleChanged event
- Wrap append() and record_alert() in DB transactions to fix
  read-modify-write race conditions on concurrent alert correlation
- Add length/blank validation on comment endpoint (max 10,000 chars)
- Guard update_severity from emitting SeverityOverride on no-op changes
- Add TitleChanged event type with from/to/user_id fields, wire into
  update_title, render in activity timeline
2026-02-25 13:34:08 +05:30
ByteBaker fa402819a9 feat(incidents): add event timeline system with Activity tab
Incident Events:
- New `incident_events` table (JSONB array per incident, PK on `(org_id, incident_id)`)
- `IncidentEvent` struct with 12 typed variants: `Created`, `Alert`, `SeverityUpgrade`,
  `SeverityOverride`, `Acknowledged`, `Resolved`, `Reopened`, `DimensionsUpgraded`,
  `AssignmentChanged`, `Comment`, `AIAnalysisBegin`, `AIAnalysisComplete`
- Constructors on `IncidentEvent` (e.g. `::alert()`, `::resolved()`, `::comment()`)
- `increment_alert(&mut self)` for compaction: same alert only compacts if it's the
  last event in the array, preserving interleaving (A x5, B x3, A x2)
- Severity fields use `IncidentSeverity` enum, not strings

Backend:
- Migration: `m20260214_000001_create_incident_events_table`
- DB ops: `init`, `get`, `append`, `record_alert` (with compaction), `delete`
- Emit events at all mutation points: incident creation, alert correlation,
  dimensions upgrade, status change, severity change, auto-resolve
- `user_id` passed from HTTP auth headers through to all events
- `auto_resolve_stale()` now returns resolved IDs for event emission
- API: `GET /v2/{org_id}/alerts/incidents/{id}/events`
- API: `POST /v2/{org_id}/alerts/incidents/{id}/events/comment`

Frontend:
- `IncidentTimeline.vue`: vertical timeline with icon/color per event type,
  alert compaction display, comment input, refresh button
- Activity tab added to `IncidentDetailDrawer.vue`
- `incidents.ts`: `getEvents()` and `postComment()` API methods
2026-02-25 13:34:08 +05:30
Maxime Grenu 5503c0171d fix(search): replace unwrap() panics with safe error handling in VRL apply-over-hits path (#10573) 2026-02-25 09:02:23 +08:00
udev dff6494b47 fix: ai config (#10589) 2026-02-23 11:36:10 +08:00
Ashish Kolhe 7647247399 fix: traces api to use streaming (#10593) 2026-02-21 09:18:22 +05:30
udev f59382dea1 feat: navigation for o2 assistant (#10564)
- **improve dashbaord tool prompt**
- **fix: pipeline create handler to return a pipeline ID and name**
- **feat: navigation event handler, button rendering**
2026-02-18 21:46:21 +05:30
Subhra264 13d193b4aa fix: alert destination test button should call destination test api (#10529)
Currently, on the UI when the test destination button is clicked for a
prebuilt email destination, it does not do anything at all. Instead, it
should call the test destination api. Also, this destination api does
not handle email destination testing, this pr fixes this as well.
2026-02-17 18:33:38 +05:30
Ashish Kolhe e9785af1f0 fix: ai chat telemetry (#10546) 2026-02-17 17:37:59 +05:30
dd8d3ffa14 fix: add alert revamp (#10470)
### **PR Type**
Enhancement, Bug fix, Tests


___

### **Description**
- Add HAVING tree to `result_schema` responses
  - Add extractor logic and extensive tests

- Revamp alert preview charts for SQL/PromQL

- Show schema-driven threshold labels and context

- Allow env override for preview time range


___

### Diagram Walkthrough


```mermaid
flowchart LR
  uiSettings["AlertSettings.vue threshold UI"] -->|"calls"| apiSchema["/result_schema API"]
  apiSchema -->|"returns group_by + having"| dfExtractor["DataFusion plan visitor"]
  dfExtractor -->|"builds"| havingTree["HavingNode logical tree"]
  uiPreview["PreviewAlert.vue chart + evaluation"] -->|"uses"| apiSchema
  uiPreview -->|"renders via"| panelRenderer["PanelSchemaRenderer"]
  panelRenderer -->|"options merged"| chartOptions["convertSQLData custom_chart_options"]
  envCfg["ZO_ALERT_PREVIEW_TIMERANGE_MINUTES"] -->|"drives"| uiPreview
```



<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>13
files</summary><table>
<tr>
<td><strong>alertSummaryGenerator.ts</strong><dd><code>Reorder summary,
improve realtime wording</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/10470/files#diff-a4464ad7df3ac3afdca4e6fc583122d701bace10e3a2daf083cb6c902565b20f">+28/-12</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>convertSQLData.ts</strong><dd><code>Merge per-panel custom
chart options</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/10470/files#diff-88c0e865040a20b2c8bb7d77e7f6bd187a5b07c1645c120223bc9d59603752c3">+23/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>projections.rs</strong><dd><code>Extract top-level HAVING as
structured tree</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/10470/files#diff-7a0420d3649da44b80be36d7f1043d6ff81d88395c961266882c3c700f7edff7">+570/-3</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>search.rs</strong><dd><code>Add `HavingNode` and
`LogicalOperator` schema</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-373e83a31e5bbc82fba05d7ae274b0dbd624ed748272232cf7eb8b8c3b2f3afc">+26/-0</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
<td><strong>mod.rs</strong><dd><code>Expose HAVING schema and preview
config</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
  <td><a href=""></a></td>

</tr>

<tr>
<td><strong>AlertSettings.vue</strong><dd><code>Schema-aware threshold
UI and i18n tooltips</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/10470/files#diff-1d5bfd6a1ea672884193649b1271d751d6f3b8ec84af759071c9bfd169a8ab28">+357/-405</a></td>

</tr>

<tr>
<td><strong>PreviewAlert.vue</strong><dd><code>SQL/PromQL preview
rendering and robust evaluation</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-760f5f0a261910f17eb167f81802e8a52477b99a83d2d7fc1aeefc7185801795">+684/-53</a></td>

</tr>

<tr>
<td><strong>AlertList.vue</strong><dd><code>Replace details drawer with
history dialog</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/10470/files#diff-be3e41b823e163b226ffc270d95cc4981e59c600851e4e0d10ee5e4ee994ac8e">+39/-176</a></td>

</tr>

<tr>
<td><strong>AddAlert.vue</strong><dd><code>Alert wizard integration
updates for preview</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/10470/files#diff-7b426bb23e9ed0250c3877d6d97b099c42b2d20e22ddf4459915381b2233a0a8">+148/-144</a></td>

</tr>

<tr>
<td><strong>AlertHistoryDrawer.vue</strong><dd><code>New reusable alert
details/history drawer logic</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-895e1bf3f8edac33d414f99c6c88bbae1098edbadf6d28e6f82a29033ed17ac0">+384/-298</a></td>

</tr>

<tr>
<td><strong>AlertSummary.vue</strong><dd><code>Align UI summary
rendering with generator output</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-c22aa1c5934b763f1d4a5a61a7e810b6bcb1d60b76b64c61cb3ce89dc0a04499">+5/-5</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>AlertHistory.vue</strong><dd><code>Alert history view
updates to new drawer flow</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-1efacbab3b15dacfc79063c799c30b04bf3b75415055f892203e8cf1cb414450">+1/-1</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>FilterGroup.vue</strong><dd><code>Filter builder tweaks
supporting alert wizard changes</code>&nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-8d5a73bea3aa0b5c86d48cda4a61ee3e30f27797ac2a5add1ee8bd66c75bef23">+7/-5</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>config.rs</strong><dd><code>Add env override for preview
time range</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/10470/files#diff-9aeee4a74c0520daa40f9b81c7016f5b6b3254375b968dd7598e745630980d62">+6/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>
</table></details></td></tr><tr><td><strong>Bug
fix</strong></td><td><details><summary>4 files</summary><table>
<tr>
<td><strong>mod.rs</strong><dd><code>Fix PromQL evaluation using
operator semantics</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-ba9b65130898444f7815fd6068bdb0dc590612f74cc893f79d91b0afc44cc851">+29/-23</a>&nbsp;
</td>

</tr>

<tr>
<td><strong>alert.rs</strong><dd><code>Remove custom aggregation
auto-threshold override</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-574be3504bf4d855c65fd3d7a10797a970237ff552edac4962b474b3983e094e">+1/-7</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
<td><strong>AlertWizardRightColumn.vue</strong><dd><code>Wizard right
column rerender/placement adjustments</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; </dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-f599a1960d1ac37e352854ad368d23e080b3cec2b217df22f40d0e15a4db6986">+158/-19</a></td>

</tr>

<tr>

<td><strong>{QueryConfig.vue,CompareWithPast.vue,Advanced.vue}</strong><dd><code>Wizard
step wiring and preview refresh fixes</code>&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</dd></td>
  <td><a href=""></a></td>

</tr>

</table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>1
files</summary><table>
<tr>
<td><strong>*.json</strong><dd><code>Add/update alert revamp translation
strings</code>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </dd></td>
  <td><a href=""></a></td>

</tr>
</table></details></td></tr><tr><td><strong>Additional
files</strong></td><td><details><summary>16 files</summary><table>
<tr>
  <td><strong>mod.rs</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-96630a0dbb6dd7b2b0248fa325c7c7041ce31340c32826675a4a70772e9d29f6">+1/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>mod.rs</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-ca09c9c9b020049bdbc3382c466bfcca80daac92e98760d9a9a76172abf34049">+2/-0</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>Advanced.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-eae849f0bf6c8868f5640ce1d74862284d8e8a5330e5046c0c437e6672f4f676">+4/-5</a>&nbsp;
&nbsp; &nbsp; </td>

</tr>

<tr>
  <td><strong>CompareWithPast.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-6606848e30caef2cda13d65cb30d6590205556259e7e6daf39cada825502d55b">+27/-27</a>&nbsp;
</td>

</tr>

<tr>
  <td><strong>QueryConfig.vue</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-7273c8de49b8ebf706d7bee5b275c75818c0493f41c73f00c55efe667cbd00d9">+432/-10</a></td>

</tr>

<tr>
  <td><strong>de.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-78f24ecb2dbcfc38fdf3ec22b2559a5b40d236ea689d1c55f5d3e87168310264">+97/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>en.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-892aa3d75ab6e129ef9116aa21bec1b9a15ba69ce5366d2a19128078c690d824">+99/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>es.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-ac2a2167b8b973e3f776f9fe3b43bef4576470d8ad33f3d7cfaff6edff0e5778">+97/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>fr.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-db80e762b88ddf183820c050cdc6b215e6b02b365b5e73f5152af46b0d26f1a2">+97/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>it.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-2de78074a5f887afddce60d694ead9322e6ab223eb70251c13819f3028bdc70d">+97/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>ja.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-092e49c5f9fbc1b539ab9c2866d108d0ce1d314022b4c294eb4611b285e7bbd3">+97/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>ko.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-50e27ca1b4825a5026f3a251bfcf79c97cab07cfade2ebd512d332453d707c48">+97/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>nl.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-a1706021687ae5d8a1c006c49eab3946174fecd895f9b70a89c2e76d97250906">+97/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>pt.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-38e804f64cb5e0e451849fc84e9b46e53c954a4a4263d51c18665ad45f4b4815">+97/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>tr.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-6f0f131e9e2591480c4c5d1eaffc72d02dc31cbd8d3f90d8f012f08cabac8818">+97/-2</a>&nbsp;
&nbsp; </td>

</tr>

<tr>
  <td><strong>zh.json</strong></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-8818055db58f83230aeea4ebfd4cec31d924e8c47b6f91298e356959ab25339e">+97/-2</a>&nbsp;
&nbsp; </td>

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

</details>

___




### E2E Tests Added

| # | Spec File | Test Name |
|---|-----------|-----------|
| 1 | `alerts-scheduled-features.spec.js` | Alert details dialog opens
with history and action buttons work |
| 2 | `alerts-scheduled-features.spec.js` | Create scheduled alert with
aggregation via Builder |
| 3 | `alerts-scheduled-features.spec.js` | Create scheduled alert with
PromQL query |
| 4 | `alerts-scheduled-features.spec.js` | SQL mode preview renders
chart |
| 5 | `alerts-scheduled-features.spec.js` | Would Trigger indicator
displays for scheduled alerts |
| 6 | `alerts-scheduled-features.spec.js` | Aggregation toggle off
clears group-by fields |

---------

Co-authored-by: Ashish Kolhe <ashish.j.kolhe@gmail.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Subhradeep Chakraborty <chakrabortysubhradeep556@gmail.com>
Co-authored-by: Shrinath Rao <shnath@openobserve.ai>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 10:20:14 +05:30