diff --git a/src/docker/docker_deployer.erl b/src/docker/docker_deployer.erl index 889c1fd..b78e1f9 100644 --- a/src/docker/docker_deployer.erl +++ b/src/docker/docker_deployer.erl @@ -47,24 +47,29 @@ deploy(TaskId, ContainerDir, Params = #'ContainerDeployParams'{ container_name = ContainerName, spec = #'ContainerSpec'{image = Image0} }) when is_integer(TaskId), is_list(ContainerDir) -> - trace_log(TaskId, <<"info">>, <<"开始部署容器:"/utf8, ContainerName/binary>>), + report_task_event(TaskId, <<"info">>, <<"开始部署容器:"/utf8, ContainerName/binary>>), try ok = ensure_container_absent(TaskId, ContainerName), - {ok, _Image} = ensure_image_ready(TaskId, Image0), + {ok, Image} = ensure_image_ready(TaskId, Image0), {ok, ContainerId} = create_container_and_config(TaskId, ContainerDir, Params), ShortContainerId = short_container_id(ContainerId), - trace_log(TaskId, <<"info">>, <<"容器创建成功: "/utf8, ShortContainerId/binary>>), - trace_log(TaskId, <<"info">>, <<"任务完成"/utf8>>), + report_task_event(TaskId, <<"info">>, <<"容器创建成功: "/utf8, ShortContainerId/binary>>), + report_task_event(TaskId, <<"info">>, <<"任务完成"/utf8>>), + write_task_summary(TaskId, <<"success">>, ContainerName, Image, ContainerId), efka_task_reporter:close(TaskId, ?TASK_SUCCESS) catch throw:{deploy_error, Reason} -> - trace_log(TaskId, <<"error">>, Reason), - trace_log(TaskId, <<"error">>, <<"任务失败"/utf8>>), + report_task_event(TaskId, <<"error">>, Reason), + report_task_event(TaskId, <<"error">>, <<"任务失败"/utf8>>), + write_task_summary(TaskId, <<"fail">>, ContainerName, Image0, undefined), + write_task_failure_reason(TaskId, Reason), efka_task_reporter:close(TaskId, ?TASK_FAIL); Class:Reason:Stacktrace -> Error = iolist_to_binary(io_lib:format("deploy crashed: ~p:~p ~p", [Class, Reason, Stacktrace])), - trace_log(TaskId, <<"error">>, Error), - trace_log(TaskId, <<"error">>, <<"任务失败"/utf8>>), + report_task_event(TaskId, <<"error">>, Error), + report_task_event(TaskId, <<"error">>, <<"任务失败"/utf8>>), + write_task_summary(TaskId, <<"fail">>, ContainerName, Image0, undefined), + write_task_failure_reason(TaskId, Error), efka_task_reporter:close(TaskId, ?TASK_FAIL) end. @@ -78,27 +83,53 @@ normalize_image(Image) when is_binary(Image) -> end, iolist_to_binary(lists:join(<<"/">>, PrefixParts ++ [NormalizedLast])). --spec trace_log(TaskId :: integer(), Level :: binary(), Msg :: binary()) -> no_return(). -trace_log(TaskId, Level, Msg) when is_integer(TaskId), is_binary(Level), is_binary(Msg) -> - efka_task_reporter:stream(TaskId, Level, Msg), - Info = iolist_to_binary([<<"task_id=">>, integer_to_binary(TaskId), <<" ">>, Level, <<" ">>, Msg]), +-spec report_task_event(TaskId :: integer(), Level :: binary(), Msg :: binary()) -> ok. +report_task_event(TaskId, Level, Msg) when is_integer(TaskId), is_binary(Level), is_binary(Msg) -> + efka_task_reporter:stream(TaskId, Level, Msg). + +-spec write_task_summary(integer(), binary(), binary(), binary(), undefined | binary()) -> ok. +write_task_summary(TaskId, Status, ContainerName, Image, ContainerId) + when is_integer(TaskId), is_binary(Status), is_binary(ContainerName), is_binary(Image) -> + Fields0 = [ + <<"type=deploy_summary">>, + <<"task_id=">>, integer_to_binary(TaskId), + <<" status=">>, Status, + <<" container_name=">>, ContainerName, + <<" image=">>, Image + ], + Fields = case ContainerId of + undefined -> + Fields0; + _ when is_binary(ContainerId) -> + Fields0 ++ [<<" container_id=">>, short_container_id(ContainerId)] + end, + efka_logger:write(iolist_to_binary(Fields)). + +-spec write_task_failure_reason(integer(), binary()) -> ok. +write_task_failure_reason(TaskId, Reason) when is_integer(TaskId), is_binary(Reason) -> + Info = iolist_to_binary([ + <<"type=deploy_failure_reason task_id=">>, + integer_to_binary(TaskId), + <<" reason=">>, + Reason + ]), efka_logger:write(Info). -spec ensure_container_absent(TaskId :: integer(), ContainerName :: binary()) -> ok. ensure_container_absent(TaskId, ContainerName) when is_integer(TaskId), is_binary(ContainerName) -> - trace_log(TaskId, <<"info">>, <<"开始创建容器: "/utf8, ContainerName/binary>>), + report_task_event(TaskId, <<"info">>, <<"开始创建容器: "/utf8, ContainerName/binary>>), ok. -spec ensure_image_ready(TaskId :: integer(), Image0 :: binary()) -> {ok, binary()}. ensure_image_ready(TaskId, Image0) when is_integer(TaskId), is_binary(Image0) -> Image = normalize_image(Image0), - trace_log(TaskId, <<"info">>, <<"使用镜像:"/utf8, Image/binary>>), - trace_log(TaskId, <<"info">>, <<"开始拉取镜像:"/utf8, Image/binary>>), + report_task_event(TaskId, <<"info">>, <<"使用镜像:"/utf8, Image/binary>>), + report_task_event(TaskId, <<"info">>, <<"开始拉取镜像:"/utf8, Image/binary>>), CB = fun ({message, M}) -> - trace_log(TaskId, <<"info">>, M); + report_task_event(TaskId, <<"info">>, M); ({error, Error}) -> - trace_log(TaskId, <<"error">>, Error) + report_task_event(TaskId, <<"error">>, Error) end, case docker_commands:pull_image(Image, CB) of ok -> @@ -135,7 +166,7 @@ create_config_file(TaskId, ContainerDir) when is_integer(TaskId), is_list(Contai ok; {error, Reason} -> ReasonBin = list_to_binary(io_lib:format("~p", [Reason])), - trace_log(TaskId, <<"notice">>, <<"创建配置文件失败: "/utf8, ReasonBin/binary>>), + report_task_event(TaskId, <<"notice">>, <<"创建配置文件失败: "/utf8, ReasonBin/binary>>), ok end.