From 951a93ab866d5b158ffa05724a954723ed62f708 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 19 Apr 2014 21:43:13 +0800 Subject: [PATCH] get self proc and system proc stat --- trunk/src/app/srs_app_http_api.cpp | 120 +++++++++++++++++++++++- trunk/src/app/srs_app_http_api.hpp | 22 +++++ trunk/src/app/srs_app_server.cpp | 2 +- trunk/src/kernel/srs_kernel_utility.cpp | 18 ++-- trunk/src/kernel/srs_kernel_utility.hpp | 14 +-- 5 files changed, 156 insertions(+), 20 deletions(-) diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 0661a0856..1732098c7 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -118,6 +118,8 @@ SrsApiV1::SrsApiV1() handlers.push_back(new SrsApiVersion()); handlers.push_back(new SrsApiSummaries()); handlers.push_back(new SrsApiRusages()); + handlers.push_back(new SrsApiSelfProcStats()); + handlers.push_back(new SrsApiSystemProcStats()); handlers.push_back(new SrsApiAuthors()); } @@ -140,7 +142,8 @@ int SrsApiV1::do_process_request(SrsSocket* skt, SrsHttpMessage* req) << JFIELD_STR("versions", "the version of SRS") << JFIELD_CONT << JFIELD_STR("summaries", "the summary(pid, argv, pwd, cpu, mem) of SRS") << JFIELD_CONT << JFIELD_STR("rusages", "the rusage of SRS") << JFIELD_CONT - << JFIELD_STR("proc_stats", "the /proc/self/stat of SRS") << JFIELD_CONT + << JFIELD_STR("self_proc_stats", "the self process stats") << JFIELD_CONT + << JFIELD_STR("system_proc_stats", "the system process stats") << JFIELD_CONT << JFIELD_STR("authors", "the primary authors and contributors") << JOBJECT_END << JOBJECT_END; @@ -196,8 +199,8 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) std::stringstream ss; SrsRusage* r = srs_get_system_rusage(); - SrsCpuSelfStat* u = srs_get_self_cpu_stat(); - SrsCpuSystemStat* s = srs_get_system_cpu_stat(); + SrsProcSelfStat* u = srs_get_self_proc_stat(); + SrsProcSystemStat* s = srs_get_system_proc_stat(); ss << JOBJECT_START << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT @@ -261,6 +264,117 @@ int SrsApiRusages::do_process_request(SrsSocket* skt, SrsHttpMessage* req) return res_json(skt, req, ss.str()); } +SrsApiSelfProcStats::SrsApiSelfProcStats() +{ +} + +SrsApiSelfProcStats::~SrsApiSelfProcStats() +{ +} + +bool SrsApiSelfProcStats::can_handle(const char* path, int length, const char** /*pchild*/) +{ + return srs_path_equals("/self_proc_stats", path, length); +} + +int SrsApiSelfProcStats::do_process_request(SrsSocket* skt, SrsHttpMessage* req) +{ + std::stringstream ss; + + SrsProcSelfStat* u = srs_get_self_proc_stat(); + + ss << JOBJECT_START + << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT + << JFIELD_ORG("data", JOBJECT_START) + << JFIELD_ORG("self_cpu_stat_ok", (u->ok? "true":"false")) << JFIELD_CONT + << JFIELD_ORG("pid", u->pid) << JFIELD_CONT + << JFIELD_STR("comm", u->comm) << JFIELD_CONT + << JFIELD_STR("state", u->state) << JFIELD_CONT + << JFIELD_ORG("ppid", u->ppid) << JFIELD_CONT + << JFIELD_ORG("pgrp", u->pgrp) << JFIELD_CONT + << JFIELD_ORG("session", u->session) << JFIELD_CONT + << JFIELD_ORG("tty_nr", u->tty_nr) << JFIELD_CONT + << JFIELD_ORG("tpgid", u->tpgid) << JFIELD_CONT + << JFIELD_ORG("flags", u->flags) << JFIELD_CONT + << JFIELD_ORG("minflt", u->minflt) << JFIELD_CONT + << JFIELD_ORG("cminflt", u->cminflt) << JFIELD_CONT + << JFIELD_ORG("majflt", u->majflt) << JFIELD_CONT + << JFIELD_ORG("cmajflt", u->cmajflt) << JFIELD_CONT + << JFIELD_ORG("utime", u->utime) << JFIELD_CONT + << JFIELD_ORG("stime", u->stime) << JFIELD_CONT + << JFIELD_ORG("cutime", u->cutime) << JFIELD_CONT + << JFIELD_ORG("cstime", u->cstime) << JFIELD_CONT + << JFIELD_ORG("priority", u->priority) << JFIELD_CONT + << JFIELD_ORG("nice", u->nice) << JFIELD_CONT + << JFIELD_ORG("num_threads", u->num_threads) << JFIELD_CONT + << JFIELD_ORG("itrealvalue", u->itrealvalue) << JFIELD_CONT + << JFIELD_ORG("starttime", u->starttime) << JFIELD_CONT + << JFIELD_ORG("vsize", u->vsize) << JFIELD_CONT + << JFIELD_ORG("rss", u->rss) << JFIELD_CONT + << JFIELD_ORG("rsslim", u->rsslim) << JFIELD_CONT + << JFIELD_ORG("startcode", u->startcode) << JFIELD_CONT + << JFIELD_ORG("endcode", u->endcode) << JFIELD_CONT + << JFIELD_ORG("startstack", u->startstack) << JFIELD_CONT + << JFIELD_ORG("kstkesp", u->kstkesp) << JFIELD_CONT + << JFIELD_ORG("kstkeip", u->kstkeip) << JFIELD_CONT + << JFIELD_ORG("signal", u->signal) << JFIELD_CONT + << JFIELD_ORG("blocked", u->blocked) << JFIELD_CONT + << JFIELD_ORG("sigignore", u->sigignore) << JFIELD_CONT + << JFIELD_ORG("sigcatch", u->sigcatch) << JFIELD_CONT + << JFIELD_ORG("wchan", u->wchan) << JFIELD_CONT + << JFIELD_ORG("nswap", u->nswap) << JFIELD_CONT + << JFIELD_ORG("cnswap", u->cnswap) << JFIELD_CONT + << JFIELD_ORG("exit_signal", u->exit_signal) << JFIELD_CONT + << JFIELD_ORG("processor", u->processor) << JFIELD_CONT + << JFIELD_ORG("rt_priority", u->rt_priority) << JFIELD_CONT + << JFIELD_ORG("policy", u->policy) << JFIELD_CONT + << JFIELD_ORG("delayacct_blkio_ticks", u->delayacct_blkio_ticks) << JFIELD_CONT + << JFIELD_ORG("guest_time", u->guest_time) << JFIELD_CONT + << JFIELD_ORG("cguest_time", u->cguest_time) + << JOBJECT_END + << JOBJECT_END; + + return res_json(skt, req, ss.str()); +} + +SrsApiSystemProcStats::SrsApiSystemProcStats() +{ +} + +SrsApiSystemProcStats::~SrsApiSystemProcStats() +{ +} + +bool SrsApiSystemProcStats::can_handle(const char* path, int length, const char** /*pchild*/) +{ + return srs_path_equals("/system_proc_stats", path, length); +} + +int SrsApiSystemProcStats::do_process_request(SrsSocket* skt, SrsHttpMessage* req) +{ + std::stringstream ss; + + SrsProcSystemStat* s = srs_get_system_proc_stat(); + + ss << JOBJECT_START + << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT + << JFIELD_ORG("data", JOBJECT_START) + << JFIELD_ORG("system_cpu_stat_ok", (s->ok? "true":"false")) << JFIELD_CONT + << JFIELD_ORG("user", s->user) << JFIELD_CONT + << JFIELD_ORG("nice", s->nice) << JFIELD_CONT + << JFIELD_ORG("sys", s->sys) << JFIELD_CONT + << JFIELD_ORG("idle", s->idle) << JFIELD_CONT + << JFIELD_ORG("iowait", s->iowait) << JFIELD_CONT + << JFIELD_ORG("irq", s->irq) << JFIELD_CONT + << JFIELD_ORG("softirq", s->softirq) << JFIELD_CONT + << JFIELD_ORG("steal", s->steal) << JFIELD_CONT + << JFIELD_ORG("guest", s->guest) + << JOBJECT_END + << JOBJECT_END; + + return res_json(skt, req, ss.str()); +} + SrsApiAuthors::SrsApiAuthors() { } diff --git a/trunk/src/app/srs_app_http_api.hpp b/trunk/src/app/srs_app_http_api.hpp index 831c38bef..850e1bf79 100644 --- a/trunk/src/app/srs_app_http_api.hpp +++ b/trunk/src/app/srs_app_http_api.hpp @@ -109,6 +109,28 @@ protected: virtual int do_process_request(SrsSocket* skt, SrsHttpMessage* req); }; +class SrsApiSelfProcStats : public SrsHttpHandler +{ +public: + SrsApiSelfProcStats(); + virtual ~SrsApiSelfProcStats(); +public: + virtual bool can_handle(const char* path, int length, const char** pchild); +protected: + virtual int do_process_request(SrsSocket* skt, SrsHttpMessage* req); +}; + +class SrsApiSystemProcStats : public SrsHttpHandler +{ +public: + SrsApiSystemProcStats(); + virtual ~SrsApiSystemProcStats(); +public: + virtual bool can_handle(const char* path, int length, const char** pchild); +protected: + virtual int do_process_request(SrsSocket* skt, SrsHttpMessage* req); +}; + class SrsApiAuthors : public SrsHttpHandler { public: diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 2b13a0ab1..a55a76756 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -447,7 +447,7 @@ int SrsServer::cycle() srs_update_system_rusage(); } if (i == SRS_SYS_CPU_STAT_RESOLUTION_TIMES) { - srs_update_system_cpu_stat(); + srs_update_proc_stat(); } } } diff --git a/trunk/src/kernel/srs_kernel_utility.cpp b/trunk/src/kernel/srs_kernel_utility.cpp index 340300ca2..67a51eeaa 100644 --- a/trunk/src/kernel/srs_kernel_utility.cpp +++ b/trunk/src/kernel/srs_kernel_utility.cpp @@ -81,30 +81,30 @@ void srs_update_system_rusage() _srs_system_rusage.ok = true; } -static SrsCpuSelfStat _srs_system_cpu_self_stat; -static SrsCpuSystemStat _srs_system_cpu_system_stat; +static SrsProcSelfStat _srs_system_cpu_self_stat; +static SrsProcSystemStat _srs_system_cpu_system_stat; -SrsCpuSelfStat::SrsCpuSelfStat() +SrsProcSelfStat::SrsProcSelfStat() { ok = false; } -SrsCpuSystemStat::SrsCpuSystemStat() +SrsProcSystemStat::SrsProcSystemStat() { ok = false; } -SrsCpuSelfStat* srs_get_self_cpu_stat() +SrsProcSelfStat* srs_get_self_proc_stat() { return &_srs_system_cpu_self_stat; } -SrsCpuSystemStat* srs_get_system_cpu_stat() +SrsProcSystemStat* srs_get_system_proc_stat() { return &_srs_system_cpu_system_stat; } -void srs_update_system_cpu_stat() +void srs_update_proc_stat() { // system cpu stat if (true) { @@ -114,7 +114,7 @@ void srs_update_system_cpu_stat() return; } - SrsCpuSystemStat& r = _srs_system_cpu_system_stat; + SrsProcSystemStat& r = _srs_system_cpu_system_stat; for (;;) { int ret = fscanf(f, "%4s %lu %lu %lu %lu %lu " "%lu %lu %lu %lu\n", @@ -143,7 +143,7 @@ void srs_update_system_cpu_stat() return; } - SrsCpuSelfStat& r = _srs_system_cpu_self_stat; + SrsProcSelfStat& r = _srs_system_cpu_self_stat; int ret = fscanf(f, "%d %32s %c %d %d %d %d " "%d %u %lu %lu %lu %lu " "%lu %lu %ld %ld %ld %ld " diff --git a/trunk/src/kernel/srs_kernel_utility.hpp b/trunk/src/kernel/srs_kernel_utility.hpp index fb3a7d443..8a02395f0 100644 --- a/trunk/src/kernel/srs_kernel_utility.hpp +++ b/trunk/src/kernel/srs_kernel_utility.hpp @@ -52,7 +52,7 @@ extern SrsRusage* srs_get_system_rusage(); extern void srs_update_system_rusage(); // @see: man 5 proc, /proc/[pid]/stat -struct SrsCpuSelfStat +struct SrsProcSelfStat { // whether the data is ok. bool ok; @@ -195,11 +195,11 @@ struct SrsCpuSelfStat // Guest time of the process’s children, measured in clock ticks (divide by sysconf(_SC_CLK_TCK). long cguest_time; - SrsCpuSelfStat(); + SrsProcSelfStat(); }; // @see: man 5 proc, /proc/stat -struct SrsCpuSystemStat +struct SrsProcSystemStat { // whether the data is ok. bool ok; @@ -238,14 +238,14 @@ struct SrsCpuSystemStat // operating systems under the control of the Linux kernel. unsigned long guest; - SrsCpuSystemStat(); + SrsProcSystemStat(); }; // get system cpu stat, use cache to avoid performance problem. -extern SrsCpuSelfStat* srs_get_self_cpu_stat(); +extern SrsProcSelfStat* srs_get_self_proc_stat(); // get system cpu stat, use cache to avoid performance problem. -extern SrsCpuSystemStat* srs_get_system_cpu_stat(); +extern SrsProcSystemStat* srs_get_system_proc_stat(); // the deamon st-thread will update it. -extern void srs_update_system_cpu_stat(); +extern void srs_update_proc_stat(); #endif