diff --git a/conf/config.ini b/conf/config.ini index abff3892..d8c64678 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -131,8 +131,12 @@ on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found #服务器启动报告,可以用于服务器的崩溃重启事件监听 on_server_started=https://127.0.0.1/index/hook/on_server_started +#server保活上报 +on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive #hook api最大等待回复时间,单位秒 timeoutSec=10 +#keepalive hook触发间隔,单位秒,float类型 +alive_interval=10.0 [http] #http服务器字符编码,windows上默认gb2312 diff --git a/server/WebApi.cpp b/server/WebApi.cpp index ebebdb81..b9f9d593 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -348,6 +348,36 @@ Value makeMediaSourceJson(MediaSource &media){ return item; } +Value getStatisticJson() { + Value val(objectValue); + val["MediaSource"] = (Json::UInt64)(ObjectStatistic::count()); + val["MultiMediaSourceMuxer"] = (Json::UInt64)(ObjectStatistic::count()); + + val["TcpServer"] = (Json::UInt64)(ObjectStatistic::count()); + val["TcpSession"] = (Json::UInt64)(ObjectStatistic::count()); + val["UdpServer"] = (Json::UInt64)(ObjectStatistic::count()); + val["UdpSession"] = (Json::UInt64)(ObjectStatistic::count()); + val["TcpClient"] = (Json::UInt64)(ObjectStatistic::count()); + val["Socket"] = (Json::UInt64)(ObjectStatistic::count()); + + val["FrameImp"] = (Json::UInt64)(ObjectStatistic::count()); + val["Frame"] = (Json::UInt64)(ObjectStatistic::count()); + + val["Buffer"] = (Json::UInt64)(ObjectStatistic::count()); + val["BufferRaw"] = (Json::UInt64)(ObjectStatistic::count()); + val["BufferLikeString"] = (Json::UInt64)(ObjectStatistic::count()); + val["BufferList"] = (Json::UInt64)(ObjectStatistic::count()); + + val["RtpPacket"] = (Json::UInt64)(ObjectStatistic::count()); + val["RtmpPacket"] = (Json::UInt64)(ObjectStatistic::count()); +#ifdef ENABLE_MEM_DEBUG + auto bytes = getTotalMemUsage(); + val["totalMemUsage"] = (Json::UInt64)bytes; + val["totalMemUsageMB"] = (int)(bytes / 1024 / 1024); +#endif + return val; +} + /** * 安装api接口 * 所有api都支持GET和POST两种方式 @@ -1150,31 +1180,7 @@ void installWebApi() { api_regist("/index/api/getStatistic",[](API_ARGS_MAP){ CHECK_SECRET(); - val["data"]["MediaSource"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["MultiMediaSourceMuxer"] = (Json::UInt64)(ObjectStatistic::count()); - - val["data"]["TcpServer"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["TcpSession"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["UdpServer"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["UdpSession"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["TcpClient"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["Socket"] = (Json::UInt64)(ObjectStatistic::count()); - - val["data"]["FrameImp"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["Frame"] = (Json::UInt64)(ObjectStatistic::count()); - - val["data"]["Buffer"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["BufferRaw"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["BufferLikeString"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["BufferList"] = (Json::UInt64)(ObjectStatistic::count()); - - val["data"]["RtpPacket"] = (Json::UInt64)(ObjectStatistic::count()); - val["data"]["RtmpPacket"] = (Json::UInt64)(ObjectStatistic::count()); -#ifdef ENABLE_MEM_DEBUG - auto bytes = getTotalMemUsage(); - val["data"]["totalMemUsage"] = (Json::UInt64)bytes; - val["data"]["totalMemUsageMB"] = (int)(bytes / 1024 / 1024); -#endif + val["data"] = getStatisticJson(); }); #ifdef ENABLE_WEBRTC diff --git a/server/WebApi.h b/server/WebApi.h index 6665b687..e713af61 100755 --- a/server/WebApi.h +++ b/server/WebApi.h @@ -235,4 +235,5 @@ bool checkArgs(Args &args, const First &first, const KeyTypes &...keys) { void installWebApi(); void unInstallWebApi(); Value makeMediaSourceJson(MediaSource &media); +Value getStatisticJson(); #endif //ZLMEDIAKIT_WEBAPI_H diff --git a/server/WebHook.cpp b/server/WebHook.cpp index 73c4d00f..47a173fe 100755 --- a/server/WebHook.cpp +++ b/server/WebHook.cpp @@ -42,7 +42,9 @@ const string kOnShellLogin = HOOK_FIELD"on_shell_login"; const string kOnStreamNoneReader = HOOK_FIELD"on_stream_none_reader"; const string kOnHttpAccess = HOOK_FIELD"on_http_access"; const string kOnServerStarted = HOOK_FIELD"on_server_started"; +const string kOnServerKeepalive = HOOK_FIELD"on_server_keepalive"; const string kAdminParams = HOOK_FIELD"admin_params"; +const string kAliveInterval = HOOK_FIELD"alive_interval"; onceToken token([](){ mINI::Instance()[kEnable] = false; @@ -61,7 +63,9 @@ onceToken token([](){ mINI::Instance()[kOnStreamNoneReader] = ""; mINI::Instance()[kOnHttpAccess] = ""; mINI::Instance()[kOnServerStarted] = ""; + mINI::Instance()[kOnServerKeepalive] = ""; mINI::Instance()[kAdminParams] = "secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc"; + mINI::Instance()[kAliveInterval] = 30.0; },nullptr); }//namespace Hook @@ -184,6 +188,27 @@ static void reportServerStarted(){ do_http_hook(hook_server_started,body, nullptr); } +// 服务器定时保活定时器 +static Timer::Ptr g_keepalive_timer; +static void reportServerKeepalive() { + GET_CONFIG(bool, hook_enable, Hook::kEnable); + GET_CONFIG(string, hook_server_keepalive, Hook::kOnServerKeepalive); + if (!hook_enable || hook_server_keepalive.empty()) { + return; + } + + GET_CONFIG(float, alive_interval, Hook::kAliveInterval); + g_keepalive_timer = std::make_shared(alive_interval, []() { + ArgsType body; + body["data"] = getStatisticJson(); + + //执行hook + do_http_hook(hook_server_keepalive, body, nullptr); + + return true; + }, nullptr); +} + void installWebHook(){ GET_CONFIG(bool,hook_enable,Hook::kEnable); GET_CONFIG(string,hook_adminparams,Hook::kAdminParams); @@ -484,8 +509,11 @@ void installWebHook(){ //汇报服务器重新启动 reportServerStarted(); + + //定时上报保活 + reportServerKeepalive(); } void unInstallWebHook(){ - + g_keepalive_timer.reset(); }