Преглед изворни кода

refactor: better metric and error fold

Thales Macedo Garitezi пре 1 година
родитељ
комит
87e4e2340d

+ 17 - 14
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),
     Results = emqx_cluster_link_metrics:get_metrics(Name),
     {NodeMetrics0, NodeErrors} =
     {NodeMetrics0, NodeErrors} =
         lists:foldl(
         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,
             end,
             {[], []},
             {[], []},
             Results
             Results
@@ -269,6 +260,18 @@ handle_metrics(Name) ->
     Response = #{metrics => AggregatedMetrics, node_metrics => NodeMetrics},
     Response = #{metrics => AggregatedMetrics, node_metrics => NodeMetrics},
     ?OK(Response).
     ?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) ->
 aggregate_metrics(NodeMetrics) ->
     ErrorLogger = fun(_) -> ok end,
     ErrorLogger = fun(_) -> ok end,
     lists:foldl(
     lists:foldl(

+ 10 - 6
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"}
             #{?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.
     ok.