Douman
d97a7b74cd
fix: Make sure http router is wrapped into base uri ( #10592 )
2026-02-24 20:58:21 +08:00
Mitesh Sahu
ab31ad95a8
fix: resolve multi-bucket storage permission error ( #10552 )
2026-02-24 15:36:00 +08:00
Huaijin
7cfb54c8de
fix: add option to control batch size ( #10520 )
2026-02-24 13:38:37 +08:00
Zhao.wei
8d21db39aa
fix: treat large numbers as strings ( #10627 )
2026-02-24 12:35:26 +08:00
Subhra264
1b679d5b28
fix: don't save saved view records with empty text as the value ( #10495 )
2026-02-23 11:52:25 +08:00
Subhra264
19226edd7f
fix: super cluster ofga sync issue ( #10460 )
2026-02-23 11:51:54 +08:00
udev
dff6494b47
fix: ai config ( #10589 )
2026-02-23 11:36:10 +08:00
Ashish Kolhe and Claude Opus 4.6
ca5c3bcde5
fix: vortex feature flag ( #10609 )
...
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-22 19:30:48 +05:30
Loakesh Indiran and Claude Sonnet 4.6
16664bf507
fix: correct hit truncation limit in partitioned streaming search ( #10605 )
...
When a query with LIMIT spans multiple partitions, the truncation at the
limit boundary used `req_size` (the total limit, e.g. 230) as the
truncation target instead of the remaining slots for the current
partition (`req_size - hits_already_returned`).
For example with limit=230:
- Partition 0: 43 hits returned → accumulated = 43
- Partition 1: 198 hits returned by DB, but only 187 slots remain (230 -
43). `truncate(230)` was a no-op since 198 < 230, so all 198 hits passed
through → total = 241 (exceeds limit by 11)
Fix: compute `allowed = req_size - (curr_res_size - total_hits)` which
is the number of remaining slots before this partition's hits are added,
then truncate to that value.
Fixes Issues:
- https://github.com/openobserve/openobserve/issues/10486
- https://github.com/openobserve/openobserve/issues/10602
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-02-21 22:20:08 +05:30
Ashish Kolhe
7647247399
fix: traces api to use streaming ( #10593 )
2026-02-21 09:18:22 +05:30
bd6b654038
fix: add stringSeparated output format for remote pipeline (main) ( #10555 )
...
cherry pick https://github.com/openobserve/openobserve/pull/10540 from
v40 to main
---------
Signed-off-by: Yashodhan Joshi <yjdoc2@gmail.com >
Co-authored-by: Yashodhan Joshi <yjdoc2@gmail.com >
Co-authored-by: Bhargav <BJP232004@GMAIL.COM >
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-19 15:20:56 +05:30
ByteBaker
69e7dca5e6
feat: service graph edge metrics fix, connection_type removal, and side panel latency display
2026-02-18 22:45:33 +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
Loakesh Indiran
cd01e67401
fix: add DeduplicationExec codec for serialization in distributed plans ( #10548 )
...
- Add DeduplicationExecNode proto message definition
- Implement codec for serializing/deserializing DeduplicationExec
- Add getter methods to DeduplicationExec for codec access
- Register DeduplicationExec codec in PhysicalExtensionCodec
This fixes the serialization error when
JOIN_MATCH_ONE(`ZO_FEATURE_JOIN_MATCH_ONE_ENABLED=true`) feature is
enabled and DeduplicationExec wraps EnrichmentExec in distributed query
plans.
2026-02-17 21:25:20 +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
Subhra264
aaa544620a
fix: support multiple custom roles in single org in sso claim parser ( #10327 )
...
### **PR Type**
Bug fix
- Support multiple custom roles in single org through the sso claim
parser vrl function.
- Do not allow passing organization name as the organization id in the
sso claim parser.
___
### **Description**
- Support multiple roles per organization
- Group custom roles by org reliably
- Fix tuple creation for multi-role orgs
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["SSO custom_roles claims"] --> B["Parse with split_once(\"/\")"]
B --> C["Group into HashMap<org, Vec<role>>"]
C -- "per org" --> D["Format roles as \"org/role\""]
D --> E["Create role-assignment tuples"]
```
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Bug
fix</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>jwt.rs</strong><dd><code>Group custom roles per org for
tuples</code>
</dd></summary>
<hr>
src/handler/http/auth/jwt.rs
<ul><li>Replace <code>HashMap<String, String></code> with
<code>HashMap<String, Vec<String>></code><br> <li> Parse
<code>custom_roles</code> via <code>split_once('/')</code> into org-role
lists<br> <li> Reuse grouped roles to build <code>"org/role"</code>
tuples<br> <li> Apply same grouping for existing users flow</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10327/files#diff-232cab74f4cbf135af424744272e17732fbda8ac005d33c0acb4597e65479d02 ">+35/-31</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
2026-02-17 16:29:58 +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>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-a4464ad7df3ac3afdca4e6fc583122d701bace10e3a2daf083cb6c902565b20f ">+28/-12</a>
</td>
</tr>
<tr>
<td><strong>convertSQLData.ts</strong><dd><code>Merge per-panel custom
chart options</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-88c0e865040a20b2c8bb7d77e7f6bd187a5b07c1645c120223bc9d59603752c3 ">+23/-0</a>
</td>
</tr>
<tr>
<td><strong>projections.rs</strong><dd><code>Extract top-level HAVING as
structured tree</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-7a0420d3649da44b80be36d7f1043d6ff81d88395c961266882c3c700f7edff7 ">+570/-3</a>
</td>
</tr>
<tr>
<td><strong>search.rs</strong><dd><code>Add `HavingNode` and
`LogicalOperator` schema</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-373e83a31e5bbc82fba05d7ae274b0dbd624ed748272232cf7eb8b8c3b2f3afc ">+26/-0</a>
</td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Expose HAVING schema and preview
config</code>
</dd></td>
<td><a href=""></a></td>
</tr>
<tr>
<td><strong>AlertSettings.vue</strong><dd><code>Schema-aware threshold
UI and i18n tooltips</code>
</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>
</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>
</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>
</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>
</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>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-c22aa1c5934b763f1d4a5a61a7e810b6bcb1d60b76b64c61cb3ce89dc0a04499 ">+5/-5</a>
</td>
</tr>
<tr>
<td><strong>AlertHistory.vue</strong><dd><code>Alert history view
updates to new drawer flow</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-1efacbab3b15dacfc79063c799c30b04bf3b75415055f892203e8cf1cb414450 ">+1/-1</a>
</td>
</tr>
<tr>
<td><strong>FilterGroup.vue</strong><dd><code>Filter builder tweaks
supporting alert wizard changes</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-8d5a73bea3aa0b5c86d48cda4a61ee3e30f27797ac2a5add1ee8bd66c75bef23 ">+7/-5</a>
</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>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-9aeee4a74c0520daa40f9b81c7016f5b6b3254375b968dd7598e745630980d62 ">+6/-0</a>
</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>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-ba9b65130898444f7815fd6068bdb0dc590612f74cc893f79d91b0afc44cc851 ">+29/-23</a>
</td>
</tr>
<tr>
<td><strong>alert.rs</strong><dd><code>Remove custom aggregation
auto-threshold override</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10470/files#diff-574be3504bf4d855c65fd3d7a10797a970237ff552edac4962b474b3983e094e ">+1/-7</a>
</td>
</tr>
<tr>
<td><strong>AlertWizardRightColumn.vue</strong><dd><code>Wizard right
column rerender/placement adjustments</code>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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>
</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
udev
8508623444
fix: route to accept org invite ( #10517 )
2026-02-16 15:06:20 +05:30
Hengfei Yang
93764d3eab
feat: add partition for file list ( #10521 )
2026-02-15 00:11:31 +08:00
Hengfei Yang
f83f84d841
feat: remove mysql support ( #10522 )
...
impl #8276 , Design at: #8276
2026-02-14 12:28:24 +08:00
udev
b0eac49a3a
fix: [ITER 2] O2 Assistant improvements ( #10473 )
2026-02-13 17:53:05 +05:30
Huaijin
c8663d6ef0
chore: directly error instead of fallback ( #10508 )
2026-02-13 17:53:33 +08:00
Huaijin
a810617abc
chore: refacotr vortex related code ( #10506 )
2026-02-13 16:42:40 +08:00
ByteBaker and github-actions[bot]
cf98c39c81
fix: semantic groups, service graph, dedup, dashboard cleanup ( #10502 )
...
## Summary
- **Semantic Groups**: add JSON export button, fix broken JSON import
(`handleJsonUpdate` was a no-op), fix "Applied 0 changes" toast bug
- **Service Graph**: remove unused `availableStreams` from
`build_topology` return and API response, skip `_`-prefixed orgs in
processor
- **Dedup Config**: change `time_window_minutes` from `Option<i64>` to
`Option<i32>`, add `deserialize_optional_i32` for defense-in-depth,
sanitize empty/NaN values on frontend before sending
- **Dashboard**: remove dead `/export` endpoint (identical to GET,
unused by frontend)
## Test plan
- [x] Semantic groups: export downloads JSON, import with file upload
works, import shows correct change count
- [x] Service graph: topology loads, stream dropdown works (populated by
`loadTraceStreams`)
- [x] Dedup: clearing time window field and saving no longer returns 422
- [x] Dashboard: GET `/{dashboard_id}` still works, `/export` route
removed
- [x] `cargo check` clean, `cargo clippy` clean
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-13 12:42:41 +05:30
Huaijin
016d1d777c
feat: support vortex as option file format ( #10491 )
2026-02-12 19:16:51 +08:00
9d8ad1d265
fix(incidents): widen correlation_key column, fix trace ID extraction, and clean up incident UI ( #10477 )
...
## Summary
This PR bundles several incident and log correlation fixes:
- **DB migration**: Widen `alert_incidents.correlation_key` from
`varchar(64)` to `varchar(128)` (Postgres raw SQL, MySQL SeaORM alter,
SQLite no-op) and bump `DB_SCHEMA_VERSION` to 30. Correlation keys use
prefixed formats (`SCOPE:` + 64-char hash = 70+ chars) that exceeded the
previous limit, causing `upgrade_incident_correlation` to fail.
- **Incident detail UI**: Remove the redundant refresh button/bar from
the correlated logs tab; hide search-term and dimension-filter actions
in the incident logs view since they don't apply in that context; remove
`cursor: help` from the badge overflow indicator.
- **Trace ID extraction fix**: Merge log record fields into
`availableDimensions` (in both `SearchResult.vue` and
`TraceDetailsSidebar.vue`) so trace ID extraction no longer fails when
the trace ID lives in log record fields rather than stream filters.
- **`hideSearchTermActions` prop plumbing**: Add the prop to
`JsonPreview.vue`, pass it through `TenstackTable.vue`, and enable
search-term actions in `DetailTable.vue` correlation view while hiding
them in the incident drawer.
- **Locale key rename**: Rename `rowsPerPage` to `recordsPerPage` across
all 12 language files for consistency.
## Test plan
- [ ] Migration unit tests pass for MySQL and PostgreSQL SQL generation
- [ ] Deploy to test env and verify incidents populate
`stable_dimensions` on next alert cycle
- [ ] Verify incident logs tab no longer shows the refresh bar
- [ ] Verify trace ID extraction works from log correlation in both logs
and traces views
- [ ] Verify "Records per page" label renders correctly in all locales
---------
Co-authored-by: sai nikhil kethe <nikhil@openobserve.ai >
Co-authored-by: omkark06 <omkar@zinclabs.io >
Co-authored-by: Bhargav <BJP232004@GMAIL.COM >
Co-authored-by: Shrinath Rao <shnath@openobserve.ai >
2026-02-11 18:30:48 +05:30
Hengfei Yang
1a4104976f
fix: data type evolution ( #10478 )
2026-02-11 20:20:27 +08:00
Huaijin
118e52c86d
fix: datafusion error message transform is wrong ( #10452 )
2026-02-11 10:42:36 +08:00
ByteBaker
48a7f15bb0
fix(incidents): use system_settings as single source of truth for semantic groups
...
The incident correlation code was reading semantic field groups from the
dedup config DB table (alert_config/{org}/deduplication), which held a
stale copy of 45 groups missing critical entries like service, k8s-cluster,
k8s-deployment, and k8s-namespace. Meanwhile, the UI and API read from
system_settings (/settings/v2/semantic_field_groups) which had the correct
51 groups. This mismatch caused all incidents to have empty
stable_dimensions, falling back to alert_id-based isolation with no
correlation.
Root cause: two independent storage locations for semantic groups that
were never kept in sync. The dedup config was written once and never
updated when users modified groups through the UI.
Changes:
Backend — single source of truth:
- incidents.rs: read semantic groups from system_settings, not dedup config
- deduplication.rs: same fix for alert deduplication fingerprinting
- org_config.rs: remove get_semantic_groups/initialize_semantic_groups
(dead code that copied groups into the dedup config)
- deduplication.rs (config struct): remove semantic_field_groups field
from GlobalDeduplicationConfig entirely; enterprise functions now take
&[SemanticFieldGroup] as a separate parameter
- Remove duplicate SemanticFieldGroup tests from dedup module (covered
in correlation.rs home module)
Correlation reasons — rename for clarity:
- ManualExtraction split into ScopeMatch and WorkloadMatch based on
which dimension type drove the correlation key
- Temporal renamed to TraceBased (it correlates by trace_id, not time)
- HierarchicalUpgrade removed (was a join strategy, not a reason;
original reason now flows through from correlate_alert)
- New AlertId reason for the fallback case (no dimensions found)
Key format — standardized [KIND]:[key]:
- SCOPE:{hash}, WORKLOAD:{hash}, SD:{hash}, TRACE:{trace_id}, ALERT:{id}
- KeyType::classify updated to parse all prefixes
Frontend:
- Badge colors: blue/teal/purple/orange/grey for the 5 reasons
- Tooltips added to each correlation reason badge explaining what it means
- TypeScript types and en.json i18n updated
2026-02-10 23:57:19 +05:30
Subhra264
9f98a593bf
fix: print vrl errors once for the whole batch instead of every record ( #10250 )
...
### **User description**
Currently there are warning logs in the `apply_vrl_fn` function which
prints the warning for each and every record whenever there is vrl
error. If there are huge number of records, then the number of logs for
the error is also unnecessarily huge. This pr fixes this by logging the
error once for the whole batch.
___
### **PR Type**
Bug fix
___
### **Description**
- Consolidate VRL errors into batch-level logs
- Downgrade per-record warnings to debug logs
- Add info-level pipeline error logging
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["apply_vrl_fn returns (value, err)"]
B["err.is_some()?"]
C["log error once per batch"]
A -- returns --> B
B -- yes --> C
```
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Bug
fix</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>multi_streams.rs</strong><dd><code>Batch error logging
in search_multi</code>
</dd></summary>
<hr>
src/handler/http/request/search/multi_streams.rs
<ul><li>Capture <code>err</code> from <code>apply_vrl_fn</code>
calls<br> <li> Log a single error per batch when present<br> <li> Apply
changes in both apply_over_hits branches</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10250/files#diff-c3233cdf1e68cb2455f91457719b9c2f477e735ee16546fdfe111e76768bd054 ">+15/-4</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>mod.rs</strong><dd><code>Cache VRL error batch
logging</code>
</dd></summary>
<hr>
src/service/search/cache/mod.rs
<ul><li>Capture <code>err</code> from <code>apply_vrl_fn</code> in cache
search<br> <li> Log VRL errors once per batch<br> <li> Update
apply_over_hits and non-apply logic</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10250/files#diff-f07bfacc0501b9c234e64b16c1dd8eb0ae8fcbe231f90c81fed72bcc94946f74 ">+15/-4</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>http.rs</strong><dd><code>Cluster HTTP VRL error
logging</code>
</dd></summary>
<hr>
src/service/search/cluster/http.rs
<ul><li>Extract <code>err</code> from <code>apply_vrl_fn</code> in
cluster HTTP search<br> <li> Log a single error per batch after
processing</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10250/files#diff-fe0a1bbec7ef6418120544b589a531e5144b28cd2650f99135ed8a70ac17ac03 ">+17/-4</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>mod.rs</strong><dd><code>Core search VRL error
batching</code>
</dd></summary>
<hr>
src/service/search/mod.rs
<ul><li>Capture and accumulate <code>err</code> in core search logic<br>
<li> Log batch-level VRL errors in apply_over_hits and else</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10250/files#diff-c3b85ea662a885fbd39797968928b291cb59a58f53a03f7b7dfd7ba8b6a7985a ">+15/-4</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Error
handling</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>mod.rs</strong><dd><code>Downgrade VRL failure logs to
debug</code>
</dd></summary>
<hr>
src/service/ingestion/mod.rs
<ul><li>Changed <code>log::warn!</code> to <code>log::debug!</code> for
VRL failures<br> <li> Preserve metrics increment on transform
failures</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10250/files#diff-7c7b5bca85f0ced652965cae66540c96f56dfcca4f4c16b77bf7b45aac203d1b ">+2/-2</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>batch_execution.rs</strong><dd><code>Info log for
pipeline error details</code>
</dd></summary>
<hr>
src/service/pipeline/batch_execution.rs
<ul><li>Added <code>log::info!</code> for pipeline error details<br>
<li> Log <code>pipeline_id</code>, <code>pipeline_name</code>, and
<code>node_errors</code></ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10250/files#diff-3f6824a6eddaf1603e5cb0f1a4311ac6a45e1ffb967266ccc1f0bba944625e69 ">+6/-0</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
2026-02-10 18:54:35 +05:30
ByteBaker
58e3cf1ac2
fix: build minimal DAG for incident alert graph (one edge per node)
...
Replace the cartesian_product cross-service edge loop that produced
O(S²) temporal edges (complete DAG) with a single-predecessor rule:
each new node connects to exactly one immediate predecessor in the
global timeline. Edge type is ServiceDependency when the service graph
confirms the relationship, Temporal otherwise.
2026-02-10 16:23:35 +05:30
Huaijin
ac2db7c1f0
fix: _all invaild json issue ( #10443 )
2026-02-10 16:55:42 +08:00
ByteBaker
d3c217e28b
refactor: simplify enterprise feature-flag handling in status handler
...
Introduce `enterprise_value!` macro to replace repetitive `#[cfg(feature = "enterprise")]` / `#[cfg(not(...))]` pairs. Also clean up `zo_config`, `schedulez`, `cache_status`, `config_runtime`, and related helpers:
- Add `Rum::from_cfg()` constructor
- Take `&mut` in `hide_sensitive_fields` to avoid cloning
- Use `HashMap::with_capacity`, `fold`, and `itertools::Itertools::join`
- Simplify `get_stream_schema_status` with iterator methods
2026-02-10 13:16:39 +05:30
ByteBaker
b26af8c2f5
fix: remove rca_enabled check in AI chat enabled
2026-02-09 23:58:06 +05:30
ByteBaker
46a4f8c9e5
fix: validate function name and body are non-empty on create/update
...
Empty function bodies could be saved to the DB, causing runtime panics
when later deserialized and compiled. Also replace .unwrap() calls in
db::functions::get/list with proper error propagation.
2026-02-09 23:58:06 +05:30
ByteBaker and sai nikhil kethe
2075dd0fad
fix: use jsonb_exists() instead of ? operator for scope conflict SQL ( #10429 )
...
### **User description**
## Summary
- Replace PostgreSQL `?` JSONB operator with `jsonb_exists()` function
in service streams scope conflict SQL to avoid ambiguity with
parameterized query placeholders.
## Test plan
- [ ] Verify scope conflict filtering queries work correctly with
`jsonb_exists()`
- [ ] Run existing `service_streams` unit tests
___
### **PR Type**
Bug fix
___
### **Description**
- Replace JSONB `?` with `jsonb_exists()`
- Update Postgres SQL generation for filters
- Adjust unit tests for new SQL
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["Scope filters input"]
B["build_scope_conflict_sql (Postgres)"]
C["SQL uses jsonb_exists() checks"]
D["Updated SQL assertions in tests"]
A -- "iterates key/value" --> B
B -- "generates conflict predicates" --> C
C -- "validated by" --> D
```
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Bug
fix</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>service_streams.rs</strong><dd><code>Use
`jsonb_exists()` in scope conflict SQL</code>
</dd></summary>
<hr>
src/infra/src/table/service_streams.rs
<ul><li>Generate Postgres conflict checks with
<code>jsonb_exists(dimensions::jsonb, </code><br><code>key)</code><br>
<li> Keep value mismatch logic via <code>dimensions::jsonb->>'{key}' !=
$n</code><br> <li> Update SQL string assertions in related unit
tests</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10429/files#diff-51e4848c872a89ac19b18d5d49292ea20bf23bf71498236a4a4ea147f0600a77 ">+4/-4</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
---------
Co-authored-by: sai nikhil kethe <nikhil@openobserve.ai >
2026-02-09 19:34:54 +05:30
Huaijin
ca3b42d4b6
refactor: split merge and downsampling to own file ( #10423 )
2026-02-09 20:23:43 +08:00
Huaijin
713fe2ef01
feat: impl user view for llm ( #10418 )
2026-02-09 17:05:04 +08:00
ecaed3b89f
feat: dashboard table chart pagination ( #10285 )
...
### **User description**
Design at:
https://github.com/openobserve/designs/blob/main/dashboards/table-chart-pagination/design.md
### **PR Type**
Enhancement
___
### **Description**
- Add pagination flags to dashboard panels
- Initialize pagination defaults in frontend
- Extend backend PanelConfig with pagination
___
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Configuration
changes</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>useDashboardPanel.ts</strong><dd><code>Initialize
pagination settings in panel</code>
</dd></summary>
<hr>
web/src/composables/useDashboardPanel.ts
<ul><li>Added <code>show_pagination</code> default false<br> <li> Added
<code>rows_per_page</code> default 10</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-fbba1700750053b9eaf38ddd30dab84531bc44131c795ebb713811e4930cd7cb ">+2/-0</a>
</td>
</tr>
</table></td></tr><tr><td><strong>Enhancement</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>mod.rs</strong><dd><code>Extend PanelConfig with
pagination fields</code>
</dd></summary>
<hr>
src/config/src/meta/dashboards/v8/mod.rs
<ul><li>Added <code>show_pagination</code> Option<bool> field<br> <li>
Added <code>rows_per_page</code> Option<i64> field</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-cbf3fe971525ba58892400391dfd7dac7e43d6049d6b4f5a9840ad104ebc5e08 ">+4/-0</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
___
### **PR Type**
Enhancement, Tests
___
### **Description**
- Add table pagination config and defaults
- Implement reusable table pagination controls
- Wire pagination into SQL/PromQL tables
- Add unit and Playwright coverage
___
### Diagram Walkthrough
```mermaid
flowchart LR
cfgUI["ConfigPanel: pagination toggle + rows input"]
panelDefaults["useDashboardPanel: default pagination config"]
tableRenderer["TableRenderer: pagination state + bottom slot"]
controls["TablePaginationControls: dropdown + nav + count"]
promql["PromQLTableChart: legend footer + pagination controls"]
schema["PanelSchemaRenderer: pass pagination props"]
backend["Backend PanelConfig: persist pagination fields"]
tests["Unit + Playwright tests"]
cfgUI -- "writes config" --> panelDefaults
panelDefaults -- "panel config values" --> schema
schema -- "props showPagination/rowsPerPage" --> tableRenderer
tableRenderer -- "renders" --> controls
promql -- "uses slot scope" --> controls
backend -- "stores config" --> panelDefaults
tests -- "verifies behavior" --> tableRenderer
```
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Tests</strong></td><td><details><summary>5
files</summary><table>
<tr>
<td><strong>PromQLTableChart.spec.ts</strong><dd><code>Add unit coverage
for PromQL table pagination</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-9db7fe6fba32c64dabbf0dd05ec6df9a1ddfc89ff4774d0e627d657e016e7674 ">+551/-0</a>
</td>
</tr>
<tr>
<td><strong>TableRenderer.spec.ts</strong><dd><code>Add pagination
behavior unit tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-550a0a669838c47473442a7d37407fead8b7cb2a05121880dd2c0522022c8c3f ">+180/-0</a>
</td>
</tr>
<tr>
<td><strong>ConfigPanel.spec.ts</strong><dd><code>Test table pagination
config UI</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-a4e717cd660ad6fa369629f8de524f4d57bf4f71b11d3244ce41b9ed9f0379d2 ">+203/-0</a>
</td>
</tr>
<tr>
<td><strong>useDashboardPanel.spec.ts</strong><dd><code>Assert default
pagination config initialization</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-5dbd79fdde0cbbb7db569095fa062931286463da0b5e72b1fbe99f56116fa5e2 ">+24/-0</a>
</td>
</tr>
<tr>
<td><strong>dashboard-table-pagination.spec.js</strong><dd><code>Add E2E
coverage for table pagination</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-ed0804a2639080ec5164324b8e7943b469204243b66b67d85ad8e91cf46bee85 ">+1180/-0</a></td>
</tr>
</table></details></td></tr><tr><td><strong>Enhancement</strong></td><td><details><summary>8
files</summary><table>
<tr>
<td><strong>useDashboardPanel.ts</strong><dd><code>Initialize default
table pagination config fields</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-fbba1700750053b9eaf38ddd30dab84531bc44131c795ebb713811e4930cd7cb ">+2/-0</a>
</td>
</tr>
<tr>
<td><strong>constants.ts</strong><dd><code>Add default rows-per-page
constant</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-a5e1b14a291a4b42368faa0160f555b19bdc1a542624d4f89ea6e3ed7c4a664d ">+2/-0</a>
</td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Persist pagination fields in
`PanelConfig`</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-cbf3fe971525ba58892400391dfd7dac7e43d6049d6b4f5a9840ad104ebc5e08 ">+4/-0</a>
</td>
</tr>
<tr>
<td><strong>TableRenderer.vue</strong><dd><code>Implement pagination
state and default footer</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-794706ea9da3a70012a0327c0464f9fd16802f78ece26055fe951716c2d73d59 ">+89/-9</a>
</td>
</tr>
<tr>
<td><strong>PromQLTableChart.vue</strong><dd><code>Add pagination props
and legend footer controls</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-9c39051461b6f7deae94e8847f91443c4c68541f52137a423bb54b6ab5cd3317 ">+29/-10</a>
</td>
</tr>
<tr>
<td><strong>TablePaginationControls.vue</strong><dd><code>New reusable
pagination footer component</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-b5e9d5740f8c581bb17133e249e81174ea0842b4d46b5c06fa0efa2f336a15d7 ">+146/-0</a>
</td>
</tr>
<tr>
<td><strong>ConfigPanel.vue</strong><dd><code>Add pagination toggle and
rows-per-page input</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-c3a6e64dff02b58bb7cdc3f0668990b41ff41544b4c5e991bbcd989ad4bba3f8 ">+59/-0</a>
</td>
</tr>
<tr>
<td><strong>PanelSchemaRenderer.vue</strong><dd><code>Pass pagination
props into `TableRenderer`</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-e5376e7e77bf3aaf6590c2522d8c2dbffcc95a8006ae0d6dc0040a37825367d6 ">+2/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>12
files</summary><table>
<tr>
<td><strong>tr.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-6f0f131e9e2591480c4c5d1eaffc72d02dc31cbd8d3f90d8f012f08cabac8818 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>ja.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-092e49c5f9fbc1b539ab9c2866d108d0ce1d314022b4c294eb4611b285e7bbd3 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>de.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-78f24ecb2dbcfc38fdf3ec22b2559a5b40d236ea689d1c55f5d3e87168310264 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>fr.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-db80e762b88ddf183820c050cdc6b215e6b02b365b5e73f5152af46b0d26f1a2 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>it.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-2de78074a5f887afddce60d694ead9322e6ab223eb70251c13819f3028bdc70d ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>hi.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-1e7b52b5c4e762db2c923d0d3efb6d693702825ed3a1a112d3069f26b0d5f605 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>ko.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-50e27ca1b4825a5026f3a251bfcf79c97cab07cfade2ebd512d332453d707c48 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>nl.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-a1706021687ae5d8a1c006c49eab3946174fecd895f9b70a89c2e76d97250906 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>es.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-ac2a2167b8b973e3f776f9fe3b43bef4576470d8ad33f3d7cfaff6edff0e5778 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>pt.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-38e804f64cb5e0e451849fc84e9b46e53c954a4a4263d51c18665ad45f4b4815 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>en.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-892aa3d75ab6e129ef9116aa21bec1b9a15ba69ce5366d2a19128078c690d824 ">+4/-1</a>
</td>
</tr>
<tr>
<td><strong>zh.json</strong><dd><code>Add pagination strings and rename
key</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-8818055db58f83230aeea4ebfd4cec31d924e8c47b6f91298e356959ab25339e ">+4/-1</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>playwright.yml</strong><dd><code>Add CI job entry for
pagination tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10285/files#diff-7afcd2d8f7b49bda74843f209eefb7b2da45f7e7803bf2e4bd636699b76aa2d3 ">+7/-1</a>
</td>
</tr>
</table></details></td></tr></tr></tbody></table>
</details>
___
---------
Co-authored-by: ktx-abhay <abhay.padamani@kiara.tech >
Co-authored-by: ktx-akshay <akshay.patil@kiara.tech >
Co-authored-by: ktx-vaidehi <vaidehi.akhani@kiara.tech >
2026-02-09 13:41:38 +05:30
ByteBaker
afcbe05565
refactor: adaptive per-type stream sampling for service discovery ( #10414 )
...
### **User description**
## Summary
- Add `get_stream_count_cached()` with HashMap + 5-min TTL to avoid
per-file schema cache scans on the ingestion hot path
- Pass stream counts to the enterprise sampler from both ingester
(`parquet.rs`) and compactor (`merge.rs`) code paths
**Companion PR:** openobserve/o2-enterprise#TBD
## Context
Stream correlation was taking hours to reach full correlation (logs +
metrics + traces). The root cause: a single flat `stream_sample_rate=10`
applied equally to all stream types starved trace streams (<10 total)
while over-serving metrics (2200+). The enterprise companion PR contains
the adaptive sampling logic; this PR provides the stream count data it
needs.
## Test plan
- [ ] Enterprise sampler tests pass (138/138) — covers adaptive rate
computation, equity ordering, backward compatibility
- [ ] OSS builds clean without enterprise feature
- [ ] No new env vars or config changes required
___
### **PR Type**
Enhancement
___
### **Description**
- Add cached per-type stream counting
- Pass stream counts into enterprise sampler
- Update ingester and compactor sampling calls
2026-02-07 13:12:47 +05:30
Harsh Mahajan
16973ebbc0
fix: default not set for usage stream ( #10411 )
2026-02-06 23:59:54 +08:00
udev
53b8df8ed2
fix: serde for user role and add test cases ( #10408 )
...
### **PR Type**
Bug fix, Tests
___
### **Description**
- Fix `UserRole` snake_case serde renaming
- Add comprehensive `UserRole` unit tests
- Cover serialize/deserialize, display, ordering, parsing
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["`UserRole` enum serde attributes"]
B["Snake_case JSON encoding/decoding"]
C["Unit tests for role behaviors"]
A -- "sets `rename_all = snake_case`" --> B
B -- "validated by" --> C
```
<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>user.rs</strong><dd><code>Fix role serde casing and add
tests</code>
</dd></summary>
<hr>
src/config/src/meta/user.rs
<ul><li>Change <code>UserRole</code> serde to
<code>rename_all</code><br> <li> Add tests for snake_case JSON serde<br>
<li> Add tests for ordering, display, from_str<br> <li> Note: one added
test block looks malformed</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10408/files#diff-fc77f1b0e696889335f118cd5c1d69b7e3b385f48dd8e94c02a69912242e689b ">+154/-1</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
2026-02-06 21:15:29 +05:30
Huaijin
16afc7588c
feat: impl llm session view backend api ( #10412 )
2026-02-06 22:26:06 +08:00
udev
f2d418af15
fix: redirect config for router client ( #10398 )
...
### **PR Type**
Bug fix
___
### **Description**
- Disable redirects for router reqwest client
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["reqwest client builder"]
B["redirect policy: none"]
A -- "configure" --> B
```
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Bug
fix</strong></td><td><table>
<tr>
<td>
<details>
<summary><strong>mod.rs</strong><dd><code>Disable automatic redirects
for router client</code>
</dd></summary>
<hr>
src/service/tls/mod.rs
<ul><li>Add <code>redirect(Policy::none())</code> to client builder<br>
<li> Prevent automatic redirect following for routing</ul>
</details>
</td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10398/files#diff-5061e662a8899b7e00e5744bd72f808b28ac479a8921ac519f7409bffdc4438a ">+2/-1</a>
</td>
</tr>
</table></td></tr></tr></tbody></table>
</details>
___
2026-02-06 16:31:05 +05:30
ByteBaker
6a03a7675f
feat(incidents): enrich alert dimensions from query conditions ( #10399 )
...
### **User description**
## Summary
Adds dimension enrichment from alert conditions (SQL WHERE, GUI
conditions, PromQL) to ensure consistent dimensions across alert
firings, preventing duplicate incidents caused by incomplete result_row
data.
## Problem
Alert `result_row` has inconsistent fields depending on log entry
completeness:
- Same alert creates incidents with different dimensions
- Production data shows 50% of incidents missing deployment dimension
- Causes unnecessary duplicate incidents (e.g.,
"test_alert_1_might_break" creates 6 separate incidents for same
namespaces)
**Example:**
```
Alert fires 3 times:
Firing #1 : result_row = {namespace: "ziox"}
→ Incident #1 (68 alerts)
Firing #2 : result_row = {namespace: "ziox", deployment: "router"}
→ Incident #2 (23 alerts) ❌ Separate!
Firing #3 : result_row = {namespace: "ziox", deployment: "compactor"}
→ Incident #3 (19 alerts) ❌ Separate!
Result: 3 incidents for same namespace
```
## Solution
Extract baseline dimensions from alert query conditions and enrich
result_row:
**Priority order:**
1. result_row (actual runtime data) - highest priority
2. Alert conditions (SQL/GUI/PromQL) - fills gaps with baseline
3. Service Discovery - fills remaining gaps
**Supported condition types:**
- ✅ SQL WHERE clauses: `WHERE namespace='prod' AND deployment='api'`
- ✅ GUI conditions V1 (tree-based) and V2 (linear)
- ✅ PromQL label matchers: `{namespace="prod",deployment="api"}`
## Changes
- Make result_row labels mutable for enrichment
- Call enterprise sql_parser to extract condition dimensions
- Merge condition dimensions into labels using `.entry().or_insert()`
- Add logging for dimension enrichment tracking
- Update debug log message
## Impact
- **Dimension consistency:** 50% → >95%
- **Incident reduction:** Target -60% total (from -50% with hierarchical
correlation)
- **Works for:** Auto-fired and manually triggered alerts
- **Performance:** <1ms overhead per alert
## Testing
- Covered by enterprise integration tests (26 tests passing)
- Requires enterprise PR (to be created) for sql_parser implementation
- Full test suite: 92 tests passing
## Design
Design at: `designs/incidents/hierarchical-correlation.md`
## Related
- Depends on: Enterprise PR (creating next)
- Builds on: #10XXX (hierarchical correlation)
___
### **PR Type**
Enhancement, Bug fix, Tests
___
### **Description**
- Add hierarchical incident correlation upgrades
- Enrich alert labels from query conditions
- Introduce upgrade window configuration defaults
- Add key/dimension relationship unit tests
2026-02-06 15:17:12 +05:30
Huaijin
b315f4ca08
feat: dag graph for llm traces ( #10388 )
2026-02-06 16:46:44 +08:00
Harsh Mahajan
e6d5b6eed5
fix: ParserError on streams with : in name ( #10394 )
2026-02-06 12:46:49 +08:00
Harsh Mahajan
d0b0614919
fix: dependency upgrades in Cargo.toml and Cargo.lock. ( #10253 )
2026-02-06 11:45:24 +08:00
Harsh Mahajan
ac57e491d6
fix: query usage stream for their org ( #10139 )
...
### **User description**
resolve https://github.com/openobserve/o2-enterprise/issues/1168
___
### **PR Type**
Enhancement, Tests
___
### **Description**
- Add `usage_stream_enabled` org setting flag
- Provide `get_org_setting_usage_stream_enabled` function
- Extend ingestion to route usage streams per org
- Introduce `usage_schema` module for lazy schema init
- Add `UsageData::init_for_reflection` for schema inference
___
### Diagram Walkthrough
```mermaid
flowchart LR
UD["UsageData ingestion"] -- "serialize & filter" --> RD["report_data: Vec<Value>"]
RD -- "ingest to meta org" --> META["ingest_reporting_data(META_ORG_ID)"]
RD -- "split by org" --> PERORG["per_org_map"]
PERORG -- "for each enabled org" --> INIT["ensure_usage_stream_initialized(org)"]
INIT -- "then" --> INGORG["ingest_reporting_data(org)"]
```
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Configuration
changes</strong></td><td><details><summary>2 files</summary><table>
<tr>
<td><strong>organization.rs</strong><dd><code>Add default and config for
usage_stream_enabled</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10139/files#diff-4f089715a7ac4f78b45039d773f2fccbb4fbc6a409e0ab9ceee1fcf7911bc44b ">+9/-0</a>
</td>
</tr>
<tr>
<td><strong>mod.rs</strong><dd><code>Include usage_schema
module</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10139/files#diff-c6255010f7a87d6acdb3ad04954fc9f2c27350ae319c53a1857b120aa06408a3 ">+1/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Enhancement</strong></td><td><details><summary>5
files</summary><table>
<tr>
<td><strong>usage.rs</strong><dd><code>Add UsageData init_for_reflection
method</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10139/files#diff-b15a6adcb163dc27993c83528105a6726c44c86d8a84c5cf5d1d382c6ec8cc29 ">+55/-0</a>
</td>
</tr>
<tr>
<td><strong>settings.rs</strong><dd><code>Handle usage_stream_enabled in
HTTP settings</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10139/files#diff-1e807254f2faf8fd09b802f71b23412f203eed289033f96bfc62b15dd997db8c ">+5/-0</a>
</td>
</tr>
<tr>
<td><strong>organization.rs</strong><dd><code>Add
get_org_setting_usage_stream_enabled API</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10139/files#diff-ce65cea926a09721a8fea14d07fe188bc2b887218e95d74a8bffefb54001da50 ">+27/-0</a>
</td>
</tr>
<tr>
<td><strong>ingestion.rs</strong><dd><code>Route and serialize usage
streams per org</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10139/files#diff-3edd5f4ed1eed0f765b7b450ef0fbf587632e6b22302006a5e397049e297057f ">+60/-5</a>
</td>
</tr>
<tr>
<td><strong>usage_schema.rs</strong><dd><code>Implement lazy schema init
and unit tests</code>
</dd></td>
<td><a
href="https://github.com/openobserve/openobserve/pull/10139/files#diff-20a9eccd303d49e271e64fb18c608b7ef135a710e9e057d32db9c0d13b15e1e3 ">+191/-0</a>
</td>
</tr>
</table></details></td></tr></tr></tbody></table>
</details>
___
2026-02-05 20:44:03 +05:30