refactor: move common templating logic to `emqx_connector_aggreg_buffer_ctx`
This commit is contained in:
parent
c916c83c7c
commit
af99829a21
|
@ -339,9 +339,9 @@ do_list_blobs(Worker, Container) ->
|
||||||
%% `emqx_connector_aggreg_delivery' API
|
%% `emqx_connector_aggreg_delivery' API
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
|
|
||||||
-spec init_transfer_state(emqx_connector_aggreg_delivery:buffer_map(), transfer_opts()) ->
|
-spec init_transfer_state(buffer(), transfer_opts()) ->
|
||||||
transfer_state().
|
transfer_state().
|
||||||
init_transfer_state(BufferMap, Opts) ->
|
init_transfer_state(Buffer, Opts) ->
|
||||||
#{
|
#{
|
||||||
upload_options := #{
|
upload_options := #{
|
||||||
action := ActionName,
|
action := ActionName,
|
||||||
|
@ -351,7 +351,7 @@ init_transfer_state(BufferMap, Opts) ->
|
||||||
pool := Pool
|
pool := Pool
|
||||||
}
|
}
|
||||||
} = Opts,
|
} = Opts,
|
||||||
Blob = mk_blob_name_key(BufferMap, ActionName, BlobTemplate),
|
Blob = mk_blob_name_key(Buffer, ActionName, BlobTemplate),
|
||||||
#{
|
#{
|
||||||
blob => Blob,
|
blob => Blob,
|
||||||
buffer => [],
|
buffer => [],
|
||||||
|
@ -363,8 +363,8 @@ init_transfer_state(BufferMap, Opts) ->
|
||||||
started => false
|
started => false
|
||||||
}.
|
}.
|
||||||
|
|
||||||
mk_blob_name_key(BufferMap, ActionName, BlobTemplate) ->
|
mk_blob_name_key(Buffer, ActionName, BlobTemplate) ->
|
||||||
emqx_template:render_strict(BlobTemplate, {?MODULE, {ActionName, BufferMap}}).
|
emqx_template:render_strict(BlobTemplate, {?MODULE, {ActionName, Buffer}}).
|
||||||
|
|
||||||
-spec process_append(iodata(), transfer_state()) ->
|
-spec process_append(iodata(), transfer_state()) ->
|
||||||
transfer_state().
|
transfer_state().
|
||||||
|
@ -455,34 +455,26 @@ process_complete(TransferState) ->
|
||||||
%% `emqx_template' API
|
%% `emqx_template' API
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
|
|
||||||
-spec lookup(emqx_template:accessor(), {_Name, buffer_map()}) ->
|
-spec lookup(emqx_template:accessor(), {_Name, buffer()}) ->
|
||||||
{ok, integer() | string()} | {error, undefined}.
|
{ok, integer() | string()} | {error, undefined}.
|
||||||
lookup([<<"action">>], {ActionName, _BufferMap}) ->
|
lookup([<<"action">>], {ActionName, _Buffer}) ->
|
||||||
{ok, mk_fs_safe_string(ActionName)};
|
{ok, mk_fs_safe_string(ActionName)};
|
||||||
lookup(Accessor, {_ActionName, BufferMap = #{}}) ->
|
lookup([<<"node">>], {_ActionName, _Buffer}) ->
|
||||||
lookup_buffer_var(Accessor, BufferMap);
|
{ok, mk_fs_safe_string(atom_to_binary(erlang:node()))};
|
||||||
|
lookup(Accessor, {_ActionName, Buffer}) ->
|
||||||
|
lookup_buffer_var(Accessor, Buffer);
|
||||||
lookup(_Accessor, _Context) ->
|
lookup(_Accessor, _Context) ->
|
||||||
{error, undefined}.
|
{error, undefined}.
|
||||||
|
|
||||||
lookup_buffer_var([<<"datetime">>, Format], #{since := Since}) ->
|
lookup_buffer_var(Accessor, Buffer) ->
|
||||||
{ok, format_timestamp(Since, Format)};
|
case emqx_connector_aggreg_buffer_ctx:lookup(Accessor, Buffer) of
|
||||||
lookup_buffer_var([<<"datetime_until">>, Format], #{until := Until}) ->
|
{ok, String} when is_list(String) ->
|
||||||
{ok, format_timestamp(Until, Format)};
|
{ok, mk_fs_safe_string(String)};
|
||||||
lookup_buffer_var([<<"sequence">>], #{seq := Seq}) ->
|
{ok, Value} ->
|
||||||
{ok, Seq};
|
{ok, Value};
|
||||||
lookup_buffer_var([<<"node">>], #{}) ->
|
{error, Reason} ->
|
||||||
{ok, mk_fs_safe_string(atom_to_binary(erlang:node()))};
|
{error, Reason}
|
||||||
lookup_buffer_var(_Binding, _Context) ->
|
end.
|
||||||
{error, undefined}.
|
|
||||||
|
|
||||||
format_timestamp(Timestamp, <<"rfc3339utc">>) ->
|
|
||||||
String = calendar:system_time_to_rfc3339(Timestamp, [{unit, second}, {offset, "Z"}]),
|
|
||||||
mk_fs_safe_string(String);
|
|
||||||
format_timestamp(Timestamp, <<"rfc3339">>) ->
|
|
||||||
String = calendar:system_time_to_rfc3339(Timestamp, [{unit, second}]),
|
|
||||||
mk_fs_safe_string(String);
|
|
||||||
format_timestamp(Timestamp, <<"unix">>) ->
|
|
||||||
Timestamp.
|
|
||||||
|
|
||||||
mk_fs_safe_string(String) ->
|
mk_fs_safe_string(String) ->
|
||||||
unicode:characters_to_binary(string:replace(String, ":", "_", all)).
|
unicode:characters_to_binary(string:replace(String, ":", "_", all)).
|
||||||
|
|
|
@ -407,8 +407,8 @@ iolist_to_string(IOList) ->
|
||||||
|
|
||||||
%% `emqx_connector_aggreg_delivery` APIs
|
%% `emqx_connector_aggreg_delivery` APIs
|
||||||
|
|
||||||
-spec init_transfer_state(buffer_map(), map()) -> emqx_s3_upload:t().
|
-spec init_transfer_state(buffer(), map()) -> emqx_s3_upload:t().
|
||||||
init_transfer_state(BufferMap, Opts) ->
|
init_transfer_state(Buffer, Opts) ->
|
||||||
#{
|
#{
|
||||||
bucket := Bucket,
|
bucket := Bucket,
|
||||||
upload_options := UploadOpts,
|
upload_options := UploadOpts,
|
||||||
|
@ -416,11 +416,11 @@ init_transfer_state(BufferMap, Opts) ->
|
||||||
uploader_config := UploaderConfig
|
uploader_config := UploaderConfig
|
||||||
} = Opts,
|
} = Opts,
|
||||||
Client = emqx_s3_client:create(Bucket, Config),
|
Client = emqx_s3_client:create(Bucket, Config),
|
||||||
Key = mk_object_key(BufferMap, Opts),
|
Key = mk_object_key(Buffer, Opts),
|
||||||
emqx_s3_upload:new(Client, Key, UploadOpts, UploaderConfig).
|
emqx_s3_upload:new(Client, Key, UploadOpts, UploaderConfig).
|
||||||
|
|
||||||
mk_object_key(BufferMap, #{action := AggregId, key := Template}) ->
|
mk_object_key(Buffer, #{action := AggregId, key := Template}) ->
|
||||||
emqx_template:render_strict(Template, {?MODULE, {AggregId, BufferMap}}).
|
emqx_template:render_strict(Template, {?MODULE, {AggregId, Buffer}}).
|
||||||
|
|
||||||
process_append(Writes, Upload0) ->
|
process_append(Writes, Upload0) ->
|
||||||
{ok, Upload} = emqx_s3_upload:append(Writes, Upload0),
|
{ok, Upload} = emqx_s3_upload:append(Writes, Upload0),
|
||||||
|
@ -454,34 +454,26 @@ process_terminate(Upload) ->
|
||||||
|
|
||||||
%% `emqx_template` APIs
|
%% `emqx_template` APIs
|
||||||
|
|
||||||
-spec lookup(emqx_template:accessor(), {_Name, buffer_map()}) ->
|
-spec lookup(emqx_template:accessor(), {_Name, buffer()}) ->
|
||||||
{ok, integer() | string()} | {error, undefined}.
|
{ok, integer() | string()} | {error, undefined}.
|
||||||
lookup([<<"action">>], {_AggregId = {_Type, Name}, _Buffer}) ->
|
lookup([<<"action">>], {_AggregId = {_Type, Name}, _Buffer}) ->
|
||||||
{ok, mk_fs_safe_string(Name)};
|
{ok, mk_fs_safe_string(Name)};
|
||||||
lookup(Accessor, {_AggregId, Buffer = #{}}) ->
|
lookup([<<"node">>], {_AggregId, _Buffer}) ->
|
||||||
|
{ok, mk_fs_safe_string(atom_to_binary(erlang:node()))};
|
||||||
|
lookup(Accessor, {_AggregId, Buffer}) ->
|
||||||
lookup_buffer_var(Accessor, Buffer);
|
lookup_buffer_var(Accessor, Buffer);
|
||||||
lookup(_Accessor, _Context) ->
|
lookup(_Accessor, _Context) ->
|
||||||
{error, undefined}.
|
{error, undefined}.
|
||||||
|
|
||||||
lookup_buffer_var([<<"datetime">>, Format], #{since := Since}) ->
|
lookup_buffer_var(Accessor, Buffer) ->
|
||||||
{ok, format_timestamp(Since, Format)};
|
case emqx_connector_aggreg_buffer_ctx:lookup(Accessor, Buffer) of
|
||||||
lookup_buffer_var([<<"datetime_until">>, Format], #{until := Until}) ->
|
{ok, String} when is_list(String) ->
|
||||||
{ok, format_timestamp(Until, Format)};
|
{ok, mk_fs_safe_string(String)};
|
||||||
lookup_buffer_var([<<"sequence">>], #{seq := Seq}) ->
|
{ok, Value} ->
|
||||||
{ok, Seq};
|
{ok, Value};
|
||||||
lookup_buffer_var([<<"node">>], #{}) ->
|
{error, Reason} ->
|
||||||
{ok, mk_fs_safe_string(atom_to_binary(erlang:node()))};
|
{error, Reason}
|
||||||
lookup_buffer_var(_Binding, _Context) ->
|
end.
|
||||||
{error, undefined}.
|
|
||||||
|
|
||||||
format_timestamp(Timestamp, <<"rfc3339utc">>) ->
|
|
||||||
String = calendar:system_time_to_rfc3339(Timestamp, [{unit, second}, {offset, "Z"}]),
|
|
||||||
mk_fs_safe_string(String);
|
|
||||||
format_timestamp(Timestamp, <<"rfc3339">>) ->
|
|
||||||
String = calendar:system_time_to_rfc3339(Timestamp, [{unit, second}]),
|
|
||||||
mk_fs_safe_string(String);
|
|
||||||
format_timestamp(Timestamp, <<"unix">>) ->
|
|
||||||
Timestamp.
|
|
||||||
|
|
||||||
mk_fs_safe_string(String) ->
|
mk_fs_safe_string(String) ->
|
||||||
unicode:characters_to_binary(string:replace(String, ":", "_", all)).
|
unicode:characters_to_binary(string:replace(String, ":", "_", all)).
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2024 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(emqx_connector_aggreg_buffer_ctx).
|
||||||
|
|
||||||
|
-behaviour(emqx_template).
|
||||||
|
|
||||||
|
-include("emqx_connector_aggregator.hrl").
|
||||||
|
|
||||||
|
%% `emqx_template' API
|
||||||
|
-export([lookup/2]).
|
||||||
|
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
%% Type declarations
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
%% `emqx_template' API
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-spec lookup(emqx_template:accessor(), buffer()) ->
|
||||||
|
{ok, integer() | string()} | {error, undefined}.
|
||||||
|
lookup([<<"datetime">>, Format], #buffer{since = Since}) ->
|
||||||
|
{ok, format_timestamp(Since, Format)};
|
||||||
|
lookup([<<"datetime_until">>, Format], #buffer{until = Until}) ->
|
||||||
|
{ok, format_timestamp(Until, Format)};
|
||||||
|
lookup([<<"sequence">>], #buffer{seq = Seq}) ->
|
||||||
|
{ok, Seq};
|
||||||
|
lookup(_Binding, _Context) ->
|
||||||
|
{error, undefined}.
|
||||||
|
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
%% Internal fns
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
format_timestamp(Timestamp, <<"rfc3339utc">>) ->
|
||||||
|
calendar:system_time_to_rfc3339(Timestamp, [{unit, second}, {offset, "Z"}]);
|
||||||
|
format_timestamp(Timestamp, <<"rfc3339">>) ->
|
||||||
|
calendar:system_time_to_rfc3339(Timestamp, [{unit, second}]);
|
||||||
|
format_timestamp(Timestamp, <<"unix">>) ->
|
||||||
|
Timestamp.
|
|
@ -48,7 +48,7 @@
|
||||||
|
|
||||||
%% @doc Initialize the transfer state, such as blob storage path, transfer options, client
|
%% @doc Initialize the transfer state, such as blob storage path, transfer options, client
|
||||||
%% credentials, etc. .
|
%% credentials, etc. .
|
||||||
-callback init_transfer_state(buffer_map(), map()) -> transfer_state().
|
-callback init_transfer_state(buffer(), map()) -> transfer_state().
|
||||||
|
|
||||||
%% @doc Append data to the transfer before sending. Usually should not fail.
|
%% @doc Append data to the transfer before sending. Usually should not fail.
|
||||||
-callback process_append(iodata(), transfer_state()) -> transfer_state().
|
-callback process_append(iodata(), transfer_state()) -> transfer_state().
|
||||||
|
@ -86,13 +86,12 @@ init_delivery(
|
||||||
callback_module := Mod
|
callback_module := Mod
|
||||||
}
|
}
|
||||||
) ->
|
) ->
|
||||||
BufferMap = emqx_connector_aggregator:buffer_to_map(Buffer),
|
|
||||||
#delivery{
|
#delivery{
|
||||||
id = Id,
|
id = Id,
|
||||||
callback_module = Mod,
|
callback_module = Mod,
|
||||||
container = mk_container(ContainerOpts),
|
container = mk_container(ContainerOpts),
|
||||||
reader = Reader,
|
reader = Reader,
|
||||||
transfer = Mod:init_transfer_state(BufferMap, Opts),
|
transfer = Mod:init_transfer_state(Buffer, Opts),
|
||||||
empty = true
|
empty = true
|
||||||
}.
|
}.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue