@@ -381,10 +381,17 @@ list_queue_stats(Ranges, Objs, Interval, Fun) ->
381381 [begin
382382 Id = id_lookup (queue_stats , Obj ),
383383 Pid = pget (pid , Obj ),
384- QueueData = maps :get (Id , DataLookup ),
385- Props = maps :get (queue_stats , QueueData ),
386- Stats = queue_stats (QueueData , Ranges , Interval ),
387- {Pid , combine (Props , Obj ) ++ Stats }
384+ % % A queue deleted before its metrics were collected won't have an entry.
385+ % % Return it without any stats rather than throwing an exception.
386+ % % See rabbitmq/rabbitmq-server#16989.
387+ case maps :find (Id , DataLookup ) of
388+ {ok , QueueData } ->
389+ Props = maps :get (queue_stats , QueueData ),
390+ Stats = queue_stats (QueueData , Ranges , Interval ),
391+ {Pid , combine (Props , Obj ) ++ Stats };
392+ error ->
393+ {Pid , Obj }
394+ end
388395 end || Obj <- Objs ]).
389396
390397detail_queue_stats (Ranges , Objs , Interval ) ->
@@ -395,20 +402,27 @@ detail_queue_stats(Ranges, Objs, Interval) ->
395402 [begin
396403 Id = id_lookup (queue_stats , Obj ),
397404 Pid = pget (pid , Obj ),
398- QueueData = maps :get (Id , DataLookup ),
399- Props = maps :get (queue_stats , QueueData ),
400- Stats = queue_stats (QueueData , Ranges , Interval ),
401- ConsumerStats = rabbit_mgmt_data_compat :fill_consumer_active_fields (
402- maps :get (consumer_stats , QueueData )),
403- Consumers = [{consumer_details , ConsumerStats }],
404- StatsD = [{deliveries ,
405- detail_stats (QueueData , channel_queue_stats_deliver_stats ,
406- deliver_get , second (Id ), Ranges , Interval )},
407- {incoming ,
408- detail_stats (QueueData , queue_exchange_stats_publish ,
409- fine_stats , first (Id ), Ranges , Interval )}],
410- Details = augment_details (Obj , []),
411- {Pid , combine (Props , Obj ) ++ Stats ++ StatsD ++ Consumers ++ Details }
405+ % % See `list_queue_stats/4` and rabbitmq/rabbitmq-server#16989.
406+ case maps :find (Id , DataLookup ) of
407+ {ok , QueueData } ->
408+ Props = maps :get (queue_stats , QueueData ),
409+ Stats = queue_stats (QueueData , Ranges , Interval ),
410+ ConsumerStats = rabbit_mgmt_data_compat :fill_consumer_active_fields (
411+ maps :get (consumer_stats , QueueData )),
412+ Consumers = [{consumer_details , ConsumerStats }],
413+ StatsD = [{deliveries ,
414+ detail_stats (QueueData , channel_queue_stats_deliver_stats ,
415+ deliver_get , second (Id ), Ranges , Interval )},
416+ {incoming ,
417+ detail_stats (QueueData , queue_exchange_stats_publish ,
418+ fine_stats , first (Id ), Ranges , Interval )}],
419+ Details = augment_details (Obj , []),
420+ {Pid , combine (Props , Obj ) ++ Stats ++ StatsD ++ Consumers ++ Details };
421+ error ->
422+ % % consumer_details must be present: the channel detail
423+ % % merge below reads it from every entry.
424+ {Pid , [{consumer_details , []} | Obj ]}
425+ end
412426 end || Obj <- Objs ]),
413427
414428 % patch up missing channel details
0 commit comments