summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Klishin <mklishin@pivotal.io>2019-10-17 05:12:43 +0300
committerGitHub <noreply@github.com>2019-10-17 05:12:43 +0300
commit50fbc5259df3b23ec34af156516203b0b8030c5e (patch)
tree43372b503499635ddbb01eb3bb4480a60b5e3201 /src
parent46a0181bc9729f20fad631c779dfbb817c71c206 (diff)
parentf9b13a2545c4c45cfc026a4a3d5f687bc35964ae (diff)
downloadrabbitmq-server-git-50fbc5259df3b23ec34af156516203b0b8030c5e.tar.gz
Merge pull request #2136 from rabbitmq/mark-down-queue-core-metrics
Update core metrics with down state
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_amqqueue.erl15
-rw-r--r--src/rabbit_core_metrics_gc.erl22
2 files changed, 35 insertions, 2 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 925e7915cb..ff83bc9d04 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -32,7 +32,7 @@
emit_info_local/4, emit_info_down/4]).
-export([count/0]).
-export([list_down/1, count/1, list_names/0, list_names/1, list_local_names/0,
- list_with_possible_retry/1]).
+ list_local_names_down/0, list_with_possible_retry/1]).
-export([list_by_type/1]).
-export([force_event_refresh/1, notify_policy_changed/1]).
-export([consumers/1, consumers_all/1, emit_consumers_all/4, consumer_info_keys/0]).
@@ -941,6 +941,19 @@ list_local_names() ->
[ amqqueue:get_name(Q) || Q <- list(),
amqqueue:get_state(Q) =/= crashed, is_local_to_node(amqqueue:get_pid(Q), node())].
+list_local_names_down() ->
+ [ amqqueue:get_name(Q) || Q <- list(),
+ is_down(Q),
+ is_local_to_node(amqqueue:get_pid(Q), node())].
+
+is_down(Q) ->
+ try
+ info(Q, [state]) == [{state, down}]
+ catch
+ _:_ ->
+ true
+ end.
+
-spec list_by_type(atom()) -> [amqqueue:amqqueue()].
list_by_type(Type) ->
diff --git a/src/rabbit_core_metrics_gc.erl b/src/rabbit_core_metrics_gc.erl
index 99ad8eef34..58e6c90c08 100644
--- a/src/rabbit_core_metrics_gc.erl
+++ b/src/rabbit_core_metrics_gc.erl
@@ -75,9 +75,11 @@ gc_queues() ->
gc_local_queues() ->
Queues = rabbit_amqqueue:list_local_names(),
+ QueuesDown = rabbit_amqqueue:list_local_names_down(),
GbSet = gb_sets:from_list(Queues),
+ GbSetDown = gb_sets:from_list(QueuesDown),
gc_entity(queue_metrics, GbSet),
- gc_entity(queue_coarse_metrics, GbSet),
+ gc_queue_metrics(GbSet, GbSetDown),
Followers = gb_sets:from_list(rabbit_amqqueue:list_local_followers()),
gc_leader_data(Followers).
@@ -133,6 +135,24 @@ gc_process(Pid, Table, Key) ->
none
end.
+gc_queue_metrics(GbSet, GbSetDown) ->
+ Table = queue_metrics,
+ ets:foldl(fun({Key, Props, Marker}, none) ->
+ case gb_sets:is_member(Key, GbSet) of
+ true ->
+ case gb_sets:is_member(Key, GbSetDown) of
+ true ->
+ ets:insert(Table, {Key, [{state, down} | lists:keydelete(state, 1, Props)], Marker}),
+ none;
+ false ->
+ none
+ end;
+ false ->
+ ets:delete(Table, Key),
+ none
+ end
+ end, none, Table).
+
gc_entity(Table, GbSet) ->
ets:foldl(fun({{_, Id} = Key, _}, none) ->
gc_entity(Id, Table, Key, GbSet);