@@ -17,6 +17,7 @@ import (
1717 "github.com/prometheus/prometheus/promql"
1818 "github.com/prometheus/prometheus/rules"
1919 "github.com/prometheus/prometheus/storage"
20+ v1 "github.com/prometheus/prometheus/web/api/v1"
2021 "github.com/weaveworks/common/httpgrpc"
2122 "github.com/weaveworks/common/user"
2223
@@ -138,15 +139,31 @@ type RulesLimits interface {
138139 RulerMaxRulesPerRuleGroup (userID string ) int
139140}
140141
141- // EngineQueryFunc returns a new query function using the rules.EngineQueryFunc function
142- // and passing an altered timestamp.
143- func EngineQueryFunc (engine * promql.Engine , q storage.Queryable , overrides RulesLimits , userID string ) rules.QueryFunc {
142+ // EngineQueryFunc returns a new engine query function by passing an altered timestamp.
143+ // Modified from Prometheus rules.EngineQueryFunc
144+ // https://github.com/prometheus/prometheus/blob/v2.39.1/rules/manager.go#L189.
145+ func EngineQueryFunc (engine v1.QueryEngine , q storage.Queryable , overrides RulesLimits , userID string ) rules.QueryFunc {
144146 return func (ctx context.Context , qs string , t time.Time ) (promql.Vector , error ) {
145- orig := rules .EngineQueryFunc (engine , q )
146- // Delay the evaluation of all rules by a set interval to give a buffer
147- // to metric that haven't been forwarded to cortex yet.
148147 evaluationDelay := overrides .EvaluationDelay (userID )
149- return orig (ctx , qs , t .Add (- evaluationDelay ))
148+ q , err := engine .NewInstantQuery (q , nil , qs , t .Add (- evaluationDelay ))
149+ if err != nil {
150+ return nil , err
151+ }
152+ res := q .Exec (ctx )
153+ if res .Err != nil {
154+ return nil , res .Err
155+ }
156+ switch v := res .Value .(type ) {
157+ case promql.Vector :
158+ return v , nil
159+ case promql.Scalar :
160+ return promql.Vector {promql.Sample {
161+ Point : promql .Point (v ),
162+ Metric : labels.Labels {},
163+ }}, nil
164+ default :
165+ return nil , errors .New ("rule result is not a vector or scalar" )
166+ }
150167 }
151168}
152169
@@ -227,7 +244,7 @@ type RulesManager interface {
227244// ManagerFactory is a function that creates new RulesManager for given user and notifier.Manager.
228245type ManagerFactory func (ctx context.Context , userID string , notifier * notifier.Manager , logger log.Logger , reg prometheus.Registerer ) RulesManager
229246
230- func DefaultTenantManagerFactory (cfg Config , p Pusher , q storage.Queryable , engine * promql. Engine , overrides RulesLimits , reg prometheus.Registerer ) ManagerFactory {
247+ func DefaultTenantManagerFactory (cfg Config , p Pusher , q storage.Queryable , engine v1. QueryEngine , overrides RulesLimits , reg prometheus.Registerer ) ManagerFactory {
231248 totalWrites := promauto .With (reg ).NewCounter (prometheus.CounterOpts {
232249 Name : "cortex_ruler_write_requests_total" ,
233250 Help : "Number of write requests to ingesters." ,
0 commit comments