47
47
errRequestEntityTooLarge = httpgrpc .Errorf (http .StatusRequestEntityTooLarge , "http: request body too large" )
48
48
)
49
49
50
- // Config for a Handler .
50
+ // HandlerConfig is a config for the handler .
51
51
type HandlerConfig struct {
52
52
LogQueriesLongerThan time.Duration `yaml:"log_queries_longer_than"`
53
53
LogQueryRequestHeaders flagext.StringSliceCSV `yaml:"log_query_request_headers" category:"advanced"`
@@ -196,7 +196,7 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
196
196
197
197
if err != nil {
198
198
writeError (w , err )
199
- f .reportQueryStats (r , params , startTime , queryResponseTime , 0 , queryDetails , err )
199
+ f .reportQueryStats (r , params , startTime , queryResponseTime , 0 , queryDetails , 0 , err )
200
200
return
201
201
}
202
202
@@ -217,13 +217,13 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
217
217
f .reportSlowQuery (r , params , queryResponseTime , queryDetails )
218
218
}
219
219
if f .cfg .QueryStatsEnabled {
220
- f .reportQueryStats (r , params , startTime , queryResponseTime , queryResponseSize , queryDetails , nil )
220
+ f .reportQueryStats (r , params , startTime , queryResponseTime , queryResponseSize , queryDetails , resp . StatusCode , nil )
221
221
}
222
222
}
223
223
224
224
// reportSlowQuery reports slow queries.
225
225
func (f * Handler ) reportSlowQuery (r * http.Request , queryString url.Values , queryResponseTime time.Duration , details * querymiddleware.QueryDetails ) {
226
- logMessage := append ([]interface {} {
226
+ logMessage := append ([]any {
227
227
"msg" , "slow query detected" ,
228
228
"method" , r .Method ,
229
229
"host" , r .Host ,
@@ -238,7 +238,16 @@ func (f *Handler) reportSlowQuery(r *http.Request, queryString url.Values, query
238
238
level .Info (util_log .WithContext (r .Context (), f .log )).Log (logMessage ... )
239
239
}
240
240
241
- func (f * Handler ) reportQueryStats (r * http.Request , queryString url.Values , queryStartTime time.Time , queryResponseTime time.Duration , queryResponseSizeBytes int64 , details * querymiddleware.QueryDetails , queryErr error ) {
241
+ func (f * Handler ) reportQueryStats (
242
+ r * http.Request ,
243
+ queryString url.Values ,
244
+ queryStartTime time.Time ,
245
+ queryResponseTime time.Duration ,
246
+ queryResponseSizeBytes int64 ,
247
+ details * querymiddleware.QueryDetails ,
248
+ queryResponseStatusCode int ,
249
+ queryErr error ,
250
+ ) {
242
251
tenantIDs , err := tenant .TenantIDs (r .Context ())
243
252
if err != nil {
244
253
return
@@ -266,12 +275,13 @@ func (f *Handler) reportQueryStats(r *http.Request, queryString url.Values, quer
266
275
}
267
276
268
277
// Log stats.
269
- logMessage := append ([]interface {} {
278
+ logMessage := append ([]any {
270
279
"msg" , "query stats" ,
271
280
"component" , "query-frontend" ,
272
281
"method" , r .Method ,
273
282
"path" , r .URL .Path ,
274
283
"user_agent" , r .UserAgent (),
284
+ "status_code" , queryResponseStatusCode ,
275
285
"response_time" , queryResponseTime ,
276
286
"response_size_bytes" , queryResponseSizeBytes ,
277
287
"query_wall_time_seconds" , wallTime .Seconds (),
@@ -312,6 +322,11 @@ func (f *Handler) reportQueryStats(r *http.Request, queryString url.Values, quer
312
322
logMessage = append (logMessage , formatRequestHeaders (& r .Header , f .cfg .LogQueryRequestHeaders )... )
313
323
}
314
324
325
+ if queryErr == nil && queryResponseStatusCode / 100 != 2 {
326
+ // If downstream replied with non-2xx, log this as a failure.
327
+ queryErr = fmt .Errorf ("downstream replied with %s" , http .StatusText (queryResponseStatusCode ))
328
+ }
329
+
315
330
if queryErr != nil {
316
331
logStatus := "failed"
317
332
if errors .Is (queryErr , context .Canceled ) {
@@ -332,7 +347,7 @@ func (f *Handler) reportQueryStats(r *http.Request, queryString url.Values, quer
332
347
}
333
348
334
349
// formatQueryString prefers printing start, end, and step from details if they are not nil.
335
- func formatQueryString (details * querymiddleware.QueryDetails , queryString url.Values ) (fields []interface {} ) {
350
+ func formatQueryString (details * querymiddleware.QueryDetails , queryString url.Values ) (fields []any ) {
336
351
for k , v := range queryString {
337
352
var formattedValue string
338
353
if details != nil {
@@ -368,7 +383,7 @@ func paramValueFromDetails(details *querymiddleware.QueryDetails, paramName stri
368
383
return ""
369
384
}
370
385
371
- func formatRequestHeaders (h * http.Header , headersToLog []string ) (fields []interface {} ) {
386
+ func formatRequestHeaders (h * http.Header , headersToLog []string ) (fields []any ) {
372
387
for _ , s := range headersToLog {
373
388
if v := h .Get (s ); v != "" {
374
389
fields = append (fields , fmt .Sprintf ("header_%s" , strings .ReplaceAll (strings .ToLower (s ), "-" , "_" )), v )
0 commit comments