Skip to content

Commit aca4d93

Browse files
committed
Add rule information to query paramters sent to the QFE
Signed-off-by: SungJin1212 <[email protected]>
1 parent 20775d7 commit aca4d93

File tree

7 files changed

+36
-13
lines changed

7 files changed

+36
-13
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* [FEATURE] Querier/Ruler: Add `query_partial_data` and `rules_partial_data` limits to allow queries/rules to be evaluated with data from a single zone, if other zones are not available. #6526
77
* [FEATURE] Update prometheus alertmanager version to v0.28.0 and add new integration msteamsv2, jira, and rocketchat. #6590
88
* [FEATURE] Ingester: Add a `-ingester.enable-ooo-native-histograms` flag to enable out-of-order native histogram ingestion per tenant. It only takes effect when `-blocks-storage.tsdb.enable-native-histograms=true` and `-ingester.out-of-order-time-window` > 0. It is applied after the restart if it is changed at runtime through the runtime config. #6626
9+
* [ENHANCEMENT] Ruler: Add rule information (group name, namespace, name, and kind) to query parameters sent to the Query Frontend to leave rule information logs on query stats. #6539
910
* [ENHANCEMENT] Alertmanager: Add new limits `-alertmanager.max-silences-count` and `-alertmanager.max-silences-size-bytes` for limiting silences per tenant. #6605
1011
* [ENHANCEMENT] Update prometheus version to v3.1.0. #6583
1112
* [ENHANCEMENT] Add `compactor.auto-forget-delay` for compactor to auto forget compactors after X minutes without heartbeat. #6533

docs/configuration/config-file-reference.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -4854,7 +4854,9 @@ ring:
48544854
[disabled_tenants: <string> | default = ""]
48554855

48564856
# Report query statistics for ruler queries to complete as a per user metric and
4857-
# as an info level log message.
4857+
# as an info level log message. It works only when the -ruler.frontend-address
4858+
# is not configured. When -ruler.frontend-address enabled, the Query Frontend
4859+
# tracks query statistics logs and metrics.
48584860
# CLI flag: -ruler.query-stats-enabled
48594861
[query_stats_enabled: <boolean> | default = false]
48604862

pkg/ruler/compat.go

+18-3
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,20 @@ func EngineQueryFunc(engine promql.QueryEngine, frontendClient *frontendClient,
184184
}
185185

186186
if frontendClient != nil {
187-
v, err := frontendClient.InstantQuery(ctx, qs, t)
187+
// query parameters sent to the Query Frontend to leave rule information logs on query stats
188+
queryParams := map[string]string{}
189+
190+
if origin := ctx.Value(promql.QueryOrigin{}); origin != nil {
191+
queryLabels := origin.(map[string]interface{})
192+
rgMap := queryLabels["ruleGroup"].(map[string]string)
193+
queryParams["rule_group"] = rgMap["name"]
194+
queryParams["rule_namespace"] = rgMap["file"]
195+
}
196+
ruleDetail := rules.FromOriginContext(ctx)
197+
queryParams["rule"] = ruleDetail.Name
198+
queryParams["rule_kind"] = ruleDetail.Kind
199+
200+
v, err := frontendClient.InstantQuery(ctx, qs, t, queryParams)
188201
if err != nil {
189202
return nil, err
190203
}
@@ -333,7 +346,9 @@ func DefaultTenantManagerFactory(cfg Config, p Pusher, q storage.Queryable, engi
333346
totalWrites := evalMetrics.TotalWritesVec.WithLabelValues(userID)
334347
failedWrites := evalMetrics.FailedWritesVec.WithLabelValues(userID)
335348

336-
if cfg.FrontendAddress != "" {
349+
shouldEvalFromQFE := cfg.FrontendAddress != ""
350+
if shouldEvalFromQFE {
351+
// evaluate rules via Query-Frontend
337352
c, err := frontendPool.GetClientFor(cfg.FrontendAddress)
338353
if err != nil {
339354
return nil, err
@@ -343,7 +358,7 @@ func DefaultTenantManagerFactory(cfg Config, p Pusher, q storage.Queryable, engi
343358
var queryFunc rules.QueryFunc
344359
engineQueryFunc := EngineQueryFunc(engine, client, q, overrides, userID, cfg.LookbackDelta)
345360
metricsQueryFunc := MetricsQueryFunc(engineQueryFunc, totalQueries, failedQueries)
346-
if cfg.EnableQueryStats {
361+
if cfg.EnableQueryStats && !shouldEvalFromQFE {
347362
queryFunc = RecordAndReportRuleQueryMetrics(metricsQueryFunc, userID, evalMetrics, logger)
348363
} else {
349364
queryFunc = metricsQueryFunc

pkg/ruler/frontend_client.go

+8-3
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,17 @@ func NewFrontendClient(client httpgrpc.HTTPClient, timeout time.Duration, promet
4949
}
5050
}
5151

52-
func (p *FrontendClient) makeRequest(ctx context.Context, qs string, ts time.Time) (*httpgrpc.HTTPRequest, error) {
52+
func (p *FrontendClient) makeRequest(ctx context.Context, qs string, ts time.Time, queryParams map[string]string) (*httpgrpc.HTTPRequest, error) {
5353
args := make(url.Values)
5454
args.Set("query", qs)
5555
if !ts.IsZero() {
5656
args.Set("time", ts.Format(time.RFC3339Nano))
5757
}
58+
// set query parameters sent to the Query Frontend to leave rule information logs on query stats
59+
for k, v := range queryParams {
60+
args.Set(k, v)
61+
}
62+
5863
body := []byte(args.Encode())
5964

6065
//lint:ignore faillint wrapper around upstream method
@@ -87,11 +92,11 @@ func (p *FrontendClient) makeRequest(ctx context.Context, qs string, ts time.Tim
8792
return req, nil
8893
}
8994

90-
func (p *FrontendClient) InstantQuery(ctx context.Context, qs string, t time.Time) (promql.Vector, error) {
95+
func (p *FrontendClient) InstantQuery(ctx context.Context, qs string, t time.Time, queryParams map[string]string) (promql.Vector, error) {
9196
log, ctx := spanlogger.New(ctx, "FrontendClient.InstantQuery")
9297
defer log.Span.Finish()
9398

94-
req, err := p.makeRequest(ctx, qs, t)
99+
req, err := p.makeRequest(ctx, qs, t, queryParams)
95100
if err != nil {
96101
level.Error(log).Log("err", err, "query", qs)
97102
return nil, err

pkg/ruler/frontend_client_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func TestTimeout(t *testing.T) {
3232
ctx := context.Background()
3333
ctx = user.InjectOrgID(ctx, "userID")
3434
frontendClient := NewFrontendClient(mockHTTPGRPCClient(mockClientFn), time.Second*5, "/prometheus", "json")
35-
_, err := frontendClient.InstantQuery(ctx, "query", time.Now())
35+
_, err := frontendClient.InstantQuery(ctx, "query", time.Now(), nil)
3636
require.Equal(t, context.DeadlineExceeded, err)
3737
}
3838

@@ -41,7 +41,7 @@ func TestNoOrgId(t *testing.T) {
4141
return nil, nil
4242
}
4343
frontendClient := NewFrontendClient(mockHTTPGRPCClient(mockClientFn), time.Second*5, "/prometheus", "json")
44-
_, err := frontendClient.InstantQuery(context.Background(), "query", time.Now())
44+
_, err := frontendClient.InstantQuery(context.Background(), "query", time.Now(), nil)
4545
require.Equal(t, user.ErrNoOrgID, err)
4646
}
4747

@@ -152,7 +152,7 @@ func TestInstantQueryJsonCodec(t *testing.T) {
152152
ctx := context.Background()
153153
ctx = user.InjectOrgID(ctx, "userID")
154154
frontendClient := NewFrontendClient(mockHTTPGRPCClient(mockClientFn), time.Second*5, "/prometheus", "json")
155-
vector, err := frontendClient.InstantQuery(ctx, "query", time.Now())
155+
vector, err := frontendClient.InstantQuery(ctx, "query", time.Now(), nil)
156156
require.Equal(t, test.expected, vector)
157157
require.Equal(t, test.expectedErr, err)
158158
})
@@ -301,7 +301,7 @@ func TestInstantQueryProtoCodec(t *testing.T) {
301301
ctx := context.Background()
302302
ctx = user.InjectOrgID(ctx, "userID")
303303
frontendClient := NewFrontendClient(mockHTTPGRPCClient(mockClientFn), time.Second*5, "/prometheus", "protobuf")
304-
vector, err := frontendClient.InstantQuery(ctx, "query", time.Now())
304+
vector, err := frontendClient.InstantQuery(ctx, "query", time.Now(), nil)
305305
require.Equal(t, test.expected, vector)
306306
require.Equal(t, test.expectedErr, err)
307307
})

pkg/ruler/manager_metrics.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ func NewRuleEvalMetrics(cfg Config, reg prometheus.Registerer) *RuleEvalMetrics
255255
Help: "Number of failed queries by ruler.",
256256
}, []string{"user"}),
257257
}
258-
if cfg.EnableQueryStats {
258+
if cfg.EnableQueryStats && cfg.FrontendAddress == "" {
259259
m.RulerQuerySeconds = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{
260260
Name: "cortex_ruler_query_seconds_total",
261261
Help: "Total amount of wall clock time spent processing queries by the ruler.",

pkg/ruler/ruler.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
249249
f.Var(&cfg.EnabledTenants, "ruler.enabled-tenants", "Comma separated list of tenants whose rules this ruler can evaluate. If specified, only these tenants will be handled by ruler, otherwise this ruler can process rules from all tenants. Subject to sharding.")
250250
f.Var(&cfg.DisabledTenants, "ruler.disabled-tenants", "Comma separated list of tenants whose rules this ruler cannot evaluate. If specified, a ruler that would normally pick the specified tenant(s) for processing will ignore them instead. Subject to sharding.")
251251

252-
f.BoolVar(&cfg.EnableQueryStats, "ruler.query-stats-enabled", false, "Report query statistics for ruler queries to complete as a per user metric and as an info level log message.")
252+
f.BoolVar(&cfg.EnableQueryStats, "ruler.query-stats-enabled", false, "Report query statistics for ruler queries to complete as a per user metric and as an info level log message. It works only when the -ruler.frontend-address is not configured. When -ruler.frontend-address enabled, the Query Frontend tracks query statistics logs and metrics.")
253253
f.BoolVar(&cfg.DisableRuleGroupLabel, "ruler.disable-rule-group-label", false, "Disable the rule_group label on exported metrics")
254254

255255
f.BoolVar(&cfg.EnableHAEvaluation, "ruler.enable-ha-evaluation", false, "Enable high availability")

0 commit comments

Comments
 (0)