@@ -114,7 +114,10 @@ func NewHandler(cfg HandlerConfig, roundTripper http.RoundTripper, log log.Logge
114114func (f * Handler ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
115115 var (
116116 stats * querier_stats.Stats
117+ // For failed/slow query logging and query stats.
117118 queryString url.Values
119+ // For failed query cache
120+ urlQuery url.Values
118121 )
119122
120123 // Initialise the stats in the context and make sure it's propagated
@@ -134,11 +137,13 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
134137 r .Body = http .MaxBytesReader (w , r .Body , f .cfg .MaxBodySize )
135138 r .Body = io .NopCloser (io .TeeReader (r .Body , & buf ))
136139
137- queryString = f .parseRequestQueryString (r , buf )
138-
139140 // Check if query is cached
140141 if f .failedQueryCache != nil {
141- cached , message := f .failedQueryCache .QueryHitCache (queryString )
142+ // NB: don't call f.parseRequestQueryString(r, buf) before f.roundTripper.RoundTrip(r)
143+ // because the call closes the buffer which has content if the request is a POST with
144+ // form data in body.
145+ urlQuery = r .URL .Query ()
146+ cached , message := f .failedQueryCache .QueryHitCache (urlQuery )
142147 if cached {
143148 w .WriteHeader (http .StatusForbidden )
144149 level .Info (util_log .WithContext (r .Context (), f .log )).Log ("msg" , message )
@@ -155,7 +160,7 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
155160
156161 // Update cache for failed queries.
157162 if f .failedQueryCache != nil {
158- success , message := f .failedQueryCache .UpdateFailedQueryCache (err , queryString , queryResponseTime )
163+ success , message := f .failedQueryCache .UpdateFailedQueryCache (err , urlQuery , queryResponseTime )
159164 if success {
160165 level .Info (util_log .WithContext (r .Context (), f .log )).Log ("msg" , message )
161166 } else {
@@ -164,6 +169,7 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
164169 }
165170
166171 if f .cfg .LogFailedQueries {
172+ queryString = f .parseRequestQueryString (r , buf )
167173 f .reportFailedQuery (r , queryString , err , queryResponseTime )
168174 }
169175 return
0 commit comments