From 1242aa554780715f0d4367bda7be75a6bccffa72 Mon Sep 17 00:00:00 2001 From: Ivan Kalita Date: Mon, 9 Mar 2026 14:19:16 +0100 Subject: [PATCH] feat(loki): allow disabling cache for query_range requests (#21112) Allows disabling results cache via Cache-Control headers for query_range requests (the same way it's done for instant queries). --- pkg/querier/queryrange/codec.go | 5 +++++ pkg/querier/queryrange/codec_test.go | 29 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/pkg/querier/queryrange/codec.go b/pkg/querier/queryrange/codec.go index 2ba6f4740b..edf18a20f0 100644 --- a/pkg/querier/queryrange/codec.go +++ b/pkg/querier/queryrange/codec.go @@ -342,6 +342,11 @@ func (Codec) DecodeRequest(_ context.Context, r *http.Request, _ []string) (quer if err != nil { return nil, httpgrpc.Errorf(http.StatusBadRequest, "%s", err.Error()) } + + req.CachingOptions = queryrangebase.CachingOptions{ + Disabled: disableCacheReq, + } + return req, nil case InstantQueryOp: req, err := parseInstantQuery(r) diff --git a/pkg/querier/queryrange/codec_test.go b/pkg/querier/queryrange/codec_test.go index ee0f5e171b..b4e9c3df08 100644 --- a/pkg/querier/queryrange/codec_test.go +++ b/pkg/querier/queryrange/codec_test.go @@ -341,6 +341,35 @@ func Test_codec_DecodeRequest_cacheHeader(t *testing.T) { }, }, }, + { + "query_range", + func() (*http.Request, error) { + req, err := http.NewRequest( + http.MethodGet, + fmt.Sprintf(`/query_range?start=%d&end=%d&query={foo="bar"}&step=10&limit=200&direction=FORWARD`, start.UnixNano(), end.UnixNano()), + nil, + ) + if err == nil { + req.Header.Set(cacheControlHeader, noCacheVal) + } + return req, err + }, + &LokiRequest{ + Query: `{foo="bar"}`, + Limit: 200, + Step: 10000, // step is expected in ms + Direction: logproto.FORWARD, + Path: "/query_range", + StartTs: start, + EndTs: end, + Plan: &plan.QueryPlan{ + AST: syntax.MustParseExpr(`{foo="bar"}`), + }, + CachingOptions: queryrangebase.CachingOptions{ + Disabled: true, + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {