197197 [operator_policy_validator , <<" target-group-size" >>, ? MODULE ]}},
198198 {mfa , {rabbit_registry , register ,
199199 [policy_merge_strategy , <<" target-group-size" >>, ? MODULE ]}},
200+ {mfa , {rabbit_registry , register ,
201+ [policy_validator , <<" member-placement-tag" >>, ? MODULE ]}},
202+ {mfa , {rabbit_registry , register ,
203+ [operator_policy_validator , <<" member-placement-tag" >>, ? MODULE ]}},
204+ {mfa , {rabbit_registry , register ,
205+ [policy_merge_strategy , <<" member-placement-tag" >>, ? MODULE ]}},
200206 {mfa , {rabbit_registry , register ,
201207 [policy_validator , <<" delayed-retry-type" >>, ? MODULE ]}},
202208 {mfa , {rabbit_registry , register ,
@@ -244,6 +250,11 @@ validate_policy0(<<"target-group-size">>, Value) ->
244250 true -> ok ;
245251 false -> {error , " ~tp is not a valid qq target count value" , [Value ]}
246252 end ;
253+ validate_policy0 (<<" member-placement-tag" >>, Value )
254+ when is_binary (Value ), byte_size (Value ) > 0 ->
255+ ok ;
256+ validate_policy0 (<<" member-placement-tag" >>, Value ) ->
257+ {error , " ~tp is not a valid member-placement-tag value. Must be a non-empty string" , [Value ]};
247258validate_policy0 (<<" delayed-retry-type" >>, <<" all" >>) -> ok ;
248259validate_policy0 (<<" delayed-retry-type" >>, <<" failed" >>) -> ok ;
249260validate_policy0 (<<" delayed-retry-type" >>, <<" returned" >>) -> ok ;
@@ -263,6 +274,8 @@ validate_policy0(<<"delayed-retry-max">>, Value) ->
263274
264275merge_policy_value (<<" target-group-size" >>, Val , OpVal ) ->
265276 max (Val , OpVal );
277+ merge_policy_value (<<" member-placement-tag" >>, _Val , OpVal ) ->
278+ OpVal ;
266279merge_policy_value (<<" delayed-retry-type" >>, _Val , OpVal ) ->
267280 OpVal ;
268281merge_policy_value (<<" delayed-retry-min" >>, Val , OpVal ) ->
@@ -614,6 +627,7 @@ capabilities() ->
614627 <<" x-single-active-consumer" >>,
615628 <<" x-queue-type" >>,
616629 <<" x-quorum-initial-group-size" >>,
630+ <<" x-member-placement-tag" >>,
617631 <<" x-delivery-limit" >>,
618632 <<" x-message-ttl" >>,
619633 <<" x-queue-leader-locator" >>,
@@ -1483,59 +1497,73 @@ status(#resource{virtual_host = Vhost, name = QueueName}) ->
14831497status (Q ) when ? amqqueue_is_quorum (Q ) ->
14841498 {RName , _ } = amqqueue :get_pid (Q ),
14851499 Nodes = lists :sort (get_nodes (Q )),
1500+ TagKey = rabbit_queue_location :placement_tag_key (Q ),
1501+ NodeToAZ = case TagKey of
1502+ undefined -> #{};
1503+ Key -> rabbit_member_placement_az :node_tags_for_nodes (Nodes , Key )
1504+ end ,
14861505 [begin
14871506 ServerId = {RName , N },
1488- case erpc_call (N , ? MODULE , key_metrics_rpc , [ServerId ], ? RPC_TIMEOUT ) of
1489- #{state := RaftState ,
1490- membership := Membership ,
1491- commit_index := Commit ,
1492- term := Term ,
1493- last_index := Last ,
1494- last_applied := LastApplied ,
1495- last_written_index := LastWritten ,
1496- snapshot_index := SnapIdx ,
1497- machine_version := MacVer } ->
1498- [{<<" Node Name" >>, N },
1499- {<<" Raft State" >>, RaftState },
1500- {<<" Membership" >>, Membership },
1501- {<<" Last Log Index" >>, Last },
1502- {<<" Last Written" >>, LastWritten },
1503- {<<" Last Applied" >>, LastApplied },
1504- {<<" Commit Index" >>, Commit },
1505- {<<" Snapshot Index" >>, SnapIdx },
1506- {<<" Term" >>, Term },
1507- {<<" Machine Version" >>, MacVer }
1508- ];
1509- #{state := noproc ,
1510- membership := unknown ,
1511- machine_version := MacVer } ->
1512- [{<<" Node Name" >>, N },
1513- {<<" Raft State" >>, noproc },
1514- {<<" Membership" >>, <<>>},
1515- {<<" Last Log Index" >>, <<>>},
1516- {<<" Last Written" >>, <<>>},
1517- {<<" Last Applied" >>, <<>>},
1518- {<<" Commit Index" >>, <<>>},
1519- {<<" Snapshot Index" >>, <<>>},
1520- {<<" Term" >>, <<>>},
1521- {<<" Machine Version" >>, MacVer }
1522- ];
1523- {error , Reason } ->
1524- State = case is_atom (Reason ) of
1525- true -> Reason ;
1526- false -> unknown
1527- end ,
1528- [{<<" Node Name" >>, N },
1529- {<<" Raft State" >>, State },
1530- {<<" Membership" >>, <<>>},
1531- {<<" Last Log Index" >>, <<>>},
1532- {<<" Last Written" >>, <<>>},
1533- {<<" Last Applied" >>, <<>>},
1534- {<<" Commit Index" >>, <<>>},
1535- {<<" Snapshot Index" >>, <<>>},
1536- {<<" Term" >>, <<>>},
1537- {<<" Machine Version" >>, <<>>}
1538- ]
1507+ BaseRow = case erpc_call (N , ? MODULE , key_metrics_rpc , [ServerId ], ? RPC_TIMEOUT ) of
1508+ #{state := RaftState ,
1509+ membership := Membership ,
1510+ commit_index := Commit ,
1511+ term := Term ,
1512+ last_index := Last ,
1513+ last_applied := LastApplied ,
1514+ last_written_index := LastWritten ,
1515+ snapshot_index := SnapIdx ,
1516+ machine_version := MacVer } ->
1517+ [{<<" Node Name" >>, N },
1518+ {<<" Raft State" >>, RaftState },
1519+ {<<" Membership" >>, Membership },
1520+ {<<" Last Log Index" >>, Last },
1521+ {<<" Last Written" >>, LastWritten },
1522+ {<<" Last Applied" >>, LastApplied },
1523+ {<<" Commit Index" >>, Commit },
1524+ {<<" Snapshot Index" >>, SnapIdx },
1525+ {<<" Term" >>, Term },
1526+ {<<" Machine Version" >>, MacVer }
1527+ ];
1528+ #{state := noproc ,
1529+ membership := unknown ,
1530+ machine_version := MacVer } ->
1531+ [{<<" Node Name" >>, N },
1532+ {<<" Raft State" >>, noproc },
1533+ {<<" Membership" >>, <<>>},
1534+ {<<" Last Log Index" >>, <<>>},
1535+ {<<" Last Written" >>, <<>>},
1536+ {<<" Last Applied" >>, <<>>},
1537+ {<<" Commit Index" >>, <<>>},
1538+ {<<" Snapshot Index" >>, <<>>},
1539+ {<<" Term" >>, <<>>},
1540+ {<<" Machine Version" >>, MacVer }
1541+ ];
1542+ {error , Reason } ->
1543+ State = case is_atom (Reason ) of
1544+ true -> Reason ;
1545+ false -> unknown
1546+ end ,
1547+ [{<<" Node Name" >>, N },
1548+ {<<" Raft State" >>, State },
1549+ {<<" Membership" >>, <<>>},
1550+ {<<" Last Log Index" >>, <<>>},
1551+ {<<" Last Written" >>, <<>>},
1552+ {<<" Last Applied" >>, <<>>},
1553+ {<<" Commit Index" >>, <<>>},
1554+ {<<" Snapshot Index" >>, <<>>},
1555+ {<<" Term" >>, <<>>},
1556+ {<<" Machine Version" >>, <<>>}
1557+ ]
1558+ end ,
1559+ case TagKey of
1560+ undefined -> BaseRow ;
1561+ _ -> AZ = case maps :get (N , NodeToAZ , undefined ) of
1562+ undefined -> <<>>;
1563+ Val -> Val
1564+ end ,
1565+ [NodeName | Rest ] = BaseRow ,
1566+ [NodeName , {<<" AZ" >>, AZ } | Rest ]
15391567 end
15401568 end || N <- Nodes ].
15411569
0 commit comments