Add optional DashboardView to analytics_dashboard.json schema
What does this MR do and why?
Summary
This change adds support for tabbed views within analytics dashboards. Previously, a dashboard could only display a single flat list of panels. Now, a dashboard can optionally define multiple named views (e.g., "Overview" and "Details"), each with its own set of panels. Users can switch between views using tabs that appear in the dashboard's filter bar, and the grid updates to show only the panels belonging to the selected view. The JSON schema for dashboards has been updated to formally allow this new views structure.
References
Screenshots or screen recordings
How to set up and validate locally
The change isn't user-facing at this point. You can test the tabbed functionality by applying this diff and navigating to the Explore > Analytics dashboards > Engineering Intelligence dashboard
Diff
diff --git a/ee/lib/gitlab/analytics/dashboards/system/engineering_intelligence.yaml b/ee/lib/gitlab/analytics/dashboards/system/engineering_intelligence.yaml
index 9f966ba4caef..b69251090a92 100644
--- a/ee/lib/gitlab/analytics/dashboards/system/engineering_intelligence.yaml
+++ b/ee/lib/gitlab/analytics/dashboards/system/engineering_intelligence.yaml
@@ -3,313 +3,320 @@ title: Engineering Intelligence
description: Track engineering velocity, pipeline health, and AI-assisted development.
version: '2'
status: experiment
-panels:
-- title: "Total Code Suggestions (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: stat
- mode: analytics
- query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
- metrics: totalCount as "Total"
- gridAttributes:
- yPos: 0
- xPos: 0
- width: 3
- height: 1
-- title: "Code Suggestion Acceptance Rate (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: stat
- mode: analytics
- query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
- metrics: acceptanceRate as "Acceptance Rate"
- gridAttributes:
- yPos: 0
- xPos: 3
- width: 3
- height: 1
-- title: "Total Pipelines (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: stat
- mode: analytics
- query: type = Pipeline and group = "gitlab-org" and finished >= -30d
- metrics: totalCount as "Total"
- gridAttributes:
- yPos: 0
- xPos: 6
- width: 3
- height: 1
-- title: "Pipeline Success Rate (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: stat
- mode: analytics
- query: type = Pipeline and group = "gitlab-org" and finished >= -30d
- metrics: successRate as "Success Rate"
- gridAttributes:
- yPos: 0
- xPos: 9
- width: 3
- height: 1
-- title: "Code Suggestions by language (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: columnChart
- mode: analytics
- query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
- dimensions: language as "Language"
- metrics: totalCount as "Total", acceptanceRate as "Acceptance Rate"
- sort: totalCount desc
- gridAttributes:
- yPos: 1
- xPos: 0
- width: 6
- height: 4
-- title: "Code Suggestions by IDE (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: columnChart
- mode: analytics
- query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
- dimensions: ideName as "IDE"
- metrics: totalCount as "Total"
- sort: totalCount desc
- gridAttributes:
- yPos: 1
- xPos: 6
- width: 6
- height: 4
-- title: "Code Suggestions usage trend (90d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: lineChart
- mode: analytics
- query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -90d
- dimensions: timestamp as "Date"
- metrics: totalCount as "Total", acceptedCount as "Accepted"
- gridAttributes:
- yPos: 5
- xPos: 0
- width: 12
- height: 4
-- title: "Pipeline health overview (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: table
- mode: analytics
- query: type = Pipeline and group = "gitlab-org" and finished >= -30d
- metrics: totalCount as "Total", successRate as "Success Rate", failureRate as "Failure Rate", canceledRate as "Canceled Rate", durationQuantile as "p95 Duration (s)"
- gridAttributes:
- yPos: 9
- xPos: 0
- width: 12
- height: 3
-- title: "Pipeline outcomes by ref (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: columnChart
- mode: analytics
- query: type = Pipeline and group = "gitlab-org" and finished >= -30d
- dimensions: ref as "Ref"
- metrics: totalCount as "Total", successRate as "Success Rate", failureRate as "Failure Rate"
- sort: totalCount desc
- limit: 10
- gridAttributes:
- yPos: 12
- xPos: 0
- width: 6
- height: 4
-- title: "Pipeline duration trend (90d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: lineChart
- mode: analytics
- query: type = Pipeline and group = "gitlab-org" and finished >= -90d
- dimensions: finished as "Week"
- metrics: totalCount as "Total", durationQuantile as "p95 Duration (s)"
- gridAttributes:
- yPos: 12
- xPos: 6
- width: 6
- height: 4
-- title: "Code Suggestions by user (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: table
- mode: analytics
- query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
- dimensions: user as "User"
- metrics: totalCount as "Total", acceptedCount as "Accepted", acceptanceRate as "Acceptance Rate"
- sort: totalCount desc
- limit: 10
- gridAttributes:
- yPos: 16
- xPos: 0
- width: 12
- height: 3
-- title: "Code Suggestions acceptance rate trend (90d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: lineChart
- mode: analytics
- query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -90d
- dimensions: timestamp as "Date"
- metrics: acceptanceRate as "Acceptance Rate"
- gridAttributes:
- yPos: 19
- xPos: 0
- width: 6
- height: 4
-- title: "Pipeline outcomes by status (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: columnChart
- mode: analytics
- query: type = Pipeline and group = "gitlab-org" and finished >= -30d
- dimensions: status as "Status"
- metrics: totalCount as "Total"
- sort: totalCount desc
- gridAttributes:
- yPos: 19
- xPos: 6
- width: 6
- height: 4
-- title: "Pipeline outcomes by source (30d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: table
- mode: analytics
- query: type = Pipeline and group = "gitlab-org" and finished >= -30d
- dimensions: source as "Source"
- metrics: totalCount as "Total", successRate as "Success Rate", failureRate as "Failure Rate"
- sort: totalCount desc
- gridAttributes:
- yPos: 23
- xPos: 0
- width: 12
- height: 3
-- title: "Recently merged merge requests"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: table
- query: type = MergeRequest and group = "gitlab-org" and state = merged
- fields: title, author, mergedAt, labels
- sort: mergedAt desc
- limit: 10
- gridAttributes:
- yPos: 26
- xPos: 0
- width: 6
- height: 3
-- title: "Open merge requests by age"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: table
- query: type = MergeRequest and group = "gitlab-org" and state = opened
- fields: title, author, assignee, createdAt, labels
- sort: createdAt asc
- limit: 10
- gridAttributes:
- yPos: 26
- xPos: 6
- width: 6
- height: 3
-- title: "Pipeline status distribution over time (90d)"
- visualization:
- type: Glql
- options: {}
- data:
- type: glql
- query:
- glql: |
- display: columnChart
- mode: analytics
- query: type = Pipeline and group = "gitlab-org" and finished >= -90d
- dimensions: finished as "Week", status as "Status"
- metrics: totalCount as "Total"
- gridAttributes:
- yPos: 29
- xPos: 0
- width: 12
- height: 4
+panels: []
+views:
+ - title: Overview
+ panels:
+ - title: "Total Code Suggestions (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: stat
+ mode: analytics
+ query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
+ metrics: totalCount as "Total"
+ gridAttributes:
+ yPos: 0
+ xPos: 0
+ width: 3
+ height: 1
+ - title: "Code Suggestion Acceptance Rate (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: stat
+ mode: analytics
+ query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
+ metrics: acceptanceRate as "Acceptance Rate"
+ gridAttributes:
+ yPos: 0
+ xPos: 3
+ width: 3
+ height: 1
+ - title: "Total Pipelines (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: stat
+ mode: analytics
+ query: type = Pipeline and group = "gitlab-org" and finished >= -30d
+ metrics: totalCount as "Total"
+ gridAttributes:
+ yPos: 0
+ xPos: 6
+ width: 3
+ height: 1
+ - title: "Pipeline Success Rate (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: stat
+ mode: analytics
+ query: type = Pipeline and group = "gitlab-org" and finished >= -30d
+ metrics: successRate as "Success Rate"
+ gridAttributes:
+ yPos: 0
+ xPos: 9
+ width: 3
+ height: 1
+ - title: AI Impact
+ panels:
+ - title: "Code Suggestions by language (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: columnChart
+ mode: analytics
+ query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
+ dimensions: language as "Language"
+ metrics: totalCount as "Total", acceptanceRate as "Acceptance Rate"
+ sort: totalCount desc
+ gridAttributes:
+ yPos: 1
+ xPos: 0
+ width: 6
+ height: 4
+ - title: "Code Suggestions by IDE (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: columnChart
+ mode: analytics
+ query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
+ dimensions: ideName as "IDE"
+ metrics: totalCount as "Total"
+ sort: totalCount desc
+ gridAttributes:
+ yPos: 1
+ xPos: 6
+ width: 6
+ height: 4
+ - title: "Code Suggestions usage trend (90d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: lineChart
+ mode: analytics
+ query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -90d
+ dimensions: timestamp as "Date"
+ metrics: totalCount as "Total", acceptedCount as "Accepted"
+ gridAttributes:
+ yPos: 5
+ xPos: 0
+ width: 12
+ height: 4
+ - title: DORA & Delivery
+ panels:
+ - title: "Pipeline health overview (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: table
+ mode: analytics
+ query: type = Pipeline and group = "gitlab-org" and finished >= -30d
+ metrics: totalCount as "Total", successRate as "Success Rate", failureRate as "Failure Rate", canceledRate as "Canceled Rate", durationQuantile as "p95 Duration (s)"
+ gridAttributes:
+ yPos: 9
+ xPos: 0
+ width: 12
+ height: 3
+ - title: "Pipeline outcomes by ref (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: columnChart
+ mode: analytics
+ query: type = Pipeline and group = "gitlab-org" and finished >= -30d
+ dimensions: ref as "Ref"
+ metrics: totalCount as "Total", successRate as "Success Rate", failureRate as "Failure Rate"
+ sort: totalCount desc
+ limit: 10
+ gridAttributes:
+ yPos: 12
+ xPos: 0
+ width: 6
+ height: 4
+ - title: "Pipeline duration trend (90d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: lineChart
+ mode: analytics
+ query: type = Pipeline and group = "gitlab-org" and finished >= -90d
+ dimensions: finished as "Week"
+ metrics: totalCount as "Total", durationQuantile as "p95 Duration (s)"
+ gridAttributes:
+ yPos: 12
+ xPos: 6
+ width: 6
+ height: 4
+ - title: "Code Suggestions by user (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: table
+ mode: analytics
+ query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -30d
+ dimensions: user as "User"
+ metrics: totalCount as "Total", acceptedCount as "Accepted", acceptanceRate as "Acceptance Rate"
+ sort: totalCount desc
+ limit: 10
+ gridAttributes:
+ yPos: 16
+ xPos: 0
+ width: 12
+ height: 3
+ - title: "Code Suggestions acceptance rate trend (90d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: lineChart
+ mode: analytics
+ query: type = CodeSuggestion and group = "gitlab-org" and timestamp >= -90d
+ dimensions: timestamp as "Date"
+ metrics: acceptanceRate as "Acceptance Rate"
+ gridAttributes:
+ yPos: 19
+ xPos: 0
+ width: 6
+ height: 4
+ - title: "Pipeline outcomes by status (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: columnChart
+ mode: analytics
+ query: type = Pipeline and group = "gitlab-org" and finished >= -30d
+ dimensions: status as "Status"
+ metrics: totalCount as "Total"
+ sort: totalCount desc
+ gridAttributes:
+ yPos: 19
+ xPos: 6
+ width: 6
+ height: 4
+ - title: "Pipeline outcomes by source (30d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: table
+ mode: analytics
+ query: type = Pipeline and group = "gitlab-org" and finished >= -30d
+ dimensions: source as "Source"
+ metrics: totalCount as "Total", successRate as "Success Rate", failureRate as "Failure Rate"
+ sort: totalCount desc
+ gridAttributes:
+ yPos: 23
+ xPos: 0
+ width: 12
+ height: 3
+ - title: "Recently merged merge requests"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: table
+ query: type = MergeRequest and group = "gitlab-org" and state = merged
+ fields: title, author, mergedAt, labels
+ sort: mergedAt desc
+ limit: 10
+ gridAttributes:
+ yPos: 26
+ xPos: 0
+ width: 6
+ height: 3
+ - title: "Open merge requests by age"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: table
+ query: type = MergeRequest and group = "gitlab-org" and state = opened
+ fields: title, author, assignee, createdAt, labels
+ sort: createdAt asc
+ limit: 10
+ gridAttributes:
+ yPos: 26
+ xPos: 6
+ width: 6
+ height: 3
+ - title: "Pipeline status distribution over time (90d)"
+ visualization:
+ type: Glql
+ options: {}
+ data:
+ type: glql
+ query:
+ glql: |
+ display: columnChart
+ mode: analytics
+ query: type = Pipeline and group = "gitlab-org" and finished >= -90d
+ dimensions: finished as "Week", status as "Status"
+ metrics: totalCount as "Total"
+ gridAttributes:
+ yPos: 29
+ xPos: 0
+ width: 12
+ height: 4MR acceptance checklist
Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.
Related to #605890 (closed)
