@@ -147,7 +147,12 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
147
147
f .reportSlowQuery (r , queryString , queryResponseTime )
148
148
}
149
149
if f .cfg .QueryStatsEnabled {
150
- f .reportQueryStats (r , queryString , queryResponseTime , stats , err )
150
+ statusCode := resp .StatusCode
151
+ if err != nil {
152
+ statusCode = getStatusCodeFromError (err )
153
+ }
154
+
155
+ f .reportQueryStats (r , queryString , queryResponseTime , stats , err , statusCode )
151
156
}
152
157
153
158
if err != nil {
@@ -204,7 +209,7 @@ func (f *Handler) reportSlowQuery(r *http.Request, queryString url.Values, query
204
209
level .Info (util_log .WithContext (r .Context (), f .log )).Log (logMessage ... )
205
210
}
206
211
207
- func (f * Handler ) reportQueryStats (r * http.Request , queryString url.Values , queryResponseTime time.Duration , stats * querier_stats.QueryStats , error error ) {
212
+ func (f * Handler ) reportQueryStats (r * http.Request , queryString url.Values , queryResponseTime time.Duration , stats * querier_stats.QueryStats , error error , statusCode int ) {
208
213
tenantIDs , err := tenant .TenantIDs (r .Context ())
209
214
if err != nil {
210
215
return
@@ -233,6 +238,7 @@ func (f *Handler) reportQueryStats(r *http.Request, queryString url.Values, quer
233
238
"fetched_series_count" , numSeries ,
234
239
"fetched_chunks_bytes" , numBytes ,
235
240
"fetched_data_bytes" , numDataBytes ,
241
+ "status_code" , statusCode ,
236
242
}, stats .LoadExtraFields ()... )
237
243
238
244
logMessage = append (logMessage , formatQueryString (queryString )... )
@@ -299,3 +305,22 @@ func statsValue(name string, d time.Duration) string {
299
305
durationInMs := strconv .FormatFloat (float64 (d )/ float64 (time .Millisecond ), 'f' , - 1 , 64 )
300
306
return name + ";dur=" + durationInMs
301
307
}
308
+
309
+ // getStatusCodeFromError extracts http status code based on error, similar to how writeError was implemented.
310
+ func getStatusCodeFromError (err error ) int {
311
+ switch err {
312
+ case context .Canceled :
313
+ return StatusClientClosedRequest
314
+ case context .DeadlineExceeded :
315
+ return http .StatusGatewayTimeout
316
+ default :
317
+ if util .IsRequestBodyTooLarge (err ) {
318
+ return http .StatusRequestEntityTooLarge
319
+ }
320
+ }
321
+ resp , ok := httpgrpc .HTTPResponseFromError (err )
322
+ if ok {
323
+ return int (resp .Code )
324
+ }
325
+ return http .StatusInternalServerError
326
+ }
0 commit comments