Repository navigation
Fixes #34616: Grouped incidents in the AI-mode incident manager - #34599
Conversation
✅ PR checks passedThe linked issue has a description and all required Shipping project fields set. Thanks! |
🔄 Playwright impact map auto-refreshedThis PR touched specs or UI source that changed the source→spec routing map. I regenerated What is this file? It is the auto-generated half of Playwright's PR planner. It routes "if source X changes, run specs Y" by walking spec imports and cross-referencing What if I want to regenerate locally instead? Run this before pushing your next change to skip the bot commit: python3 .github/scripts/generate_playwright_impact_map.py
git add .github/playwright/impact-map.generated.json
git commit --amend --no-edit # or a separate commit |
🔄 Playwright impact map auto-refreshedThis PR touched specs or UI source that changed the source→spec routing map. I regenerated What is this file? It is the auto-generated half of Playwright's PR planner. It routes "if source X changes, run specs Y" by walking spec imports and cross-referencing What if I want to regenerate locally instead? Run this before pushing your next change to skip the bot commit: python3 .github/scripts/generate_playwright_impact_map.py
git add .github/playwright/impact-map.generated.json
git commit --amend --no-edit # or a separate commit |
Backend for the grouped incident manager (epic #30414): group rows with their related tables and test definitions and assignee references, drill-down parity for the flat listing, paging by page number, a lookup of one group by its key, bulk severity, sorting the groups (#34595) and filtering them by severity (#34596). Existing offset paging keeps working.
Frontend for the grouped incident manager (epic #30414), on top of the incident groups API (#34549): - Filter row and paging by page number (#30417) - Related tables and test definitions on every group row (#34550) - Group drawer and drill-down (#30418) - Bulk status, assignee and severity changes (#30419) - End-to-end tests; the flat incident list is retired (#30420) - Inline status, assignee and severity on incident rows (#34594) - Sorting the groups (#34595) - Severity filter (#34596) Core components: DateRangePicker and FilterSelect take a size, so the filter row lines up on the Select scale.
🔄 Playwright impact map auto-refreshedThis PR touched specs or UI source that changed the source→spec routing map. I regenerated What is this file? It is the auto-generated half of Playwright's PR planner. It routes "if source X changes, run specs Y" by walking spec imports and cross-referencing What if I want to regenerate locally instead? Run this before pushing your next change to skip the bot commit: python3 .github/scripts/generate_playwright_impact_map.py
git add .github/playwright/impact-map.generated.json
git commit --amend --no-edit # or a separate commit |
Code Review ✅ Approved🔴 High risk · Bulk status/severity updates and denormalized severity synchronization change stored incident data Comprehensive grouped incident manager implementation for AI-mode with backend API and frontend UI. Groups incidents by test definition, table, or owner; supports filtering, sorting, paging, bulk and inline status/assignee/severity changes; drill-down from groups to incidents; backend validation and domain inheritance; 61/61 integration tests passing, 1302 unit tests at 97.57% statement coverage, 18/18 Playwright tests passing. No issues found. OptionsDisplay: compact → Counting what did not apply, without listing it. Comment with these commands to change the behavior for this request:
Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source |
|
| Count | Rule |
|---|---|
| 4 | openmetadata-imports/no-lower-layer-page-imports |
| 1 | openmetadata-imports/review-sequential-api-calls |
| 1 | react-hooks/exhaustive-deps |
| 1 | openmetadata-ui-patterns/no-non-adaptive-palette |
All findings
| Location | Rule | Message | |
|---|---|---|---|
| 🟡 | src/components/IncidentManager/useIncidentActions.test.ts:21:1 |
openmetadata-imports/no-lower-layer-page-imports |
Pages are route-level composition modules. Move the shared implementation/type to a lower layer instead of importing a page from here. |
| 🟡 | src/components/IncidentManager/useIncidentActions.ts:21:1 |
openmetadata-imports/no-lower-layer-page-imports |
Pages are route-level composition modules. Move the shared implementation/type to a lower layer instead of importing a page from here. |
| 🟡 | src/components/IncidentManager/useIncidentActions.ts:89:27 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/components/IncidentManager/useIncidentFilterOptions.ts:21:1 |
openmetadata-imports/no-lower-layer-page-imports |
Pages are route-level composition modules. Move the shared implementation/type to a lower layer instead of importing a page from here. |
| 🟡 | src/components/IncidentManager/useIncidentFilters.ts:19:1 |
openmetadata-imports/no-lower-layer-page-imports |
Pages are route-level composition modules. Move the shared implementation/type to a lower layer instead of importing a page from here. |
| 🟡 | src/components/observability/DataQuality/Dashboard/DqDateRangeFilter.tsx:72:6 |
react-hooks/exhaustive-deps |
React Hook useEffect has a missing dependency: 'buildValue'. Either include it or remove the dependency array. |
| 🟡 | src/components/observability/IncidentManager/IncidentManagerPage.tsx:37:3 |
openmetadata-ui-patterns/no-non-adaptive-palette |
Raw palette class "tw:[&_.custom-chart-background]:bg-gray-blue-25" is static — it does not flip in dark mode. Use the theme-adapting "utility-" variant (tw:bg- |
Fix locally (fast - only checks files changed in this branch):
make ui-checkstyle-changed
|
|



Describe your changes:
Fixes #34616
Fixes #30414
Fixes #30417
Fixes #34549
Fixes #34550
Fixes #30418
Fixes #30419
Fixes #30420
Fixes #34594
Fixes #34595
Fixes #34596
The AI-mode incident manager (
/observability/incident-manager) lists open incidents as groups, by test definition, table or owner, instead of one flat list.Groups
Drill-down
Changes
Backend (
TestCaseResolutionStatusResource)page,group,sortFieldandseverity, and validates them (400 on bad values).unowned,dateField,severity, domain), so a drill-down lists exactly what its group counts.offsetpaging keeps working, so the current UI onmainis unaffected by the backend commit alone.How to review
TestCaseResolutionStatusResource→TestCaseResolutionStatusRepository→TimeSeriesDAOs(SQL) →ListFilter→IncidentGroupsIT. The schematestCaseIncidentGroup.jsongains response-only fields, and its TS model is regenerated.components/observability/IncidentManager/IncidentGroups/: the view, its hooks (useIncidentGroups,useIncidentGroupIncidents,useIncidentGroupBulkUpdate), filters, table, drawer, drill-down, bulk modals; query keys inrest/queries/incidentGroupsQuery.ts.components/IncidentManager/: shared inline actions (IncidentManager.utils.ts); the retired flat-list filter code is removed.openmetadata-ui-core-components:DateRangePickerandFilterSelecttake asizeon the Select scale.locale/languages/*.json: new plural keys, translated in all 20 locales.playwright/e2e/Features/AIMode/IncidentGroups.spec.tsandplaywright/utils/incidentGroups.ts.Type of change:
High-level design:
TimeSeriesDAOs, with the total fromCOUNT(*) OVER ()and the top 5 related tables and test definitions per group ranked in SQL (ROW_NUMBER()). Assignees are resolved as users, then teams, in one lookup per page.ListFilter.testCaseInDomainConditionfollows inheritance. A level counts only when every nearer level has no domain of its own.dateFieldandsortFieldare enums, severities are checked againstSeverity(ornone), and the assignee mapper accepts only users and teams.useIncidentGroupsowns the dimension, filters, sort and page, reading and writing them in the URL. The groups, a drill-down's group and a group's incidents are React Query reads (keys inrest/queries/incidentGroupsQuery.ts). A refresh cancels reads still in flight and invalidates them all; the rows on screen stay until the new ones land, and a refresh that empties the page steps back to the last one.EditStatuson test cases; incident rows read it throughuseBulkEntityPermissions.@openmetadata/ui-core-components), no antd. The assignee filter is the sharedUserTeamSelectableList(Users and Teams tabs).Tests:
Use cases covered
Unit tests
jest --coverage, limited to them; 127 suites, 1302 tests):incidentManagerAPI.ts(this PR adds request params; the uncovered lines are existing request helpers) andFilterBar.tsx(this PR only removes code from it).vitest):filter-select.test.tsx,date-range-picker.test.tsx.Backend integration tests
openmetadata-integration-tests/for new/changed API endpoints.IncidentGroupsIT: 61/61 pass on Postgres and on MySQL (-Pmysql-elasticsearch).Ingestion integration tests
Playwright (UI) tests
playwright/e2e/Features/AIMode/IncidentGroups.spec.ts(new), withTestCaseBreadcrumb.spec.tsandObservabilityLayout.spec.ts: 18/18 pass. The tests are independent and run in parallel: read-only ones share one seed, each that changes incidents seeds its own (helpers inplaywright/utils/incidentGroups.ts).Manual testing performed
/observability/incident-manager.UI screen recording / screenshots:
TODO: attach a recording.
Checklist:
Fixes <issue-number>: <short explanation>Fixes #<issue-number>above.testCaseIncidentGroup.jsonis a response schema; nothing stored changes, so no migration is needed.