mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
add uptime, startup time, load to api
This commit is contained in:
parent
8388da6325
commit
a1fed15789
7 changed files with 121 additions and 15 deletions
|
@ -1263,12 +1263,12 @@ void SrsConfig::print_help(char** argv)
|
||||||
argv[0], argv[0], argv[0], argv[0]);
|
argv[0], argv[0], argv[0], argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
string SrsConfig::get_cwd()
|
string SrsConfig::cwd()
|
||||||
{
|
{
|
||||||
return _cwd;
|
return _cwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
string SrsConfig::get_argv()
|
string SrsConfig::argv()
|
||||||
{
|
{
|
||||||
return _argv;
|
return _argv;
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,8 +149,8 @@ private:
|
||||||
virtual int parse_argv(int& i, char** argv);
|
virtual int parse_argv(int& i, char** argv);
|
||||||
virtual void print_help(char** argv);
|
virtual void print_help(char** argv);
|
||||||
public:
|
public:
|
||||||
virtual std::string get_cwd();
|
virtual std::string cwd();
|
||||||
virtual std::string get_argv();
|
virtual std::string argv();
|
||||||
// global section
|
// global section
|
||||||
public:
|
public:
|
||||||
virtual SrsConfDirective* get_root();
|
virtual SrsConfDirective* get_root();
|
||||||
|
|
|
@ -205,12 +205,16 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
|
||||||
SrsProcSystemStat* s = srs_get_system_proc_stat();
|
SrsProcSystemStat* s = srs_get_system_proc_stat();
|
||||||
SrsCpuInfo* c = srs_get_cpuinfo();
|
SrsCpuInfo* c = srs_get_cpuinfo();
|
||||||
SrsMemInfo* m = srs_get_meminfo();
|
SrsMemInfo* m = srs_get_meminfo();
|
||||||
|
SrsPlatformInfo* p = srs_get_platform_info();
|
||||||
|
|
||||||
float self_mem_percent = 0;
|
float self_mem_percent = 0;
|
||||||
if (m->MemTotal > 0) {
|
if (m->MemTotal > 0) {
|
||||||
self_mem_percent = (float)(r->r.ru_maxrss / (double)m->MemTotal);
|
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
|
ss << JOBJECT_START
|
||||||
<< JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
|
<< JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("data", JOBJECT_START)
|
<< 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("system_cpu_stat_ok", (s->ok? "true":"false")) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("cpuinfo_ok", (c->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("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("self", JOBJECT_START)
|
||||||
<< JFIELD_ORG("pid", getpid()) << JFIELD_CONT
|
<< JFIELD_ORG("pid", getpid()) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("ppid", u->ppid) << JFIELD_CONT
|
<< JFIELD_ORG("ppid", u->ppid) << JFIELD_CONT
|
||||||
<< JFIELD_STR("argv", _srs_config->get_argv()) << JFIELD_CONT
|
<< JFIELD_STR("argv", _srs_config->argv()) << JFIELD_CONT
|
||||||
<< JFIELD_STR("cwd", _srs_config->get_cwd()) << JFIELD_CONT
|
<< JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT
|
<< JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("mem_percent", self_mem_percent) << 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
|
<< JOBJECT_END << JFIELD_CONT
|
||||||
<< JFIELD_ORG("system", JOBJECT_START)
|
<< JFIELD_ORG("system", JOBJECT_START)
|
||||||
<< JFIELD_ORG("cpu_percent", s->percent) << JFIELD_CONT
|
<< 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_ram_percent", m->percent_ram) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("mem_swap_kbyte", m->SwapTotal) << JFIELD_CONT
|
<< JFIELD_ORG("mem_swap_kbyte", m->SwapTotal) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("mem_swap_percent", m->percent_swap) << JFIELD_CONT
|
<< JFIELD_ORG("mem_swap_percent", m->percent_swap) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("nb_processors", c->nb_processors) << JFIELD_CONT
|
<< JFIELD_ORG("cpus", c->nb_processors) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("nb_processors_online", c->nb_processors_online)
|
<< 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
|
<< JOBJECT_END
|
||||||
<< JOBJECT_END;
|
<< JOBJECT_END;
|
||||||
|
|
|
@ -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("app", req->app) << JFIELD_CONT
|
||||||
<< JFIELD_STR("stream", req->stream) << JFIELD_CONT
|
<< JFIELD_STR("stream", req->stream) << JFIELD_CONT
|
||||||
<< JFIELD_NAME("segment") << JOBJECT_START
|
<< 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)
|
<< JFIELD_STR("path", header_file)
|
||||||
<< JOBJECT_END
|
<< JOBJECT_END
|
||||||
<< 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("app", req->app) << JFIELD_CONT
|
||||||
<< JFIELD_STR("stream", req->stream) << JFIELD_CONT
|
<< JFIELD_STR("stream", req->stream) << JFIELD_CONT
|
||||||
<< JFIELD_NAME("segment") << JOBJECT_START
|
<< 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_STR("path", segment->path) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("duration", segment->duration) << JFIELD_CONT
|
<< JFIELD_ORG("duration", segment->duration) << JFIELD_CONT
|
||||||
<< JFIELD_ORG("offset", segment->sequence_header_offset) << JFIELD_CONT
|
<< JFIELD_ORG("offset", segment->sequence_header_offset) << JFIELD_CONT
|
||||||
|
|
|
@ -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
|
// SRS_SYS_CYCLE_INTERVAL * SRS_SYS_MEMINFO_RESOLUTION_TIMES
|
||||||
#define SRS_SYS_MEMINFO_RESOLUTION_TIMES 60
|
#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)
|
SrsListener::SrsListener(SrsServer* server, SrsListenerType type)
|
||||||
{
|
{
|
||||||
fd = -1;
|
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_RUSAGE_RESOLUTION_TIMES);
|
||||||
max = srs_max(max, SRS_SYS_CPU_STAT_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_MEMINFO_RESOLUTION_TIMES);
|
||||||
|
max = srs_max(max, SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES);
|
||||||
|
|
||||||
// the deamon thread, update the time cache
|
// the deamon thread, update the time cache
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -665,6 +670,9 @@ int SrsServer::do_cycle()
|
||||||
if ((i % SRS_SYS_MEMINFO_RESOLUTION_TIMES) == 0) {
|
if ((i % SRS_SYS_MEMINFO_RESOLUTION_TIMES) == 0) {
|
||||||
srs_update_meminfo();
|
srs_update_meminfo();
|
||||||
}
|
}
|
||||||
|
if ((i % SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES) == 0) {
|
||||||
|
srs_update_platform_info();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -224,13 +224,13 @@ bool get_proc_self_stat(SrsProcSelfStat& r)
|
||||||
&r.wchan, &r.nswap, &r.cnswap, &r.exit_signal, &r.processor,
|
&r.wchan, &r.nswap, &r.cnswap, &r.exit_signal, &r.processor,
|
||||||
&r.rt_priority, &r.policy, &r.delayacct_blkio_ticks,
|
&r.rt_priority, &r.policy, &r.delayacct_blkio_ticks,
|
||||||
&r.guest_time, &r.cguest_time);
|
&r.guest_time, &r.cguest_time);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
r.ok = true;
|
r.ok = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
return r.ok;
|
return r.ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,6 +349,8 @@ void srs_update_meminfo()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
r.sample_time = srs_get_system_time_ms();
|
r.sample_time = srs_get_system_time_ms();
|
||||||
r.MemActive = r.MemTotal - r.MemFree;
|
r.MemActive = r.MemTotal - r.MemFree;
|
||||||
r.RealInUse = r.MemActive - r.Buffers - r.Cached;
|
r.RealInUse = r.MemActive - r.Buffers - r.Cached;
|
||||||
|
@ -361,8 +363,6 @@ void srs_update_meminfo()
|
||||||
if (r.SwapTotal > 0) {
|
if (r.SwapTotal > 0) {
|
||||||
r.percent_swap = (float)((r.SwapTotal - r.SwapFree) / (double)r.SwapTotal);
|
r.percent_swap = (float)((r.SwapTotal - r.SwapFree) / (double)r.SwapTotal);
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsCpuInfo::SrsCpuInfo()
|
SrsCpuInfo::SrsCpuInfo()
|
||||||
|
@ -388,3 +388,63 @@ SrsCpuInfo* srs_get_cpuinfo()
|
||||||
|
|
||||||
return cpu;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -313,4 +313,30 @@ struct SrsCpuInfo
|
||||||
// get system cpu info, use cache to avoid performance problem.
|
// get system cpu info, use cache to avoid performance problem.
|
||||||
extern SrsCpuInfo* srs_get_cpuinfo();
|
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
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue