Skip to content

Commit dee8817

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

File tree

7 files changed

+35
-13
lines changed

7 files changed

+35
-13
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## master / unreleased
44
* [FEATURE] Query Frontend: Add dynamic interval size for query splitting. This is enabled by configuring experimental flags `querier.max-shards-per-query` and/or `querier.max-fetched-data-duration-per-query`. The split interval size is dynamically increased to maintain a number of shards and total duration fetched below the configured values. #6458
55
* [ENHANCEMENT] Add `compactor.auto-forget-delay` for compactor to auto forget compactors after X minutes without heartbeat. #6533
6+
* [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
67
* [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
78
* [ENHANCEMENT] StoreGateway: Emit more histogram buckets on the `cortex_querier_storegateway_refetches_per_query` metric. #6570
89
* [ENHANCEMENT] Querier: Apply bytes limiter to LabelNames and LabelValuesForLabelNames. #6568

docs/configuration/config-file-reference.md

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

48144814
# Report query statistics for ruler queries to complete as a per user metric and
4815-
# as an info level log message.
4815+
# as an info level log message. It works only when the -ruler.frontend-address
4816+
# is not configured. When -ruler.frontend-address enabled, the Query Frontend
4817+
# tracks query statistics logs and metrics.
48164818
# CLI flag: -ruler.query-stats-enabled
48174819
[query_stats_enabled: <boolean> | default = false]
48184820

pkg/ruler/compat.go

+17-3
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,20 @@ func EngineQueryFunc(engine promql.QueryEngine, frontendClient *frontendClient,
177177
}
178178

179179
if frontendClient != nil {
180-
v, err := frontendClient.InstantQuery(ctx, qs, t)
180+
// query parameters sent to the Query Frontend to leave rule information logs on query stats
181+
queryParams := map[string]string{}
182+
183+
if origin := ctx.Value(promql.QueryOrigin{}); origin != nil {
184+
queryLabels := origin.(map[string]interface{})
185+
rgMap := queryLabels["ruleGroup"].(map[string]string)
186+
queryParams["rule_group"] = rgMap["name"]
187+
queryParams["rule_namespace"] = rgMap["file"]
188+
}
189+
ruleDetail := rules.FromOriginContext(ctx)
190+
queryParams["rule"] = ruleDetail.Name
191+
queryParams["rule_kind"] = ruleDetail.Kind
192+
193+
v, err := frontendClient.InstantQuery(ctx, qs, t, queryParams)
181194
if err != nil {
182195
return nil, err
183196
}
@@ -326,7 +339,8 @@ func DefaultTenantManagerFactory(cfg Config, p Pusher, q storage.Queryable, engi
326339
totalWrites := evalMetrics.TotalWritesVec.WithLabelValues(userID)
327340
failedWrites := evalMetrics.FailedWritesVec.WithLabelValues(userID)
328341

329-
if cfg.FrontendAddress != "" {
342+
shouldEvalFromQFE := cfg.FrontendAddress != ""
343+
if shouldEvalFromQFE {
330344
c, err := frontendPool.GetClientFor(cfg.FrontendAddress)
331345
if err != nil {
332346
return nil, err
@@ -336,7 +350,7 @@ func DefaultTenantManagerFactory(cfg Config, p Pusher, q storage.Queryable, engi
336350
var queryFunc rules.QueryFunc
337351
engineQueryFunc := EngineQueryFunc(engine, client, q, overrides, userID, cfg.LookbackDelta)
338352
metricsQueryFunc := MetricsQueryFunc(engineQueryFunc, totalQueries, failedQueries)
339-
if cfg.EnableQueryStats {
353+
if cfg.EnableQueryStats && !shouldEvalFromQFE {
340354
queryFunc = RecordAndReportRuleQueryMetrics(metricsQueryFunc, userID, evalMetrics, logger)
341355
} else {
342356
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)