diff --git a/apps/emqx_cluster_link/src/emqx_cluster_link_api.erl b/apps/emqx_cluster_link/src/emqx_cluster_link_api.erl index 21c435a0f..4ff1ee7ef 100644 --- a/apps/emqx_cluster_link/src/emqx_cluster_link_api.erl +++ b/apps/emqx_cluster_link/src/emqx_cluster_link_api.erl @@ -236,20 +236,11 @@ handle_metrics(Name) -> Results = emqx_cluster_link_metrics:get_metrics(Name), {NodeMetrics0, NodeErrors} = lists:foldl( - fun - ({Node, {ok, RouterMetrics}, {ok, ResourceMetrics}}, {OkAccIn, ErrAccIn}) -> - OkAcc = [format_metrics(Node, RouterMetrics, ResourceMetrics) | OkAccIn], - {OkAcc, ErrAccIn}; - ({Node, {ok, RouterMetrics}, ResError}, {OkAccIn, ErrAccIn}) -> - OkAcc = [format_metrics(Node, RouterMetrics, _ResourceMetrics = #{}) | OkAccIn], - {OkAcc, [{Node, #{resource => ResError}} | ErrAccIn]}; - ({Node, RouterError, {ok, ResourceMetrics}}, {OkAccIn, ErrAccIn}) -> - OkAcc = [format_metrics(Node, _RouterMetrics = #{}, ResourceMetrics) | OkAccIn], - {OkAcc, [{Node, #{router => RouterError}} | ErrAccIn]}; - ({Node, RouterError, ResourceError}, {OkAccIn, ErrAccIn}) -> - {OkAccIn, [ - {Node, #{router => RouterError, resource => ResourceError}} | ErrAccIn - ]} + fun({Node, RouterMetrics0, ResourceMetrics0}, {OkAccIn, ErrAccIn}) -> + {RouterMetrics, RouterError} = get_metrics_or_errors(RouterMetrics0), + {ResourceMetrics, ResourceError} = get_metrics_or_errors(ResourceMetrics0), + ErrAcc = append_errors(RouterError, ResourceError, Node, ErrAccIn), + {[format_metrics(Node, RouterMetrics, ResourceMetrics) | OkAccIn], ErrAcc} end, {[], []}, Results @@ -269,6 +260,18 @@ handle_metrics(Name) -> Response = #{metrics => AggregatedMetrics, node_metrics => NodeMetrics}, ?OK(Response). +get_metrics_or_errors({ok, Metrics}) -> + {Metrics, undefined}; +get_metrics_or_errors(Error) -> + {#{}, Error}. + +append_errors(undefined, undefined, _Node, Acc) -> + Acc; +append_errors(RouterError, ResourceError, Node, Acc) -> + Err0 = emqx_utils_maps:put_if(#{}, router, RouterError, RouterError =/= undefined), + Err = emqx_utils_maps:put_if(Err0, resource, ResourceError, ResourceError =/= undefined), + [{Node, Err} | Acc]. + aggregate_metrics(NodeMetrics) -> ErrorLogger = fun(_) -> ok end, lists:foldl( diff --git a/apps/emqx_cluster_link/test/emqx_cluster_link_api_SUITE.erl b/apps/emqx_cluster_link/test/emqx_cluster_link_api_SUITE.erl index 486179af1..5e3ae5d50 100644 --- a/apps/emqx_cluster_link/test/emqx_cluster_link_api_SUITE.erl +++ b/apps/emqx_cluster_link/test/emqx_cluster_link_api_SUITE.erl @@ -695,12 +695,16 @@ t_metrics(Config) -> #{?snk_kind := "cluster_link_extrouter_route_added"} ), - ?assertMatch( - {200, #{ - <<"metrics">> := #{<<"routes">> := 2}, - <<"node_metrics">> := _ - }}, - get_metrics(source, SourceName) + ?retry( + 300, + 10, + ?assertMatch( + {200, #{ + <<"metrics">> := #{<<"routes">> := 2}, + <<"node_metrics">> := _ + }}, + get_metrics(source, SourceName) + ) ), ok.