@@ -115,6 +115,8 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
115115 var (
116116 stats * querier_stats.Stats
117117 queryString url.Values
118+ // For failed query cache
119+ urlQuery url.Values
118120 )
119121
120122 // Initialise the stats in the context and make sure it's propagated
@@ -134,11 +136,12 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
134136 r .Body = http .MaxBytesReader (w , r .Body , f .cfg .MaxBodySize )
135137 r .Body = io .NopCloser (io .TeeReader (r .Body , & buf ))
136138
137- queryString = f .parseRequestQueryString (r , buf )
138-
139139 // Check if query is cached
140140 if f .failedQueryCache != nil {
141- cached , message := f .failedQueryCache .QueryHitCache (queryString )
141+ // NB: don't call f.parseRequestQueryString(r, buf) before f.roundTripper.RoundTrip(r)
142+ // because the call closes the buffer.
143+ urlQuery = r .URL .Query ()
144+ cached , message := f .failedQueryCache .QueryHitCache (urlQuery )
142145 if cached {
143146 w .WriteHeader (http .StatusForbidden )
144147 level .Info (util_log .WithContext (r .Context (), f .log )).Log ("msg" , message )
@@ -155,14 +158,15 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
155158
156159 // Update cache for failed queries.
157160 if f .failedQueryCache != nil {
158- success , message := f .failedQueryCache .UpdateFailedQueryCache (err , queryString , queryResponseTime )
161+ success , message := f .failedQueryCache .UpdateFailedQueryCache (err , urlQuery , queryResponseTime )
159162 if success {
160163 level .Info (util_log .WithContext (r .Context (), f .log )).Log ("msg" , message )
161164 } else {
162165 level .Debug (util_log .WithContext (r .Context (), f .log )).Log ("msg" , message )
163166 }
164167 }
165168
169+ queryString = f .parseRequestQueryString (r , buf )
166170 if f .cfg .LogFailedQueries {
167171 f .reportFailedQuery (r , queryString , err , queryResponseTime )
168172 }
0 commit comments