winlin

add uptime, startup time, load to api

@@ -1263,12 +1263,12 @@ void SrsConfig::print_help(char** argv) @@ -1263,12 +1263,12 @@ void SrsConfig::print_help(char** argv)
1263 argv[0], argv[0], argv[0], argv[0]); 1263 argv[0], argv[0], argv[0], argv[0]);
1264 } 1264 }
1265 1265
1266 -string SrsConfig::get_cwd() 1266 +string SrsConfig::cwd()
1267 { 1267 {
1268 return _cwd; 1268 return _cwd;
1269 } 1269 }
1270 1270
1271 -string SrsConfig::get_argv() 1271 +string SrsConfig::argv()
1272 { 1272 {
1273 return _argv; 1273 return _argv;
1274 } 1274 }
@@ -149,8 +149,8 @@ private: @@ -149,8 +149,8 @@ private:
149 virtual int parse_argv(int& i, char** argv); 149 virtual int parse_argv(int& i, char** argv);
150 virtual void print_help(char** argv); 150 virtual void print_help(char** argv);
151 public: 151 public:
152 - virtual std::string get_cwd();  
153 - virtual std::string get_argv(); 152 + virtual std::string cwd();
  153 + virtual std::string argv();
154 // global section 154 // global section
155 public: 155 public:
156 virtual SrsConfDirective* get_root(); 156 virtual SrsConfDirective* get_root();
@@ -205,12 +205,16 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -205,12 +205,16 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
205 SrsProcSystemStat* s = srs_get_system_proc_stat(); 205 SrsProcSystemStat* s = srs_get_system_proc_stat();
206 SrsCpuInfo* c = srs_get_cpuinfo(); 206 SrsCpuInfo* c = srs_get_cpuinfo();
207 SrsMemInfo* m = srs_get_meminfo(); 207 SrsMemInfo* m = srs_get_meminfo();
  208 + SrsPlatformInfo* p = srs_get_platform_info();
208 209
209 float self_mem_percent = 0; 210 float self_mem_percent = 0;
210 if (m->MemTotal > 0) { 211 if (m->MemTotal > 0) {
211 self_mem_percent = (float)(r->r.ru_maxrss / (double)m->MemTotal); 212 self_mem_percent = (float)(r->r.ru_maxrss / (double)m->MemTotal);
212 } 213 }
213 214
  215 + int64_t now = srs_get_system_time_ms();
  216 + double srs_uptime = (now - p->srs_startup_time) / 100 / 10.0;
  217 +
214 ss << JOBJECT_START 218 ss << JOBJECT_START
215 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT 219 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
216 << JFIELD_ORG("data", JOBJECT_START) 220 << JFIELD_ORG("data", JOBJECT_START)
@@ -219,14 +223,17 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -219,14 +223,17 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
219 << JFIELD_ORG("system_cpu_stat_ok", (s->ok? "true":"false")) << JFIELD_CONT 223 << JFIELD_ORG("system_cpu_stat_ok", (s->ok? "true":"false")) << JFIELD_CONT
220 << JFIELD_ORG("cpuinfo_ok", (c->ok? "true":"false")) << JFIELD_CONT 224 << JFIELD_ORG("cpuinfo_ok", (c->ok? "true":"false")) << JFIELD_CONT
221 << JFIELD_ORG("meminfo_ok", (m->ok? "true":"false")) << JFIELD_CONT 225 << JFIELD_ORG("meminfo_ok", (m->ok? "true":"false")) << JFIELD_CONT
  226 + << JFIELD_ORG("platform_ok", (p->ok? "true":"false")) << JFIELD_CONT
  227 + << JFIELD_ORG("now", now) << JFIELD_CONT
222 << JFIELD_ORG("self", JOBJECT_START) 228 << JFIELD_ORG("self", JOBJECT_START)
223 << JFIELD_ORG("pid", getpid()) << JFIELD_CONT 229 << JFIELD_ORG("pid", getpid()) << JFIELD_CONT
224 << JFIELD_ORG("ppid", u->ppid) << JFIELD_CONT 230 << JFIELD_ORG("ppid", u->ppid) << JFIELD_CONT
225 - << JFIELD_STR("argv", _srs_config->get_argv()) << JFIELD_CONT  
226 - << JFIELD_STR("cwd", _srs_config->get_cwd()) << JFIELD_CONT 231 + << JFIELD_STR("argv", _srs_config->argv()) << JFIELD_CONT
  232 + << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT
227 << JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT 233 << JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT
228 << JFIELD_ORG("mem_percent", self_mem_percent) << JFIELD_CONT 234 << JFIELD_ORG("mem_percent", self_mem_percent) << JFIELD_CONT
229 - << JFIELD_ORG("cpu_percent", u->percent) 235 + << JFIELD_ORG("cpu_percent", u->percent) << JFIELD_CONT
  236 + << JFIELD_ORG("srs_uptime", srs_uptime)
230 << JOBJECT_END << JFIELD_CONT 237 << JOBJECT_END << JFIELD_CONT
231 << JFIELD_ORG("system", JOBJECT_START) 238 << JFIELD_ORG("system", JOBJECT_START)
232 << JFIELD_ORG("cpu_percent", s->percent) << JFIELD_CONT 239 << JFIELD_ORG("cpu_percent", s->percent) << JFIELD_CONT
@@ -234,8 +241,13 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -234,8 +241,13 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
234 << JFIELD_ORG("mem_ram_percent", m->percent_ram) << JFIELD_CONT 241 << JFIELD_ORG("mem_ram_percent", m->percent_ram) << JFIELD_CONT
235 << JFIELD_ORG("mem_swap_kbyte", m->SwapTotal) << JFIELD_CONT 242 << JFIELD_ORG("mem_swap_kbyte", m->SwapTotal) << JFIELD_CONT
236 << JFIELD_ORG("mem_swap_percent", m->percent_swap) << JFIELD_CONT 243 << JFIELD_ORG("mem_swap_percent", m->percent_swap) << JFIELD_CONT
237 - << JFIELD_ORG("nb_processors", c->nb_processors) << JFIELD_CONT  
238 - << JFIELD_ORG("nb_processors_online", c->nb_processors_online) 244 + << JFIELD_ORG("cpus", c->nb_processors) << JFIELD_CONT
  245 + << JFIELD_ORG("cpus_online", c->nb_processors_online) << JFIELD_CONT
  246 + << JFIELD_ORG("uptime", p->os_uptime) << JFIELD_CONT
  247 + << JFIELD_ORG("ilde_time", p->os_ilde_time) << JFIELD_CONT
  248 + << JFIELD_ORG("load_1m", p->load_one_minutes) << JFIELD_CONT
  249 + << JFIELD_ORG("load_5m", p->load_five_minutes) << JFIELD_CONT
  250 + << JFIELD_ORG("load_15m", p->load_fifteen_minutes)
239 << JOBJECT_END 251 << JOBJECT_END
240 << JOBJECT_END 252 << JOBJECT_END
241 << JOBJECT_END; 253 << JOBJECT_END;
@@ -479,7 +479,7 @@ void SrsHttpHooks::on_dvr_hss_reap_flv_header(std::string url, SrsRequest* req, @@ -479,7 +479,7 @@ void SrsHttpHooks::on_dvr_hss_reap_flv_header(std::string url, SrsRequest* req,
479 << JFIELD_STR("app", req->app) << JFIELD_CONT 479 << JFIELD_STR("app", req->app) << JFIELD_CONT
480 << JFIELD_STR("stream", req->stream) << JFIELD_CONT 480 << JFIELD_STR("stream", req->stream) << JFIELD_CONT
481 << JFIELD_NAME("segment") << JOBJECT_START 481 << JFIELD_NAME("segment") << JOBJECT_START
482 - << JFIELD_STR("cwd", _srs_config->get_cwd()) << JFIELD_CONT 482 + << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT
483 << JFIELD_STR("path", header_file) 483 << JFIELD_STR("path", header_file)
484 << JOBJECT_END 484 << JOBJECT_END
485 << JOBJECT_END; 485 << JOBJECT_END;
@@ -532,7 +532,7 @@ void SrsHttpHooks::on_dvr_hss_reap_flv(string url, SrsRequest* req, SrsFlvSegmen @@ -532,7 +532,7 @@ void SrsHttpHooks::on_dvr_hss_reap_flv(string url, SrsRequest* req, SrsFlvSegmen
532 << JFIELD_STR("app", req->app) << JFIELD_CONT 532 << JFIELD_STR("app", req->app) << JFIELD_CONT
533 << JFIELD_STR("stream", req->stream) << JFIELD_CONT 533 << JFIELD_STR("stream", req->stream) << JFIELD_CONT
534 << JFIELD_NAME("segment") << JOBJECT_START 534 << JFIELD_NAME("segment") << JOBJECT_START
535 - << JFIELD_STR("cwd", _srs_config->get_cwd()) << JFIELD_CONT 535 + << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT
536 << JFIELD_STR("path", segment->path) << JFIELD_CONT 536 << JFIELD_STR("path", segment->path) << JFIELD_CONT
537 << JFIELD_ORG("duration", segment->duration) << JFIELD_CONT 537 << JFIELD_ORG("duration", segment->duration) << JFIELD_CONT
538 << JFIELD_ORG("offset", segment->sequence_header_offset) << JFIELD_CONT 538 << 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. @@ -71,6 +71,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
71 // SRS_SYS_CYCLE_INTERVAL * SRS_SYS_MEMINFO_RESOLUTION_TIMES 71 // SRS_SYS_CYCLE_INTERVAL * SRS_SYS_MEMINFO_RESOLUTION_TIMES
72 #define SRS_SYS_MEMINFO_RESOLUTION_TIMES 60 72 #define SRS_SYS_MEMINFO_RESOLUTION_TIMES 60
73 73
  74 +// update platform info interval:
  75 +// SRS_SYS_CYCLE_INTERVAL * SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES
  76 +#define SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES 80
  77 +
74 SrsListener::SrsListener(SrsServer* server, SrsListenerType type) 78 SrsListener::SrsListener(SrsServer* server, SrsListenerType type)
75 { 79 {
76 fd = -1; 80 fd = -1;
@@ -623,6 +627,7 @@ int SrsServer::do_cycle() @@ -623,6 +627,7 @@ int SrsServer::do_cycle()
623 max = srs_max(max, SRS_SYS_RUSAGE_RESOLUTION_TIMES); 627 max = srs_max(max, SRS_SYS_RUSAGE_RESOLUTION_TIMES);
624 max = srs_max(max, SRS_SYS_CPU_STAT_RESOLUTION_TIMES); 628 max = srs_max(max, SRS_SYS_CPU_STAT_RESOLUTION_TIMES);
625 max = srs_max(max, SRS_SYS_MEMINFO_RESOLUTION_TIMES); 629 max = srs_max(max, SRS_SYS_MEMINFO_RESOLUTION_TIMES);
  630 + max = srs_max(max, SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES);
626 631
627 // the deamon thread, update the time cache 632 // the deamon thread, update the time cache
628 while (true) { 633 while (true) {
@@ -665,6 +670,9 @@ int SrsServer::do_cycle() @@ -665,6 +670,9 @@ int SrsServer::do_cycle()
665 if ((i % SRS_SYS_MEMINFO_RESOLUTION_TIMES) == 0) { 670 if ((i % SRS_SYS_MEMINFO_RESOLUTION_TIMES) == 0) {
666 srs_update_meminfo(); 671 srs_update_meminfo();
667 } 672 }
  673 + if ((i % SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES) == 0) {
  674 + srs_update_platform_info();
  675 + }
668 } 676 }
669 } 677 }
670 678
@@ -224,13 +224,13 @@ bool get_proc_self_stat(SrsProcSelfStat& r) @@ -224,13 +224,13 @@ bool get_proc_self_stat(SrsProcSelfStat& r)
224 &r.wchan, &r.nswap, &r.cnswap, &r.exit_signal, &r.processor, 224 &r.wchan, &r.nswap, &r.cnswap, &r.exit_signal, &r.processor,
225 &r.rt_priority, &r.policy, &r.delayacct_blkio_ticks, 225 &r.rt_priority, &r.policy, &r.delayacct_blkio_ticks,
226 &r.guest_time, &r.cguest_time); 226 &r.guest_time, &r.cguest_time);
  227 +
  228 + fclose(f);
227 229
228 if (ret >= 0) { 230 if (ret >= 0) {
229 r.ok = true; 231 r.ok = true;
230 } 232 }
231 233
232 - fclose(f);  
233 -  
234 return r.ok; 234 return r.ok;
235 } 235 }
236 236
@@ -349,6 +349,8 @@ void srs_update_meminfo() @@ -349,6 +349,8 @@ void srs_update_meminfo()
349 } 349 }
350 } 350 }
351 351
  352 + fclose(f);
  353 +
352 r.sample_time = srs_get_system_time_ms(); 354 r.sample_time = srs_get_system_time_ms();
353 r.MemActive = r.MemTotal - r.MemFree; 355 r.MemActive = r.MemTotal - r.MemFree;
354 r.RealInUse = r.MemActive - r.Buffers - r.Cached; 356 r.RealInUse = r.MemActive - r.Buffers - r.Cached;
@@ -361,8 +363,6 @@ void srs_update_meminfo() @@ -361,8 +363,6 @@ void srs_update_meminfo()
361 if (r.SwapTotal > 0) { 363 if (r.SwapTotal > 0) {
362 r.percent_swap = (float)((r.SwapTotal - r.SwapFree) / (double)r.SwapTotal); 364 r.percent_swap = (float)((r.SwapTotal - r.SwapFree) / (double)r.SwapTotal);
363 } 365 }
364 -  
365 - fclose(f);  
366 } 366 }
367 367
368 SrsCpuInfo::SrsCpuInfo() 368 SrsCpuInfo::SrsCpuInfo()
@@ -388,3 +388,63 @@ SrsCpuInfo* srs_get_cpuinfo() @@ -388,3 +388,63 @@ SrsCpuInfo* srs_get_cpuinfo()
388 388
389 return cpu; 389 return cpu;
390 } 390 }
  391 +
  392 +SrsPlatformInfo::SrsPlatformInfo()
  393 +{
  394 + ok = false;
  395 +
  396 + srs_startup_time = srs_get_system_time_ms();
  397 +
  398 + os_uptime = 0;
  399 + os_ilde_time = 0;
  400 +
  401 + load_one_minutes = 0;
  402 + load_five_minutes = 0;
  403 + load_fifteen_minutes = 0;
  404 +}
  405 +
  406 +static SrsPlatformInfo _srs_system_platform_info;
  407 +
  408 +SrsPlatformInfo* srs_get_platform_info()
  409 +{
  410 + return &_srs_system_platform_info;
  411 +}
  412 +
  413 +void srs_update_platform_info()
  414 +{
  415 + SrsPlatformInfo& r = _srs_system_platform_info;
  416 + r.ok = true;
  417 +
  418 + if (true) {
  419 + FILE* f = fopen("/proc/uptime", "r");
  420 + if (f == NULL) {
  421 + srs_warn("open uptime failed, ignore");
  422 + return;
  423 + }
  424 +
  425 + int ret = fscanf(f, "%lf %lf\n", &r.os_uptime, &r.os_ilde_time);
  426 +
  427 + fclose(f);
  428 +
  429 + if (ret < 0) {
  430 + r.ok = false;
  431 + }
  432 + }
  433 +
  434 + if (true) {
  435 + FILE* f = fopen("/proc/loadavg", "r");
  436 + if (f == NULL) {
  437 + srs_warn("open loadavg failed, ignore");
  438 + return;
  439 + }
  440 +
  441 + int ret = fscanf(f, "%lf %lf %lf\n",
  442 + &r.load_one_minutes, &r.load_five_minutes, &r.load_fifteen_minutes);
  443 +
  444 + fclose(f);
  445 +
  446 + if (ret < 0) {
  447 + r.ok = false;
  448 + }
  449 + }
  450 +}
@@ -313,4 +313,30 @@ struct SrsCpuInfo @@ -313,4 +313,30 @@ struct SrsCpuInfo
313 // get system cpu info, use cache to avoid performance problem. 313 // get system cpu info, use cache to avoid performance problem.
314 extern SrsCpuInfo* srs_get_cpuinfo(); 314 extern SrsCpuInfo* srs_get_cpuinfo();
315 315
  316 +// platform(os, srs) summary
  317 +struct SrsPlatformInfo
  318 +{
  319 + // whether the data is ok.
  320 + bool ok;
  321 +
  322 + // srs startup time, in ms.
  323 + int64_t srs_startup_time;
  324 +
  325 + // @see: cat /proc/uptime
  326 + double os_uptime;
  327 + double os_ilde_time;
  328 +
  329 + // @see: cat /proc/loadavg
  330 + double load_one_minutes;
  331 + double load_five_minutes;
  332 + double load_fifteen_minutes;
  333 +
  334 + SrsPlatformInfo();
  335 +};
  336 +
  337 +// get platform info, use cache to avoid performance problem.
  338 +extern SrsPlatformInfo* srs_get_platform_info();
  339 +// the deamon st-thread will update it.
  340 +extern void srs_update_platform_info();
  341 +
316 #endif 342 #endif