From a1fed1578975b252151aec03ef9fa3d7567e1d6e Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 8 May 2014 15:45:51 +0800 Subject: [PATCH] add uptime, startup time, load to api --- trunk/src/app/srs_app_config.cpp | 4 +- trunk/src/app/srs_app_config.hpp | 4 +- trunk/src/app/srs_app_http_api.cpp | 22 ++++++-- trunk/src/app/srs_app_http_hooks.cpp | 4 +- trunk/src/app/srs_app_server.cpp | 8 +++ trunk/src/kernel/srs_kernel_utility.cpp | 68 +++++++++++++++++++++++-- trunk/src/kernel/srs_kernel_utility.hpp | 26 ++++++++++ 7 files changed, 121 insertions(+), 15 deletions(-) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 69b6b2977..e317113cf 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -1263,12 +1263,12 @@ void SrsConfig::print_help(char** argv) argv[0], argv[0], argv[0], argv[0]); } -string SrsConfig::get_cwd() +string SrsConfig::cwd() { return _cwd; } -string SrsConfig::get_argv() +string SrsConfig::argv() { return _argv; } diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 6cd851de9..a61622be8 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -149,8 +149,8 @@ private: virtual int parse_argv(int& i, char** argv); virtual void print_help(char** argv); public: - virtual std::string get_cwd(); - virtual std::string get_argv(); + virtual std::string cwd(); + virtual std::string argv(); // global section public: virtual SrsConfDirective* get_root(); diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 86b1caf2e..81d6b9fe3 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -205,12 +205,16 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) SrsProcSystemStat* s = srs_get_system_proc_stat(); SrsCpuInfo* c = srs_get_cpuinfo(); SrsMemInfo* m = srs_get_meminfo(); + SrsPlatformInfo* p = srs_get_platform_info(); float self_mem_percent = 0; if (m->MemTotal > 0) { self_mem_percent = (float)(r->r.ru_maxrss / (double)m->MemTotal); } + int64_t now = srs_get_system_time_ms(); + double srs_uptime = (now - p->srs_startup_time) / 100 / 10.0; + ss << JOBJECT_START << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT << JFIELD_ORG("data", JOBJECT_START) @@ -219,14 +223,17 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) << JFIELD_ORG("system_cpu_stat_ok", (s->ok? "true":"false")) << JFIELD_CONT << JFIELD_ORG("cpuinfo_ok", (c->ok? "true":"false")) << JFIELD_CONT << JFIELD_ORG("meminfo_ok", (m->ok? "true":"false")) << JFIELD_CONT + << JFIELD_ORG("platform_ok", (p->ok? "true":"false")) << JFIELD_CONT + << JFIELD_ORG("now", now) << JFIELD_CONT << JFIELD_ORG("self", JOBJECT_START) << JFIELD_ORG("pid", getpid()) << JFIELD_CONT << JFIELD_ORG("ppid", u->ppid) << JFIELD_CONT - << JFIELD_STR("argv", _srs_config->get_argv()) << JFIELD_CONT - << JFIELD_STR("cwd", _srs_config->get_cwd()) << JFIELD_CONT + << JFIELD_STR("argv", _srs_config->argv()) << JFIELD_CONT + << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT << JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT << JFIELD_ORG("mem_percent", self_mem_percent) << JFIELD_CONT - << JFIELD_ORG("cpu_percent", u->percent) + << JFIELD_ORG("cpu_percent", u->percent) << JFIELD_CONT + << JFIELD_ORG("srs_uptime", srs_uptime) << JOBJECT_END << JFIELD_CONT << JFIELD_ORG("system", JOBJECT_START) << JFIELD_ORG("cpu_percent", s->percent) << JFIELD_CONT @@ -234,8 +241,13 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) << JFIELD_ORG("mem_ram_percent", m->percent_ram) << JFIELD_CONT << JFIELD_ORG("mem_swap_kbyte", m->SwapTotal) << JFIELD_CONT << JFIELD_ORG("mem_swap_percent", m->percent_swap) << JFIELD_CONT - << JFIELD_ORG("nb_processors", c->nb_processors) << JFIELD_CONT - << JFIELD_ORG("nb_processors_online", c->nb_processors_online) + << JFIELD_ORG("cpus", c->nb_processors) << JFIELD_CONT + << JFIELD_ORG("cpus_online", c->nb_processors_online) << JFIELD_CONT + << JFIELD_ORG("uptime", p->os_uptime) << JFIELD_CONT + << JFIELD_ORG("ilde_time", p->os_ilde_time) << JFIELD_CONT + << JFIELD_ORG("load_1m", p->load_one_minutes) << JFIELD_CONT + << JFIELD_ORG("load_5m", p->load_five_minutes) << JFIELD_CONT + << JFIELD_ORG("load_15m", p->load_fifteen_minutes) << JOBJECT_END << JOBJECT_END << JOBJECT_END; diff --git a/trunk/src/app/srs_app_http_hooks.cpp b/trunk/src/app/srs_app_http_hooks.cpp index ef87f9051..536bed356 100644 --- a/trunk/src/app/srs_app_http_hooks.cpp +++ b/trunk/src/app/srs_app_http_hooks.cpp @@ -479,7 +479,7 @@ void SrsHttpHooks::on_dvr_hss_reap_flv_header(std::string url, SrsRequest* req, << JFIELD_STR("app", req->app) << JFIELD_CONT << JFIELD_STR("stream", req->stream) << JFIELD_CONT << JFIELD_NAME("segment") << JOBJECT_START - << JFIELD_STR("cwd", _srs_config->get_cwd()) << JFIELD_CONT + << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT << JFIELD_STR("path", header_file) << JOBJECT_END << JOBJECT_END; @@ -532,7 +532,7 @@ void SrsHttpHooks::on_dvr_hss_reap_flv(string url, SrsRequest* req, SrsFlvSegmen << JFIELD_STR("app", req->app) << JFIELD_CONT << JFIELD_STR("stream", req->stream) << JFIELD_CONT << JFIELD_NAME("segment") << JOBJECT_START - << JFIELD_STR("cwd", _srs_config->get_cwd()) << JFIELD_CONT + << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT << JFIELD_STR("path", segment->path) << JFIELD_CONT << JFIELD_ORG("duration", segment->duration) << JFIELD_CONT << JFIELD_ORG("offset", segment->sequence_header_offset) << JFIELD_CONT diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index b6f6733d2..86395403f 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -71,6 +71,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // SRS_SYS_CYCLE_INTERVAL * SRS_SYS_MEMINFO_RESOLUTION_TIMES #define SRS_SYS_MEMINFO_RESOLUTION_TIMES 60 +// update platform info interval: +// SRS_SYS_CYCLE_INTERVAL * SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES +#define SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES 80 + SrsListener::SrsListener(SrsServer* server, SrsListenerType type) { fd = -1; @@ -623,6 +627,7 @@ int SrsServer::do_cycle() max = srs_max(max, SRS_SYS_RUSAGE_RESOLUTION_TIMES); max = srs_max(max, SRS_SYS_CPU_STAT_RESOLUTION_TIMES); max = srs_max(max, SRS_SYS_MEMINFO_RESOLUTION_TIMES); + max = srs_max(max, SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES); // the deamon thread, update the time cache while (true) { @@ -665,6 +670,9 @@ int SrsServer::do_cycle() if ((i % SRS_SYS_MEMINFO_RESOLUTION_TIMES) == 0) { srs_update_meminfo(); } + if ((i % SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES) == 0) { + srs_update_platform_info(); + } } } diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 732547566..73d09782e 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -224,13 +224,13 @@ bool get_proc_self_stat(SrsProcSelfStat& r) &r.wchan, &r.nswap, &r.cnswap, &r.exit_signal, &r.processor, &r.rt_priority, &r.policy, &r.delayacct_blkio_ticks, &r.guest_time, &r.cguest_time); + + fclose(f); if (ret >= 0) { r.ok = true; } - fclose(f); - return r.ok; } @@ -349,6 +349,8 @@ void srs_update_meminfo() } } + fclose(f); + r.sample_time = srs_get_system_time_ms(); r.MemActive = r.MemTotal - r.MemFree; r.RealInUse = r.MemActive - r.Buffers - r.Cached; @@ -361,8 +363,6 @@ void srs_update_meminfo() if (r.SwapTotal > 0) { r.percent_swap = (float)((r.SwapTotal - r.SwapFree) / (double)r.SwapTotal); } - - fclose(f); } SrsCpuInfo::SrsCpuInfo() @@ -388,3 +388,63 @@ SrsCpuInfo* srs_get_cpuinfo() return cpu; } + +SrsPlatformInfo::SrsPlatformInfo() +{ + ok = false; + + srs_startup_time = srs_get_system_time_ms(); + + os_uptime = 0; + os_ilde_time = 0; + + load_one_minutes = 0; + load_five_minutes = 0; + load_fifteen_minutes = 0; +} + +static SrsPlatformInfo _srs_system_platform_info; + +SrsPlatformInfo* srs_get_platform_info() +{ + return &_srs_system_platform_info; +} + +void srs_update_platform_info() +{ + SrsPlatformInfo& r = _srs_system_platform_info; + r.ok = true; + + if (true) { + FILE* f = fopen("/proc/uptime", "r"); + if (f == NULL) { + srs_warn("open uptime failed, ignore"); + return; + } + + int ret = fscanf(f, "%lf %lf\n", &r.os_uptime, &r.os_ilde_time); + + fclose(f); + + if (ret < 0) { + r.ok = false; + } + } + + if (true) { + FILE* f = fopen("/proc/loadavg", "r"); + if (f == NULL) { + srs_warn("open loadavg failed, ignore"); + return; + } + + int ret = fscanf(f, "%lf %lf %lf\n", + &r.load_one_minutes, &r.load_five_minutes, &r.load_fifteen_minutes); + + fclose(f); + + if (ret < 0) { + r.ok = false; + } + } +} diff --git a/trunk/src/kernel/srs_kernel_utility.hpp b/trunk/src/kernel/srs_kernel_utility.hpp index 5bda02646..6c1659fc0 100644 --- a/trunk/src/kernel/srs_kernel_utility.hpp +++ b/trunk/src/kernel/srs_kernel_utility.hpp @@ -313,4 +313,30 @@ struct SrsCpuInfo // get system cpu info, use cache to avoid performance problem. extern SrsCpuInfo* srs_get_cpuinfo(); +// platform(os, srs) summary +struct SrsPlatformInfo +{ + // whether the data is ok. + bool ok; + + // srs startup time, in ms. + int64_t srs_startup_time; + + // @see: cat /proc/uptime + double os_uptime; + double os_ilde_time; + + // @see: cat /proc/loadavg + double load_one_minutes; + double load_five_minutes; + double load_fifteen_minutes; + + SrsPlatformInfo(); +}; + +// get platform info, use cache to avoid performance problem. +extern SrsPlatformInfo* srs_get_platform_info(); +// the deamon st-thread will update it. +extern void srs_update_platform_info(); + #endif