Files
grafana/pkg/services/ngalert/prom/models.go
T
Alexander Akhmetov f969eb0277 Alerting: Add rule group name validation to the Prometheus conversion API (#108740)
Alerting: Add rule group name validation to the conversion API
2025-07-28 11:44:17 +02:00

56 lines
1.9 KiB
Go

package prom
import (
prommodel "github.com/prometheus/common/model"
"github.com/grafana/grafana/pkg/apimachinery/errutil"
)
var (
errPrometheusRuleGroupValidationFailedMsg = "{{.Public.Message}}"
ErrPrometheusRuleGroupValidationFailed = errutil.ValidationFailed("alerting.prometheusRuleGroupInvalid").MustTemplate(errPrometheusRuleGroupValidationFailedMsg, errutil.WithPublic(errPrometheusRuleGroupValidationFailedMsg))
)
func errPrometheusRuleGroupValidationFailed(message string) error {
return ErrPrometheusRuleGroupValidationFailed.Build(errutil.TemplateData{Public: map[string]any{"Message": message}})
}
type PrometheusRulesFile struct {
Groups []PrometheusRuleGroup `yaml:"groups"`
}
type PrometheusRuleGroup struct {
Name string `yaml:"name"`
Interval prommodel.Duration `yaml:"interval"`
QueryOffset *prommodel.Duration `yaml:"query_offset,omitempty"`
Limit int `yaml:"limit,omitempty"`
Rules []PrometheusRule `yaml:"rules"`
Labels map[string]string `yaml:"labels,omitempty"`
}
func (g *PrometheusRuleGroup) Validate() error {
if g.Name == "" {
return errPrometheusRuleGroupValidationFailed("rule group name must not be empty")
}
if g.Limit != 0 {
return errPrometheusRuleGroupValidationFailed("limit is not supported")
}
if g.QueryOffset != nil && *g.QueryOffset < prommodel.Duration(0) {
return errPrometheusRuleGroupValidationFailed("query_offset must be >= 0")
}
return nil
}
type PrometheusRule struct {
Alert string `yaml:"alert,omitempty"`
Expr string `yaml:"expr,omitempty"`
For *prommodel.Duration `yaml:"for,omitempty"`
KeepFiringFor *prommodel.Duration `yaml:"keep_firing_for,omitempty"`
Labels map[string]string `yaml:"labels,omitempty"`
Annotations map[string]string `yaml:"annotations,omitempty"`
Record string `yaml:"record,omitempty"`
}