From 3e9ba2d90fef7148b1b2deb5731ae585e6c9e297 Mon Sep 17 00:00:00 2001 From: Sourav Karjee Date: Thu, 27 Aug 2026 08:02:44 +0000 Subject: [PATCH] fix: parse pre-evaluation rules from Kubernetes specs Add serialization tags and correct the parser regression fixture so spec.preEvaluationRules is decoded into the internal SLO model. This keeps the PR focused on the unit-test failure that blocks PR4 CI while leaving image and generated-artifact changes out of this branch. Ticket: INF-2854 Session-Id: ef40df3f-0ac9-4787-ae8b-6ecd266e0dc2 Task-Id: 76fd5b3c-13e2-4b4a-bd25-1e4a161bb329 --- internal/k8sprometheus/spec_test.go | 44 ++++++++++++++-------------- pkg/kubernetes/api/sloth/v1/types.go | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/internal/k8sprometheus/spec_test.go b/internal/k8sprometheus/spec_test.go index 113801f2..52134ba1 100644 --- a/internal/k8sprometheus/spec_test.go +++ b/internal/k8sprometheus/spec_test.go @@ -472,19 +472,18 @@ metadata: namespace: test-ns spec: service: test-svc + preEvaluationRules: + someRule: | + sum_over_time( + ( + sum(count by (statefulset)(kube_statefulset_status_replicas_ready{namespace="prometheus-operator", statefulset=~"prometheus-prometheus-operator-prometheus.*"}>0)) + / + max(prometheus_operator_spec_shards{namespace="prometheus-operator"}))[{{.window}}:] + ) slos: - name: slo-with-subquery objective: 99 sli: - preEvaluationRules: - - name: "someRule" - expr: | - sum_over_time( - ( - sum(count by (statefulset)(kube_statefulset_status_replicas_ready{namespace="prometheus-operator", statefulset=~"prometheus-prometheus-operator-prometheus.*"}>0)) - / - max(prometheus_operator_spec_shards{namespace="prometheus-operator"}))[{{.window}}:] - ) events: errorQuery: | sum_over_time( @@ -512,29 +511,30 @@ spec: TimeWindow: 30 * 24 * time.Hour, Labels: map[string]string{}, PreEvaluationRules: map[string]string{ - "someRule": ` -sum_over_time( - ( - sum(count by (statefulset)(kube_statefulset_status_replicas_ready{namespace="prometheus-operator", statefulset=~"prometheus-prometheus-operator-prometheus.*"}>0)) - / - max(prometheus_operator_spec_shards{namespace="prometheus-operator"}))[{{.window}}:] - )`, + "someRule": `sum_over_time( +( + sum(count by (statefulset)(kube_statefulset_status_replicas_ready{namespace="prometheus-operator", statefulset=~"prometheus-prometheus-operator-prometheus.*"}>0)) + / + max(prometheus_operator_spec_shards{namespace="prometheus-operator"}))[{{.window}}:] +) +`, }, SLI: prometheus.SLI{ Events: &prometheus.SLIEvents{ - ErrorQuery: ` -sum_over_time( + ErrorQuery: `sum_over_time( ( sum(count by (statefulset)(kube_statefulset_status_replicas_ready{namespace="prometheus-operator", statefulset=~"prometheus-prometheus-operator-prometheus.*"}>0)) / max(prometheus_operator_spec_shards{namespace="prometheus-operator"}))[{{.window}}:] -)`, - TotalQuery: `sum_over_time(vector(1) [{{.window}}:])`, +) +`, + TotalQuery: `sum_over_time(vector(1) [{{.window}}:]) +`, }, }, Objective: 99, - PageAlertMeta: prometheus.AlertMeta{Disable: false}, - TicketAlertMeta: prometheus.AlertMeta{Disable: false}, + PageAlertMeta: prometheus.AlertMeta{Disable: false, Labels: map[string]string{}, Annotations: map[string]string{}}, + TicketAlertMeta: prometheus.AlertMeta{Disable: false, Labels: map[string]string{}, Annotations: map[string]string{}}, }, }}, }, diff --git a/pkg/kubernetes/api/sloth/v1/types.go b/pkg/kubernetes/api/sloth/v1/types.go index d1ad8545..9490742d 100644 --- a/pkg/kubernetes/api/sloth/v1/types.go +++ b/pkg/kubernetes/api/sloth/v1/types.go @@ -37,7 +37,7 @@ type PrometheusServiceLevelSpec struct { // RuleDependancy is a set of Prometheus RecordingRules that should // be executed before the SLO queries are, allowing for SLO defs // without subqueries - PreEvaluationRules map[string]string + PreEvaluationRules map[string]string `json:"preEvaluationRules,omitempty" yaml:"preEvaluationRules,omitempty"` // Labels are the Prometheus labels that will have all the recording // and alerting rules generated for the service SLOs.