@@ -472,10 +472,18 @@ def on_new_response(event):
472472 auth , user_id = user_id .split (":" )
473473 metrics_service .count ("users" , unique = [("auth" , auth ), ("userid" , user_id )])
474474
475+ status = event .response .status_code
476+
477+ if status >= 400 :
478+ # Prevent random values of 404 responses to become label values.
479+ request_matchdict = {}
480+ else :
481+ request_matchdict = dict (request .matchdict or {})
482+
475483 # Add extra labels to metrics, based on fields extracted from the request matchdict.
476484 metrics_matchdict_fields = aslist (settings ["metrics_matchdict_fields" ])
477485 # Turn the `id` field of object endpoints into `{resource}_id` (eg. `mushroom_id`, `bucket_id`)
478- enhanced_matchdict = dict ( request . matchdict or {})
486+ enhanced_matchdict = request_matchdict
479487 try :
480488 enhanced_matchdict [request .current_resource_name + "_id" ] = enhanced_matchdict .get (
481489 "id" , ""
@@ -487,8 +495,6 @@ def on_new_response(event):
487495 (field , enhanced_matchdict .get (field , "" )) for field in metrics_matchdict_fields
488496 ]
489497
490- status = event .response .status_code
491-
492498 service = request .current_service
493499 if service :
494500 # Use the service name as endpoint if available.
@@ -501,35 +507,30 @@ def on_new_response(event):
501507 "unnamed" if status != 404 else "unknown"
502508 ) # Do not multiply cardinality for unknown endpoints.
503509
510+ request_labels = [
511+ ("method" , request .method .lower ()),
512+ ("endpoint" , endpoint ),
513+ ("status" , str (status )),
514+ ] + metrics_matchdict_labels
515+
504516 # Count served requests.
505- metrics_service .count (
506- "request_summary" ,
507- unique = [
508- ("method" , request .method .lower ()),
509- ("endpoint" , endpoint ),
510- ("status" , str (status )),
511- ]
512- + metrics_matchdict_labels ,
513- )
517+ metrics_service .count ("request_summary" , unique = request_labels )
514518
515519 try :
516520 current = utils .msec_time ()
517521 duration = current - request ._received_at
518522 metrics_service .timer (
519523 "request_duration" ,
520524 value = duration ,
521- labels = [("endpoint" , endpoint ), ("method" , request .method .lower ())]
522- + metrics_matchdict_labels ,
525+ labels = request_labels ,
523526 )
524527 except AttributeError : # pragma: no cover
525528 # Logging was not setup in this Kinto app (unlikely but possible)
526529 pass
527530
528531 # Observe response size.
529532 metrics_service .observe (
530- "request_size" ,
531- len (event .response .body or b"" ),
532- labels = [("endpoint" , endpoint )] + metrics_matchdict_labels ,
533+ "request_size" , len (event .response .body or b"" ), labels = request_labels
533534 )
534535
535536 # Count authentication verifications.
0 commit comments