@@ -435,30 +435,56 @@ spawn_notify_decorators(QName, Fun, Args) ->
435
435
catch notify_decorators (QName , Fun , Args ).
436
436
437
437
handle_tick (QName ,
438
- {Name , MR , MU , M , C , MsgBytesReady , MsgBytesUnack , MsgBytesDiscard },
438
+ #{config := #{name := Name },
439
+ num_active_consumers := NumConsumers ,
440
+ num_checked_out := NumCheckedOut ,
441
+ num_ready_messages := NumReadyMsgs ,
442
+ num_messages := NumMessages ,
443
+ enqueue_message_bytes := EnqueueBytes ,
444
+ checkout_message_bytes := CheckoutBytes ,
445
+ num_discarded := NumDiscarded ,
446
+ num_discard_checked_out := NumDiscardedCheckedOut ,
447
+ discard_message_bytes := DiscardBytes ,
448
+ discard_checkout_message_bytes := DiscardCheckoutBytes ,
449
+ smallest_raft_index := _ } = Overview ,
439
450
Nodes ) ->
440
451
% % this makes calls to remote processes so cannot be run inside the
441
452
% % ra server
442
453
Self = self (),
443
454
_ = spawn (
444
455
fun () ->
445
456
try
446
- R = reductions (Name ),
447
- rabbit_core_metrics :queue_stats (QName , MR , MU , M , R ),
448
- Util = case C of
457
+ Reductions = reductions (Name ),
458
+ rabbit_core_metrics :queue_stats (QName , NumReadyMsgs ,
459
+ NumCheckedOut , NumMessages ,
460
+ Reductions ),
461
+ Util = case NumConsumers of
449
462
0 -> 0 ;
450
463
_ -> rabbit_fifo :usage (Name )
451
464
end ,
452
- Infos = [{consumers , C },
465
+ Keys = ? STATISTICS_KEYS -- [consumers ,
466
+ messages_dlx ,
467
+ message_bytes_dlx ,
468
+ single_active_consumer_pid ,
469
+ single_active_consumer_ctag
470
+ ],
471
+ {SacTag , SacPid } = maps :get (single_active_consumer_id ,
472
+ Overview , {'' , '' }),
473
+ MsgBytesDiscarded = DiscardBytes + DiscardCheckoutBytes ,
474
+ MsgBytes = EnqueueBytes + CheckoutBytes + MsgBytesDiscarded ,
475
+ Infos = [{consumers , NumConsumers },
453
476
{consumer_capacity , Util },
454
477
{consumer_utilisation , Util },
455
- {message_bytes_ready , MsgBytesReady },
456
- {message_bytes_unacknowledged , MsgBytesUnack },
457
- {message_bytes , MsgBytesReady + MsgBytesUnack + MsgBytesDiscard },
458
- {message_bytes_persistent , MsgBytesReady + MsgBytesUnack + MsgBytesDiscard },
459
- {messages_persistent , M }
460
-
461
- | infos (QName , ? STATISTICS_KEYS -- [consumers ])],
478
+ {message_bytes_ready , EnqueueBytes },
479
+ {message_bytes_unacknowledged , CheckoutBytes },
480
+ {message_bytes , MsgBytes },
481
+ {message_bytes_persistent , MsgBytes },
482
+ {messages_persistent , NumMessages },
483
+ {messages_dlx , NumDiscarded + NumDiscardedCheckedOut },
484
+ {message_bytes_dlx , MsgBytesDiscarded },
485
+ {single_active_consumer_ctag , SacTag },
486
+ {single_active_consumer_pid , SacPid }
487
+ | infos (QName , Keys )],
462
488
rabbit_core_metrics :queue_stats (QName , Infos ),
463
489
ok = repair_leader_record (QName , Self ),
464
490
ExpectedNodes = rabbit_nodes :all (),
@@ -884,8 +910,6 @@ deliver(QSs, #delivery{message = #basic_message{content = Content0} = Msg,
884
910
state_info (S ) ->
885
911
#{pending_raft_commands => rabbit_fifo_client :pending_size (S )}.
886
912
887
-
888
-
889
913
-spec infos (rabbit_types :r ('queue' )) -> rabbit_types :infos ().
890
914
infos (QName ) ->
891
915
infos (QName , ? STATISTICS_KEYS ).
@@ -976,9 +1000,11 @@ cluster_state(Name) ->
976
1000
case whereis (Name ) of
977
1001
undefined -> down ;
978
1002
_ ->
979
- case ets :lookup (ra_state , Name ) of
980
- [{_ , recover }] -> recovering ;
981
- _ -> running
1003
+ case ets_lookup_element (ra_state , Name , 2 , undefined ) of
1004
+ recover ->
1005
+ recovering ;
1006
+ _ ->
1007
+ running
982
1008
end
983
1009
end .
984
1010
@@ -1232,7 +1258,8 @@ queue_length(Q) ->
1232
1258
Name = amqqueue :get_name (Q ),
1233
1259
case ets :lookup (ra_metrics , Name ) of
1234
1260
[] -> 0 ;
1235
- [{_ , _ , SnapIdx , _ , _ , LastIdx , _ }] -> LastIdx - SnapIdx
1261
+ [{_ , _ , SnapIdx , _ , _ , LastIdx , _ }] ->
1262
+ LastIdx - SnapIdx
1236
1263
end .
1237
1264
1238
1265
get_replicas (Q ) ->
@@ -1374,20 +1401,10 @@ i(messages, Q) when ?is_amqqueue(Q) ->
1374
1401
quorum_messages (QName );
1375
1402
i (messages_ready , Q ) when ? is_amqqueue (Q ) ->
1376
1403
QName = amqqueue :get_name (Q ),
1377
- case ets :lookup (queue_coarse_metrics , QName ) of
1378
- [{_ , MR , _ , _ , _ }] ->
1379
- MR ;
1380
- [] ->
1381
- 0
1382
- end ;
1404
+ ets_lookup_element (queue_coarse_metrics , QName , 2 , 0 );
1383
1405
i (messages_unacknowledged , Q ) when ? is_amqqueue (Q ) ->
1384
1406
QName = amqqueue :get_name (Q ),
1385
- case ets :lookup (queue_coarse_metrics , QName ) of
1386
- [{_ , _ , MU , _ , _ }] ->
1387
- MU ;
1388
- [] ->
1389
- 0
1390
- end ;
1407
+ ets_lookup_element (queue_coarse_metrics , QName , 3 , 0 );
1391
1408
i (policy , Q ) ->
1392
1409
case rabbit_policy :name (Q ) of
1393
1410
none -> '' ;
@@ -1405,12 +1422,8 @@ i(effective_policy_definition, Q) ->
1405
1422
end ;
1406
1423
i (consumers , Q ) when ? is_amqqueue (Q ) ->
1407
1424
QName = amqqueue :get_name (Q ),
1408
- case ets :lookup (queue_metrics , QName ) of
1409
- [{_ , M , _ }] ->
1410
- proplists :get_value (consumers , M , 0 );
1411
- [] ->
1412
- 0
1413
- end ;
1425
+ Consumers = ets_lookup_element (queue_metrics , QName , 2 , []),
1426
+ proplists :get_value (consumers , Consumers , 0 );
1414
1427
i (memory , Q ) when ? is_amqqueue (Q ) ->
1415
1428
{Name , _ } = amqqueue :get_pid (Q ),
1416
1429
try
@@ -1429,10 +1442,7 @@ i(state, Q) when ?is_amqqueue(Q) ->
1429
1442
end ;
1430
1443
i (local_state , Q ) when ? is_amqqueue (Q ) ->
1431
1444
{Name , _ } = amqqueue :get_pid (Q ),
1432
- case ets :lookup (ra_state , Name ) of
1433
- [{_ , State }] -> State ;
1434
- _ -> not_member
1435
- end ;
1445
+ ets_lookup_element (ra_state , Name , 2 , not_member );
1436
1446
i (garbage_collection , Q ) when ? is_amqqueue (Q ) ->
1437
1447
{Name , _ } = amqqueue :get_pid (Q ),
1438
1448
try
@@ -1477,27 +1487,9 @@ i(single_active_consumer_ctag, Q) when ?is_amqqueue(Q) ->
1477
1487
end ;
1478
1488
i (type , _ ) -> quorum ;
1479
1489
i (messages_ram , Q ) when ? is_amqqueue (Q ) ->
1480
- QPid = amqqueue :get_pid (Q ),
1481
- case ra :local_query (QPid ,
1482
- fun rabbit_fifo :query_in_memory_usage /1 ) of
1483
- {ok , {_ , {Length , _ }}, _ } ->
1484
- Length ;
1485
- {error , _ } ->
1486
- 0 ;
1487
- {timeout , _ } ->
1488
- 0
1489
- end ;
1490
+ 0 ;
1490
1491
i (message_bytes_ram , Q ) when ? is_amqqueue (Q ) ->
1491
- QPid = amqqueue :get_pid (Q ),
1492
- case ra :local_query (QPid ,
1493
- fun rabbit_fifo :query_in_memory_usage /1 ) of
1494
- {ok , {_ , {_ , Bytes }}, _ } ->
1495
- Bytes ;
1496
- {error , _ } ->
1497
- 0 ;
1498
- {timeout , _ } ->
1499
- 0
1500
- end ;
1492
+ 0 ;
1501
1493
i (messages_dlx , Q ) when ? is_amqqueue (Q ) ->
1502
1494
QPid = amqqueue :get_pid (Q ),
1503
1495
case ra :local_query (QPid ,
@@ -1524,11 +1516,10 @@ i(_K, _Q) -> ''.
1524
1516
1525
1517
open_files (Name ) ->
1526
1518
case whereis (Name ) of
1527
- undefined -> {node (), 0 };
1528
- Pid -> case ets :lookup (ra_open_file_metrics , Pid ) of
1529
- [] -> {node (), 0 };
1530
- [{_ , Count }] -> {node (), Count }
1531
- end
1519
+ undefined ->
1520
+ {node (), 0 };
1521
+ Pid ->
1522
+ {node (), ets_lookup_element (ra_open_file_metrics , Pid , 2 , 0 )}
1532
1523
end .
1533
1524
1534
1525
leader (Q ) when ? is_amqqueue (Q ) ->
@@ -1582,12 +1573,7 @@ is_process_alive(Name, Node) ->
1582
1573
-spec quorum_messages (rabbit_amqqueue :name ()) -> non_neg_integer ().
1583
1574
1584
1575
quorum_messages (QName ) ->
1585
- case ets :lookup (queue_coarse_metrics , QName ) of
1586
- [{_ , _ , _ , M , _ }] ->
1587
- M ;
1588
- [] ->
1589
- 0
1590
- end .
1576
+ ets_lookup_element (queue_coarse_metrics , QName , 4 , 0 ).
1591
1577
1592
1578
quorum_ctag (Int ) when is_integer (Int ) ->
1593
1579
integer_to_binary (Int );
@@ -1712,3 +1698,11 @@ erpc_timeout(Node, _)
1712
1698
infinity ;
1713
1699
erpc_timeout (_ , Timeout ) ->
1714
1700
Timeout .
1701
+
1702
+ ets_lookup_element (Tbl , Key , Pos , Default ) ->
1703
+ try ets :lookup_element (Tbl , Key , Pos ) of
1704
+ V -> V
1705
+ catch
1706
+ _ :badarg ->
1707
+ Default
1708
+ end .
0 commit comments