Alerting: Metric to count imported from Prometheus rules (#100847)

This commit is contained in:
Alexander Akhmetov
2025-03-05 14:02:28 +01:00
committed by GitHub
parent 2638de6aeb
commit d44728f4e5
9 changed files with 161 additions and 22 deletions
+8 -9
View File
@@ -397,19 +397,18 @@ func WithoutInternalLabels() LabelOption {
}
func (alertRule *AlertRule) ImportedFromPrometheus() bool {
if alertRule.Metadata.PrometheusStyleRule == nil {
return false
}
return alertRule.Metadata.PrometheusStyleRule.OriginalRuleDefinition != ""
_, err := alertRule.PrometheusRuleDefinition()
return err == nil
}
func (alertRule *AlertRule) PrometheusRuleDefinition() string {
if !alertRule.ImportedFromPrometheus() {
return ""
func (alertRule *AlertRule) PrometheusRuleDefinition() (string, error) {
if alertRule.Metadata.PrometheusStyleRule != nil {
if alertRule.Metadata.PrometheusStyleRule.OriginalRuleDefinition != "" {
return alertRule.Metadata.PrometheusStyleRule.OriginalRuleDefinition, nil
}
}
return alertRule.Metadata.PrometheusStyleRule.OriginalRuleDefinition
return "", fmt.Errorf("prometheus rule definition is missing")
}
// GetLabels returns the labels specified as part of the alert rule.
@@ -1017,3 +1017,70 @@ func TestGeneratorFillsAllFields(t *testing.T) {
require.FailNow(t, "AlertRule generator does not populate fields", "skipped fields: %v", maps.Keys(fields))
}
func TestAlertRule_PrometheusRuleDefinition(t *testing.T) {
tests := []struct {
name string
rule AlertRule
expectedResult string
expectedErrorMsg string
}{
{
name: "rule with prometheus definition",
rule: AlertRule{
Metadata: AlertRuleMetadata{
PrometheusStyleRule: &PrometheusStyleRule{
OriginalRuleDefinition: "groups:\n- name: example\n rules:\n - alert: HighRequestLatency\n expr: request_latency_seconds{job=\"myjob\"} > 0.5\n for: 10m\n labels:\n severity: page\n annotations:\n summary: High request latency",
},
},
},
expectedResult: "groups:\n- name: example\n rules:\n - alert: HighRequestLatency\n expr: request_latency_seconds{job=\"myjob\"} > 0.5\n for: 10m\n labels:\n severity: page\n annotations:\n summary: High request latency",
expectedErrorMsg: "",
},
{
name: "rule with empty prometheus definition",
rule: AlertRule{
Metadata: AlertRuleMetadata{
PrometheusStyleRule: &PrometheusStyleRule{
OriginalRuleDefinition: "",
},
},
},
expectedResult: "",
expectedErrorMsg: "prometheus rule definition is missing",
},
{
name: "rule with nil prometheus style rule",
rule: AlertRule{
Metadata: AlertRuleMetadata{
PrometheusStyleRule: nil,
},
},
expectedResult: "",
expectedErrorMsg: "prometheus rule definition is missing",
},
{
name: "rule with empty metadata",
rule: AlertRule{},
expectedResult: "",
expectedErrorMsg: "prometheus rule definition is missing",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result, err := tt.rule.PrometheusRuleDefinition()
isPrometheusRule := tt.rule.ImportedFromPrometheus()
if tt.expectedErrorMsg != "" {
require.Error(t, err)
require.Equal(t, tt.expectedErrorMsg, err.Error())
require.False(t, isPrometheusRule)
} else {
require.NoError(t, err)
require.Equal(t, tt.expectedResult, result)
require.True(t, isPrometheusRule)
}
})
}
}