fix service

This commit is contained in:
安礼成 2023-02-23 17:16:10 +08:00
parent 009daf7d34
commit 7f1dbbade5
3 changed files with 104 additions and 131 deletions

View File

@ -41,9 +41,9 @@ init_database() ->
]),
%%
mnesia:create_table(microservice, [
{attributes, record_info(fields, microservice)},
{record_name, microservice},
mnesia:create_table(service, [
{attributes, record_info(fields, service)},
{record_name, service},
{disc_copies, [node()]},
{type, set}
]),
@ -68,5 +68,5 @@ copy_database(MasterNode) when is_atom(MasterNode) ->
%%
mnesia:add_table_copy(host, node(), ram_copies),
mnesia:add_table_copy(terminal, node(), ram_copies),
mnesia:add_table_copy(microservice, node(), ram_copies),
mnesia:add_table_copy(service, node(), ram_copies),
ok.

View File

@ -1,127 +0,0 @@
%%%-------------------------------------------------------------------
%%% @author licheng5
%%% @copyright (C) 2021, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 27. 4 2021 4:38
%%%-------------------------------------------------------------------
-module(microservice_model).
-author("licheng5").
-include("iot.hrl").
-include_lib("stdlib/include/qlc.hrl").
%% API
-export([get_services/1, get_service/2, add_service/1, change_status/2, delete/1, table_size/0]).
get_service(HostId, ServiceName) when is_binary(HostId), is_binary(ServiceName) ->
Fun = fun() ->
Q = qlc:q([E || E <- mnesia:table(microservice), E#service.host_id =:= HostId, E#service.name =:= ServiceName]),
qlc:e(Q)
end,
case mnesia:transaction(Fun) of
[Service] ->
{ok, Service};
_ ->
undefined
end.
get_services(HostId) when is_binary(HostId) ->
Fun = fun() ->
Q = qlc:q([E || E <- mnesia:table(microservice), E#service.host_id =:= HostId]),
qlc:e(Q)
end,
case mnesia:transaction(Fun) of
Services when is_list(Services) ->
Services;
_ ->
[]
end.
add_service(Service = #service{}) ->
case mnesia:transaction(fun() -> mnesia:write(microservice, Service, write) end) of
{atomic, _} ->
ok;
{aborted, Error} ->
{error, Error}
end.
change_status(ServiceId, Status) when is_binary(ServiceId), is_integer(Status) ->
Fun = fun() ->
case mnesia:read(microservice, ServiceId) of
[] ->
mnesia:abort(<<"host not found">>);
[Service] ->
NService = Service#service{status = Status},
mnesia:write(microservice, NService, write)
end
end,
case mnesia:transaction(Fun) of
{atomic, ok} ->
ok;
{aborted, Reason} ->
{error, Reason}
end.
update_metric(ServiceId, Metrics) when is_binary(ServiceId), is_list(Metrics) ->
Fun = fun() ->
case mnesia:read(terminal, TerminalId) of
[] ->
mnesia:abort(<<"terminal not found">>);
[Terminal = #terminal{metrics = Metrics}] ->
Ts = iot_util:current_time(),
NMetrics = case lists:any(fun(#service_metric{symbol = Symbol}) -> Symbol =:= MetricSymbol end, Metrics) of
true ->
lists:map(fun(Metric=#service_metric{symbol = Symbol, queue = Q}) ->
case Symbol =:= MetricSymbol of
true ->
Q1 = iot_util:queue_limited_in({Ts, MetricValue}, Q, 100),
Metric#service_metric{
name = MetricName,
last_value = MetricValue,
update_ts = Ts,
queue = Q1
};
false ->
Metric
end
end, Metrics);
false ->
Q0 = queue:new(),
Metric = #service_metric{
name = MetricName,
symbol = MetricSymbol,
last_value = MetricValue,
update_ts = Ts,
queue = queue:in({Ts, MetricValue}, Q0)
},
Metrics ++ [Metric]
end,
mnesia:write(terminal, Terminal#terminal{metrics = NMetrics}, write)
end
end,
case mnesia:transaction(Fun) of
{atomic, ok} ->
ok;
{aborted, Reason} ->
{error, Reason}
end.
-spec delete(HostId :: binary()) -> ok | {error, Reason :: any()}.
delete(ServiceId) when is_binary(ServiceId) ->
case mnesia:transaction(fun() -> mnesia:delete(microservice, ServiceId, write) end) of
{atomic, ok} ->
ok;
{aborted, Reason} ->
{error, Reason}
end.
%% app表的数据大小
table_size() ->
mnesia:table_info(microservice, size).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% helper methods
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View File

@ -0,0 +1,100 @@
%%%-------------------------------------------------------------------
%%% @author licheng5
%%% @copyright (C) 2021, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 27. 4 2021 4:38
%%%-------------------------------------------------------------------
-module(service_model).
-author("licheng5").
-include("iot.hrl").
-include_lib("stdlib/include/qlc.hrl").
%% API
-export([get_services/1, get_service/2, add_service/1, change_status/2, delete/1, table_size/0]).
-export([update_metric/2]).
get_service(HostId, ServiceName) when is_binary(HostId), is_binary(ServiceName) ->
Fun = fun() ->
Q = qlc:q([E || E <- mnesia:table(service), E#service.host_id =:= HostId, E#service.name =:= ServiceName]),
qlc:e(Q)
end,
case mnesia:transaction(Fun) of
[Service] ->
{ok, Service};
_ ->
undefined
end.
get_services(HostId) when is_binary(HostId) ->
Fun = fun() ->
Q = qlc:q([E || E <- mnesia:table(service), E#service.host_id =:= HostId]),
qlc:e(Q)
end,
case mnesia:transaction(Fun) of
Services when is_list(Services) ->
Services;
_ ->
[]
end.
add_service(Service = #service{}) ->
case mnesia:transaction(fun() -> mnesia:write(service, Service, write) end) of
{atomic, _} ->
ok;
{aborted, Error} ->
{error, Error}
end.
change_status(ServiceId, Status) when is_binary(ServiceId), is_integer(Status) ->
Fun = fun() ->
case mnesia:read(service, ServiceId) of
[] ->
mnesia:abort(<<"host not found">>);
[Service] ->
NService = Service#service{status = Status},
mnesia:write(service, NService, write)
end
end,
case mnesia:transaction(Fun) of
{atomic, ok} ->
ok;
{aborted, Reason} ->
{error, Reason}
end.
update_metric(ServiceId, Metrics) when is_binary(ServiceId), is_list(Metrics) ->
Fun = fun() ->
case mnesia:read(service, ServiceId) of
[] ->
mnesia:abort(<<"service not found">>);
[Service = #service{metrics = Metrics}] ->
NService = Service#service{metrics = Metrics},
mnesia:write(service, NService, write)
end
end,
case mnesia:transaction(Fun) of
{atomic, ok} ->
ok;
{aborted, Reason} ->
{error, Reason}
end.
-spec delete(HostId :: binary()) -> ok | {error, Reason :: any()}.
delete(ServiceId) when is_binary(ServiceId) ->
case mnesia:transaction(fun() -> mnesia:delete(service, ServiceId, write) end) of
{atomic, ok} ->
ok;
{aborted, Reason} ->
{error, Reason}
end.
%% app表的数据大小
table_size() ->
mnesia:table_info(service, size).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% helper methods
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%