Alerting: Add Triage feature toggle (#110326)

* Add state history config to frontend config object

* Add alertingTriage feature toggle

* Add Triage menu entry

* Add old state history config props for backward compatibility
This commit is contained in:
Konrad Lalik
2025-09-01 11:33:33 +02:00
committed by GitHub
parent f09f77ced4
commit 31114fb47c
13 changed files with 108 additions and 16 deletions
+15 -5
View File
@@ -93,12 +93,22 @@ type FrontendSettingsAnalyticsDTO struct {
Enabled bool `json:"enabled"`
}
type FrontendSettingsUnifiedAlertingStateHistoryDTO struct {
Backend string `json:"backend,omitempty"`
Primary string `json:"primary,omitempty"`
PrometheusTargetDatasourceUID string `json:"prometheusTargetDatasourceUID,omitempty"`
PrometheusMetricName string `json:"prometheusMetricName,omitempty"`
}
type FrontendSettingsUnifiedAlertingDTO struct {
MinInterval string `json:"minInterval"`
AlertStateHistoryBackend string `json:"alertStateHistoryBackend,omitempty"`
AlertStateHistoryPrimary string `json:"alertStateHistoryPrimary,omitempty"`
RecordingRulesEnabled bool `json:"recordingRulesEnabled"`
DefaultRecordingRulesTargetDatasourceUID string `json:"defaultRecordingRulesTargetDatasourceUID,omitempty"`
MinInterval string `json:"minInterval"`
StateHistory *FrontendSettingsUnifiedAlertingStateHistoryDTO `json:"stateHistory,omitempty"`
RecordingRulesEnabled bool `json:"recordingRulesEnabled"`
DefaultRecordingRulesTargetDatasourceUID string `json:"defaultRecordingRulesTargetDatasourceUID,omitempty"`
// Backward compatibility fields - deprecated
AlertStateHistoryBackend string `json:"alertStateHistoryBackend,omitempty"`
AlertStateHistoryPrimary string `json:"alertStateHistoryPrimary,omitempty"`
}
// Enterprise-only
+12
View File
@@ -348,6 +348,18 @@ func (hs *HTTPServer) getFrontendSettings(c *contextmodel.ReqContext) (*dtos.Fro
}
if hs.Cfg.UnifiedAlerting.StateHistory.Enabled {
frontendSettings.UnifiedAlerting.StateHistory = &dtos.FrontendSettingsUnifiedAlertingStateHistoryDTO{
Backend: hs.Cfg.UnifiedAlerting.StateHistory.Backend,
Primary: hs.Cfg.UnifiedAlerting.StateHistory.MultiPrimary,
}
if hs.Cfg.UnifiedAlerting.StateHistory.PrometheusTargetDatasourceUID != "" {
frontendSettings.UnifiedAlerting.StateHistory.PrometheusTargetDatasourceUID = hs.Cfg.UnifiedAlerting.StateHistory.PrometheusTargetDatasourceUID
}
if hs.Cfg.UnifiedAlerting.StateHistory.PrometheusMetricName != "" {
frontendSettings.UnifiedAlerting.StateHistory.PrometheusMetricName = hs.Cfg.UnifiedAlerting.StateHistory.PrometheusMetricName
}
// Populate deprecated fields for backward compatibility
frontendSettings.UnifiedAlerting.AlertStateHistoryBackend = hs.Cfg.UnifiedAlerting.StateHistory.Backend
frontendSettings.UnifiedAlerting.AlertStateHistoryPrimary = hs.Cfg.UnifiedAlerting.StateHistory.MultiPrimary
}
+10
View File
@@ -1918,6 +1918,16 @@ var (
Owner: grafanaFrontendSearchNavOrganise,
Expression: "false",
},
{
Name: "alertingTriage",
Description: "Enables the alerting triage feature",
Stage: FeatureStageExperimental,
FrontendOnly: true,
Owner: grafanaAlertingSquad,
HideFromDocs: true,
HideFromAdminPage: true,
Expression: "false",
},
}
)
+1
View File
@@ -247,3 +247,4 @@ newLogContext,experimental,@grafana/observability-logs,false,false,true
newClickhouseConfigPageDesign,privatePreview,@grafana/partner-datasources,false,false,false
unifiedStorageSearchAfterWriteExperimentalAPI,experimental,@grafana/search-and-storage,false,true,false
teamFolders,experimental,@grafana/grafana-search-navigate-organise,false,false,false
alertingTriage,experimental,@grafana/alerting-squad,false,false,true
1 Name Stage Owner requiresDevMode RequiresRestart FrontendOnly
247 newClickhouseConfigPageDesign privatePreview @grafana/partner-datasources false false false
248 unifiedStorageSearchAfterWriteExperimentalAPI experimental @grafana/search-and-storage false true false
249 teamFolders experimental @grafana/grafana-search-navigate-organise false false false
250 alertingTriage experimental @grafana/alerting-squad false false true
+4
View File
@@ -998,4 +998,8 @@ const (
// FlagTeamFolders
// Enables team folders functionality
FlagTeamFolders = "teamFolders"
// FlagAlertingTriage
// Enables the alerting triage feature
FlagAlertingTriage = "alertingTriage"
)
+16
View File
@@ -515,6 +515,22 @@
"codeowner": "@grafana/alerting-squad"
}
},
{
"metadata": {
"name": "alertingTriage",
"resourceVersion": "1756386724059",
"creationTimestamp": "2025-08-28T13:12:04Z"
},
"spec": {
"description": "Enables the alerting triage feature",
"stage": "experimental",
"codeowner": "@grafana/alerting-squad",
"frontend": true,
"hideFromAdminPage": true,
"hideFromDocs": true,
"expression": "false"
}
},
{
"metadata": {
"name": "alertingUIOptimizeReducer",
@@ -428,6 +428,14 @@ func (s *ServiceImpl) buildAlertNavLinks(c *contextmodel.ReqContext) *navtree.Na
hasAccess := ac.HasAccess(s.accessControl, c)
var alertChildNavs []*navtree.NavLink
if s.features.IsEnabled(c.Req.Context(), featuremgmt.FlagAlertingTriage) {
if hasAccess(ac.EvalAny(ac.EvalPermission(ac.ActionAlertingRuleRead), ac.EvalPermission(ac.ActionAlertingRuleExternalRead))) {
alertChildNavs = append(alertChildNavs, &navtree.NavLink{
Text: "Triage", SubTitle: "Triage alerts", Id: "alert-triage", Url: s.cfg.AppSubURL + "/alerting/triage", Icon: "medkit",
})
}
}
if hasAccess(ac.EvalAny(ac.EvalPermission(ac.ActionAlertingRuleRead), ac.EvalPermission(ac.ActionAlertingRuleExternalRead))) {
alertChildNavs = append(alertChildNavs, &navtree.NavLink{
Text: "Alert rules", SubTitle: "Rules that determine whether an alert will fire", Id: "alert-list", Url: s.cfg.AppSubURL + "/alerting/list", Icon: "list-ul",