|
@@ -23,7 +23,7 @@
|
|
|
collect_json_data/2,
|
|
collect_json_data/2,
|
|
|
|
|
|
|
|
aggre_cluster/3,
|
|
aggre_cluster/3,
|
|
|
- with_node_name_label/2,
|
|
|
|
|
|
|
+ %% with_node_name_label/2,
|
|
|
|
|
|
|
|
point_to_map_fun/1,
|
|
point_to_map_fun/1,
|
|
|
|
|
|
|
@@ -34,7 +34,7 @@
|
|
|
|
|
|
|
|
-callback fetch_cluster_consistented_data() -> map().
|
|
-callback fetch_cluster_consistented_data() -> map().
|
|
|
|
|
|
|
|
--callback fetch_data_from_local_node() -> {node(), map()}.
|
|
|
|
|
|
|
+-callback fetch_from_local_node(atom()) -> {node(), map()}.
|
|
|
|
|
|
|
|
-callback aggre_or_zip_init_acc() -> map().
|
|
-callback aggre_or_zip_init_acc() -> map().
|
|
|
|
|
|
|
@@ -46,23 +46,23 @@
|
|
|
raw_data(Module, undefined) ->
|
|
raw_data(Module, undefined) ->
|
|
|
%% TODO: for push gateway, the format mode should be configurable
|
|
%% TODO: for push gateway, the format mode should be configurable
|
|
|
raw_data(Module, ?PROM_DATA_MODE__NODE);
|
|
raw_data(Module, ?PROM_DATA_MODE__NODE);
|
|
|
-raw_data(Module, ?PROM_DATA_MODE__ALL_NODES_AGGREGATED) ->
|
|
|
|
|
- AllNodesMetrics = aggre_cluster(Module),
|
|
|
|
|
|
|
+raw_data(Module, ?PROM_DATA_MODE__ALL_NODES_AGGREGATED = Mode) ->
|
|
|
|
|
+ AllNodesMetrics = aggre_cluster(Module, Mode),
|
|
|
Cluster = Module:fetch_cluster_consistented_data(),
|
|
Cluster = Module:fetch_cluster_consistented_data(),
|
|
|
maps:merge(AllNodesMetrics, Cluster);
|
|
maps:merge(AllNodesMetrics, Cluster);
|
|
|
-raw_data(Module, ?PROM_DATA_MODE__ALL_NODES_UNAGGREGATED) ->
|
|
|
|
|
- AllNodesMetrics = with_node_name_label(Module),
|
|
|
|
|
|
|
+raw_data(Module, ?PROM_DATA_MODE__ALL_NODES_UNAGGREGATED = Mode) ->
|
|
|
|
|
+ AllNodesMetrics = zip_cluster_data(Module, Mode),
|
|
|
Cluster = Module:fetch_cluster_consistented_data(),
|
|
Cluster = Module:fetch_cluster_consistented_data(),
|
|
|
maps:merge(AllNodesMetrics, Cluster);
|
|
maps:merge(AllNodesMetrics, Cluster);
|
|
|
-raw_data(Module, ?PROM_DATA_MODE__NODE) ->
|
|
|
|
|
- {_Node, LocalNodeMetrics} = Module:fetch_data_from_local_node(),
|
|
|
|
|
|
|
+raw_data(Module, ?PROM_DATA_MODE__NODE = Mode) ->
|
|
|
|
|
+ {_Node, LocalNodeMetrics} = Module:fetch_from_local_node(Mode),
|
|
|
Cluster = Module:fetch_cluster_consistented_data(),
|
|
Cluster = Module:fetch_cluster_consistented_data(),
|
|
|
maps:merge(LocalNodeMetrics, Cluster).
|
|
maps:merge(LocalNodeMetrics, Cluster).
|
|
|
|
|
|
|
|
-metrics_data_from_all_nodes(Module) ->
|
|
|
|
|
|
|
+fetch_data_from_all_nodes(Module, Mode) ->
|
|
|
Nodes = mria:running_nodes(),
|
|
Nodes = mria:running_nodes(),
|
|
|
_ResL = emqx_prometheus_proto_v2:raw_prom_data(
|
|
_ResL = emqx_prometheus_proto_v2:raw_prom_data(
|
|
|
- Nodes, Module, fetch_data_from_local_node, []
|
|
|
|
|
|
|
+ Nodes, Module, fetch_from_local_node, [Mode]
|
|
|
).
|
|
).
|
|
|
|
|
|
|
|
collect_json_data(Data, Func) when is_function(Func, 3) ->
|
|
collect_json_data(Data, Func) when is_function(Func, 3) ->
|
|
@@ -76,17 +76,13 @@ collect_json_data(Data, Func) when is_function(Func, 3) ->
|
|
|
collect_json_data(_, _) ->
|
|
collect_json_data(_, _) ->
|
|
|
error(badarg).
|
|
error(badarg).
|
|
|
|
|
|
|
|
-aggre_cluster(Module) ->
|
|
|
|
|
|
|
+aggre_cluster(Module, Mode) ->
|
|
|
do_aggre_cluster(
|
|
do_aggre_cluster(
|
|
|
Module:logic_sum_metrics(),
|
|
Module:logic_sum_metrics(),
|
|
|
- metrics_data_from_all_nodes(Module),
|
|
|
|
|
|
|
+ fetch_data_from_all_nodes(Module, Mode),
|
|
|
Module:aggre_or_zip_init_acc()
|
|
Module:aggre_or_zip_init_acc()
|
|
|
).
|
|
).
|
|
|
|
|
|
|
|
-with_node_name_label(Module) ->
|
|
|
|
|
- ResL = metrics_data_from_all_nodes(Module),
|
|
|
|
|
- do_with_node_name_label(ResL, Module:aggre_or_zip_init_acc()).
|
|
|
|
|
-
|
|
|
|
|
aggre_cluster(LogicSumKs, ResL, Init) ->
|
|
aggre_cluster(LogicSumKs, ResL, Init) ->
|
|
|
do_aggre_cluster(LogicSumKs, ResL, Init).
|
|
do_aggre_cluster(LogicSumKs, ResL, Init).
|
|
|
|
|
|
|
@@ -121,61 +117,65 @@ aggre_metric(LogicSumKs, NodeMetrics, AccIn0) ->
|
|
|
|
|
|
|
|
do_aggre_metric(K, LogicSumKs, NodeMetrics, AccL) ->
|
|
do_aggre_metric(K, LogicSumKs, NodeMetrics, AccL) ->
|
|
|
lists:foldl(
|
|
lists:foldl(
|
|
|
- fun({Labels, Metric}, AccIn) ->
|
|
|
|
|
- NMetric =
|
|
|
|
|
- case lists:member(K, LogicSumKs) of
|
|
|
|
|
- true ->
|
|
|
|
|
- logic_sum(Metric, ?PG0(Labels, AccIn));
|
|
|
|
|
- false ->
|
|
|
|
|
- Metric + ?PG0(Labels, AccIn)
|
|
|
|
|
- end,
|
|
|
|
|
- [{Labels, NMetric} | AccIn]
|
|
|
|
|
|
|
+ fun(Point = {_Labels, _Metric}, AccIn) ->
|
|
|
|
|
+ sum(K, LogicSumKs, Point, AccIn)
|
|
|
end,
|
|
end,
|
|
|
AccL,
|
|
AccL,
|
|
|
NodeMetrics
|
|
NodeMetrics
|
|
|
).
|
|
).
|
|
|
|
|
|
|
|
-with_node_name_label(ResL, Init) ->
|
|
|
|
|
- do_with_node_name_label(ResL, Init).
|
|
|
|
|
|
|
+sum(K, LogicSumKs, {Labels, Metric} = Point, MetricAccL) ->
|
|
|
|
|
+ case lists:keytake(Labels, 1, MetricAccL) of
|
|
|
|
|
+ {value, {Labels, MetricAcc}, NMetricAccL} ->
|
|
|
|
|
+ NPoint = {Labels, do_sum(K, LogicSumKs, Metric, MetricAcc)},
|
|
|
|
|
+ [NPoint | NMetricAccL];
|
|
|
|
|
+ false ->
|
|
|
|
|
+ [Point | MetricAccL]
|
|
|
|
|
+ end.
|
|
|
|
|
+
|
|
|
|
|
+do_sum(K, LogicSumKs, Metric, MetricAcc) ->
|
|
|
|
|
+ case lists:member(K, LogicSumKs) of
|
|
|
|
|
+ true ->
|
|
|
|
|
+ logic_sum(Metric, MetricAcc);
|
|
|
|
|
+ false ->
|
|
|
|
|
+ Metric + MetricAcc
|
|
|
|
|
+ end.
|
|
|
|
|
+
|
|
|
|
|
+zip_cluster_data(Module, Mode) ->
|
|
|
|
|
+ zip_cluster(
|
|
|
|
|
+ fetch_data_from_all_nodes(Module, Mode),
|
|
|
|
|
+ Module:aggre_or_zip_init_acc()
|
|
|
|
|
+ ).
|
|
|
|
|
|
|
|
-do_with_node_name_label([], AccIn) ->
|
|
|
|
|
|
|
+zip_cluster([], AccIn) ->
|
|
|
AccIn;
|
|
AccIn;
|
|
|
-do_with_node_name_label([{ok, {NodeName, NodeMetric}} | Rest], AccIn) ->
|
|
|
|
|
- do_with_node_name_label(
|
|
|
|
|
|
|
+zip_cluster([{ok, {_NodeName, NodeMetric}} | Rest], AccIn) ->
|
|
|
|
|
+ zip_cluster(
|
|
|
Rest,
|
|
Rest,
|
|
|
maps:fold(
|
|
maps:fold(
|
|
|
fun(K, V, AccIn0) ->
|
|
fun(K, V, AccIn0) ->
|
|
|
AccIn0#{
|
|
AccIn0#{
|
|
|
- K => zip_with_node_name(NodeName, V, ?MG(K, AccIn0))
|
|
|
|
|
|
|
+ K => do_zip_cluster(V, ?MG(K, AccIn0))
|
|
|
}
|
|
}
|
|
|
end,
|
|
end,
|
|
|
AccIn,
|
|
AccIn,
|
|
|
NodeMetric
|
|
NodeMetric
|
|
|
)
|
|
)
|
|
|
);
|
|
);
|
|
|
-do_with_node_name_label([{_, _} | Rest], AccIn) ->
|
|
|
|
|
- do_with_node_name_label(Rest, AccIn).
|
|
|
|
|
|
|
+zip_cluster([{_, _} | Rest], AccIn) ->
|
|
|
|
|
+ zip_cluster(Rest, AccIn).
|
|
|
|
|
|
|
|
-zip_with_node_name(NodeName, NodeMetrics, AccIn0) ->
|
|
|
|
|
|
|
+do_zip_cluster(NodeMetrics, AccIn0) ->
|
|
|
lists:foldl(
|
|
lists:foldl(
|
|
|
fun(K, AccIn) ->
|
|
fun(K, AccIn) ->
|
|
|
- NAccL = do_zip_with_node_name(NodeName, ?MG(K, NodeMetrics), ?MG(K, AccIn)),
|
|
|
|
|
|
|
+ AccMetricL = ?MG(K, AccIn),
|
|
|
|
|
+ NAccL = ?MG(K, NodeMetrics) ++ AccMetricL,
|
|
|
AccIn#{K => NAccL}
|
|
AccIn#{K => NAccL}
|
|
|
end,
|
|
end,
|
|
|
AccIn0,
|
|
AccIn0,
|
|
|
maps:keys(NodeMetrics)
|
|
maps:keys(NodeMetrics)
|
|
|
).
|
|
).
|
|
|
|
|
|
|
|
-do_zip_with_node_name(NodeName, NodeMetrics, AccL) ->
|
|
|
|
|
- lists:foldl(
|
|
|
|
|
- fun({Labels, Metric}, AccIn) ->
|
|
|
|
|
- NLabels = [{node, NodeName} | Labels],
|
|
|
|
|
- [{NLabels, Metric} | AccIn]
|
|
|
|
|
- end,
|
|
|
|
|
- AccL,
|
|
|
|
|
- NodeMetrics
|
|
|
|
|
- ).
|
|
|
|
|
-
|
|
|
|
|
point_to_map_fun(Key) ->
|
|
point_to_map_fun(Key) ->
|
|
|
fun({Lables, Metric}, AccIn2) ->
|
|
fun({Lables, Metric}, AccIn2) ->
|
|
|
LablesKVMap = maps:from_list(Lables),
|
|
LablesKVMap = maps:from_list(Lables),
|