@@ -301,14 +301,25 @@ register() ->
301
301
deregister_cleanup (_ ) -> ok .
302
302
303
303
collect_mf ('detailed' , Callback ) ->
304
- collect (true , ? DETAILED_METRIC_NAME_PREFIX , vhosts_filter_from_pdict (), enabled_mfs_from_pdict (? METRICS_RAW ), Callback ),
304
+ IncludedMFs = enabled_mfs_from_pdict (? METRICS_RAW ),
305
+ collect (true , ? DETAILED_METRIC_NAME_PREFIX , vhosts_filter_from_pdict (), IncludedMFs , Callback ),
305
306
collect (true , ? CLUSTER_METRIC_NAME_PREFIX , vhosts_filter_from_pdict (), enabled_mfs_from_pdict (? METRICS_CLUSTER ), Callback ),
307
+ % % the detailed endpoint should emit queue_info only if queue metrics were requested
308
+ MFs = proplists :get_keys (IncludedMFs ),
309
+ case lists :member (queue_coarse_metrics , MFs ) orelse
310
+ lists :member (queue_consumer_count , MFs ) orelse
311
+ lists :member (queue_metrics , MFs ) of
312
+ true ->
313
+ emit_queue_info (? DETAILED_METRIC_NAME_PREFIX , vhosts_filter_from_pdict (), Callback );
314
+ false -> ok
315
+ end ,
306
316
% % identity is here to enable filtering on a cluster name (as already happens in existing dashboards)
307
317
emit_identity_info (<<" detailed" >>, Callback ),
308
318
ok ;
309
319
collect_mf ('per-object' , Callback ) ->
310
320
collect (true , ? METRIC_NAME_PREFIX , false , ? METRICS_RAW , Callback ),
311
321
totals (Callback ),
322
+ emit_queue_info (? METRIC_NAME_PREFIX , false , Callback ),
312
323
emit_identity_info (<<" per-object" >>, Callback ),
313
324
ok ;
314
325
collect_mf ('memory-breakdown' , Callback ) ->
@@ -406,6 +417,62 @@ identity_info(Endpoint) ->
406
417
}]
407
418
}.
408
419
420
+ membership (Pid , Members ) when is_pid (Pid ) ->
421
+ case node (Pid ) =:= node () of
422
+ true ->
423
+ case is_process_alive (Pid ) of
424
+ true -> leader ;
425
+ false -> undefined
426
+ end ;
427
+ false ->
428
+ case lists :member (node (), Members ) of
429
+ true -> follower ;
430
+ false -> not_a_member
431
+ end
432
+ end ;
433
+ membership ({Name , Node }, Members ) ->
434
+ case Node =:= node () of
435
+ true ->
436
+ case is_process_alive (whereis (Name )) of
437
+ true -> leader ;
438
+ false -> undefined
439
+ end ;
440
+ false ->
441
+ case lists :member (node (), Members ) of
442
+ true -> follower ;
443
+ false -> not_a_member
444
+ end
445
+ end ;
446
+ membership (_ , _Members ) ->
447
+ undefined .
448
+
449
+ emit_queue_info (Prefix , VHostsFilter , Callback ) ->
450
+ Help = <<" A metric with a constant '1' value and labels that provide some queue details" >>,
451
+ QInfos = lists :foldl (
452
+ fun (Q , Acc ) ->
453
+ # resource {virtual_host = VHost , name = Name } = amqqueue :get_name (Q ),
454
+ case is_map (VHostsFilter ) andalso maps :get (VHost , VHostsFilter ) == false of
455
+ true -> Acc ;
456
+ false ->
457
+ Type = amqqueue :get_type (Q ),
458
+ TypeState = amqqueue :get_type_state (Q ),
459
+ Members = maps :get (nodes , TypeState , []),
460
+ case membership (amqqueue :get_pid (Q ), Members ) of
461
+ not_a_member ->
462
+ Acc ;
463
+ Membership ->
464
+ QInfo = [
465
+ {vhost , VHost },
466
+ {queue , Name },
467
+ {queue_type , Type },
468
+ {membership , Membership }
469
+ ],
470
+ [{QInfo , 1 }|Acc ]
471
+ end
472
+ end
473
+ end , [], rabbit_amqqueue :list ()),
474
+ Callback (prometheus_model_helpers :create_mf (<<Prefix /binary , " queue_info" >>, Help , gauge , QInfos )).
475
+
409
476
add_metric_family ({Name , Type , Help , Metrics }, Callback ) ->
410
477
MN = <<? METRIC_NAME_PREFIX /binary , (prometheus_model_helpers :metric_name (Name ))/binary >>,
411
478
Callback (create_mf (MN , Help , Type , Metrics )).
@@ -890,4 +957,3 @@ vhosts_filter_from_pdict() ->
890
957
Enabled = maps :from_list ([ {VHost , true } || VHost <- L ]),
891
958
maps :merge (All , Enabled )
892
959
end .
893
-
0 commit comments