From fb61c2b2661f1035507b4e7c78bc37ec9b50214c Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Fri, 10 Feb 2023 17:05:09 +0100 Subject: [PATCH] perf: avoid getting metrics (gen_server:call) for each resource lookup --- apps/emqx_resource/include/emqx_resource.hrl | 2 +- apps/emqx_resource/src/emqx_resource_manager.erl | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/emqx_resource/include/emqx_resource.hrl b/apps/emqx_resource/include/emqx_resource.hrl index ce4e02c2a..fa7f2eb38 100644 --- a/apps/emqx_resource/include/emqx_resource.hrl +++ b/apps/emqx_resource/include/emqx_resource.hrl @@ -43,7 +43,7 @@ config := resource_config(), state := resource_state(), status := resource_status(), - metrics := emqx_metrics_worker:metrics() + metrics => emqx_metrics_worker:metrics() }. -type resource_group() :: binary(). -type creation_opts() :: #{ diff --git a/apps/emqx_resource/src/emqx_resource_manager.erl b/apps/emqx_resource/src/emqx_resource_manager.erl index 4846c8ae6..ee9e218b2 100644 --- a/apps/emqx_resource/src/emqx_resource_manager.erl +++ b/apps/emqx_resource/src/emqx_resource_manager.erl @@ -238,7 +238,7 @@ lookup(ResId) -> ets_lookup(ResId) -> case read_cache(ResId) of {Group, Data} -> - {ok, Group, data_record_to_external_map_with_metrics(Data)}; + {ok, Group, data_record_to_external_map(Data)}; not_found -> {error, not_found} end. @@ -620,8 +620,8 @@ maybe_reply(Actions, undefined, _Reply) -> maybe_reply(Actions, From, Reply) -> [{reply, From, Reply} | Actions]. --spec data_record_to_external_map_with_metrics(data()) -> resource_data(). -data_record_to_external_map_with_metrics(Data) -> +-spec data_record_to_external_map(data()) -> resource_data(). +data_record_to_external_map(Data) -> #{ id => Data#data.id, mod => Data#data.mod, @@ -629,10 +629,14 @@ data_record_to_external_map_with_metrics(Data) -> query_mode => Data#data.query_mode, config => Data#data.config, status => Data#data.status, - state => Data#data.state, - metrics => get_metrics(Data#data.id) + state => Data#data.state }. +-spec data_record_to_external_map_with_metrics(data()) -> resource_data(). +data_record_to_external_map_with_metrics(Data) -> + DataMap = data_record_to_external_map(Data), + DataMap#{metrics => get_metrics(Data#data.id)}. + -spec wait_for_ready(resource_id(), integer()) -> ok | timeout | {error, term()}. wait_for_ready(ResId, WaitTime) -> do_wait_for_ready(ResId, WaitTime div ?WAIT_FOR_RESOURCE_DELAY).