winlin

add network bytes to api summaries. 0.9.125

@@ -240,6 +240,7 @@ Supported operating systems and hardware: @@ -240,6 +240,7 @@ Supported operating systems and hardware:
240 * 2013-10-17, Created.<br/> 240 * 2013-10-17, Created.<br/>
241 241
242 ## History 242 ## History
  243 +* v1.0, 2014-06-18, add network bytes to api summaries. 0.9.125
243 * v1.0, 2014-06-14, fix [#98](https://github.com/winlinvip/simple-rtmp-server/issues/98), workaround for librtmp ping(fmt=1,cid=2 fresh stream). 0.9.124 244 * v1.0, 2014-06-14, fix [#98](https://github.com/winlinvip/simple-rtmp-server/issues/98), workaround for librtmp ping(fmt=1,cid=2 fresh stream). 0.9.124
244 * v1.0, 2014-05-29, support flv inject and flv http streaming with start=bytes. 0.9.122 245 * v1.0, 2014-05-29, support flv inject and flv http streaming with start=bytes. 0.9.122
245 * <strong>v1.0, 2014-05-28, [1.0 mainline4(0.9.120)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.mainline4) released. 39200 lines.</strong> 246 * <strong>v1.0, 2014-05-28, [1.0 mainline4(0.9.120)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.mainline4) released. 39200 lines.</strong>
@@ -389,6 +389,7 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -389,6 +389,7 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
389 SrsCpuInfo* c = srs_get_cpuinfo(); 389 SrsCpuInfo* c = srs_get_cpuinfo();
390 SrsMemInfo* m = srs_get_meminfo(); 390 SrsMemInfo* m = srs_get_meminfo();
391 SrsPlatformInfo* p = srs_get_platform_info(); 391 SrsPlatformInfo* p = srs_get_platform_info();
  392 + SrsNetworkDevices* n = srs_get_network_devices();
392 393
393 float self_mem_percent = 0; 394 float self_mem_percent = 0;
394 if (m->MemTotal > 0) { 395 if (m->MemTotal > 0) {
@@ -398,6 +399,21 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -398,6 +399,21 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
398 int64_t now = srs_get_system_time_ms(); 399 int64_t now = srs_get_system_time_ms();
399 double srs_uptime = (now - p->srs_startup_time) / 100 / 10.0; 400 double srs_uptime = (now - p->srs_startup_time) / 100 / 10.0;
400 401
  402 + bool n_ok = false;
  403 + int64_t n_sample_time = 0;
  404 + int64_t nr_bytes = 0;
  405 + int64_t ns_bytes = 0;
  406 + int nb_n = srs_get_network_devices_count();
  407 + for (int i = 0; i < nb_n; i++) {
  408 + SrsNetworkDevices& o = n[i];
  409 + if (o.ok) {
  410 + n_ok = true;
  411 + nr_bytes += o.rbytes;
  412 + ns_bytes += o.sbytes;
  413 + n_sample_time = o.sample_time;
  414 + }
  415 + }
  416 +
401 ss << JOBJECT_START 417 ss << JOBJECT_START
402 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT 418 << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT
403 << JFIELD_ORG("data", JOBJECT_START) 419 << JFIELD_ORG("data", JOBJECT_START)
@@ -407,6 +423,7 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -407,6 +423,7 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
407 << JFIELD_ORG("cpuinfo_ok", (c->ok? "true":"false")) << JFIELD_CONT 423 << JFIELD_ORG("cpuinfo_ok", (c->ok? "true":"false")) << JFIELD_CONT
408 << JFIELD_ORG("meminfo_ok", (m->ok? "true":"false")) << JFIELD_CONT 424 << JFIELD_ORG("meminfo_ok", (m->ok? "true":"false")) << JFIELD_CONT
409 << JFIELD_ORG("platform_ok", (p->ok? "true":"false")) << JFIELD_CONT 425 << JFIELD_ORG("platform_ok", (p->ok? "true":"false")) << JFIELD_CONT
  426 + << JFIELD_ORG("network_ok", (n_ok? "true":"false")) << JFIELD_CONT
410 << JFIELD_ORG("now_ms", now) << JFIELD_CONT 427 << JFIELD_ORG("now_ms", now) << JFIELD_CONT
411 << JFIELD_ORG("self", JOBJECT_START) 428 << JFIELD_ORG("self", JOBJECT_START)
412 << JFIELD_ORG("pid", getpid()) << JFIELD_CONT 429 << JFIELD_ORG("pid", getpid()) << JFIELD_CONT
@@ -430,7 +447,10 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) @@ -430,7 +447,10 @@ int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req)
430 << JFIELD_ORG("ilde_time", p->os_ilde_time) << JFIELD_CONT 447 << JFIELD_ORG("ilde_time", p->os_ilde_time) << JFIELD_CONT
431 << JFIELD_ORG("load_1m", p->load_one_minutes) << JFIELD_CONT 448 << JFIELD_ORG("load_1m", p->load_one_minutes) << JFIELD_CONT
432 << JFIELD_ORG("load_5m", p->load_five_minutes) << JFIELD_CONT 449 << JFIELD_ORG("load_5m", p->load_five_minutes) << JFIELD_CONT
433 - << JFIELD_ORG("load_15m", p->load_fifteen_minutes) 450 + << JFIELD_ORG("load_15m", p->load_fifteen_minutes) << JFIELD_CONT
  451 + << JFIELD_ORG("net_sample_time", n_sample_time) << JFIELD_CONT
  452 + << JFIELD_ORG("net_recv_bytes", nr_bytes) << JFIELD_CONT
  453 + << JFIELD_ORG("net_send_bytes", ns_bytes)
434 << JOBJECT_END 454 << JOBJECT_END
435 << JOBJECT_END 455 << JOBJECT_END
436 << JOBJECT_END; 456 << JOBJECT_END;
@@ -78,6 +78,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -78,6 +78,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
78 // SRS_SYS_CYCLE_INTERVAL * SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES 78 // SRS_SYS_CYCLE_INTERVAL * SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES
79 #define SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES 90 79 #define SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES 90
80 80
  81 +// update network devices info interval:
  82 +// SRS_SYS_CYCLE_INTERVAL * SRS_SYS_NETWORK_DEVICE_RESOLUTION_TIMES
  83 +#define SRS_SYS_NETWORK_DEVICE_RESOLUTION_TIMES 90
  84 +
81 SrsListener::SrsListener(SrsServer* server, SrsListenerType type) 85 SrsListener::SrsListener(SrsServer* server, SrsListenerType type)
82 { 86 {
83 fd = -1; 87 fd = -1;
@@ -646,6 +650,7 @@ int SrsServer::do_cycle() @@ -646,6 +650,7 @@ int SrsServer::do_cycle()
646 max = srs_max(max, SRS_SYS_CPU_STAT_RESOLUTION_TIMES); 650 max = srs_max(max, SRS_SYS_CPU_STAT_RESOLUTION_TIMES);
647 max = srs_max(max, SRS_SYS_MEMINFO_RESOLUTION_TIMES); 651 max = srs_max(max, SRS_SYS_MEMINFO_RESOLUTION_TIMES);
648 max = srs_max(max, SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES); 652 max = srs_max(max, SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES);
  653 + max = srs_max(max, SRS_SYS_NETWORK_DEVICE_RESOLUTION_TIMES);
649 654
650 // the deamon thread, update the time cache 655 // the deamon thread, update the time cache
651 while (true) { 656 while (true) {
@@ -656,7 +661,7 @@ int SrsServer::do_cycle() @@ -656,7 +661,7 @@ int SrsServer::do_cycle()
656 int __max = max; 661 int __max = max;
657 __max = srs_max(__max, heartbeat_max_resolution); 662 __max = srs_max(__max, heartbeat_max_resolution);
658 663
659 - for (int i = 1; i < __max + 1; i++) { 664 + for (int i = 0; i < __max; i++) {
660 st_usleep(SRS_SYS_CYCLE_INTERVAL * 1000); 665 st_usleep(SRS_SYS_CYCLE_INTERVAL * 1000);
661 666
662 // for gperf heap checker, 667 // for gperf heap checker,
@@ -698,6 +703,9 @@ int SrsServer::do_cycle() @@ -698,6 +703,9 @@ int SrsServer::do_cycle()
698 if ((i % SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES) == 0) { 703 if ((i % SRS_SYS_PLATFORM_INFO_RESOLUTION_TIMES) == 0) {
699 srs_update_platform_info(); 704 srs_update_platform_info();
700 } 705 }
  706 + if ((i % SRS_SYS_NETWORK_DEVICE_RESOLUTION_TIMES) == 0) {
  707 + srs_update_network_devices();
  708 + }
701 #ifdef SRS_AUTO_HTTP_PARSER 709 #ifdef SRS_AUTO_HTTP_PARSER
702 if (_srs_config->get_heartbeat_enabled()) { 710 if (_srs_config->get_heartbeat_enabled()) {
703 if ((i % heartbeat_max_resolution) == 0) { 711 if ((i % heartbeat_max_resolution) == 0) {
@@ -444,6 +444,84 @@ void srs_update_platform_info() @@ -444,6 +444,84 @@ void srs_update_platform_info()
444 } 444 }
445 } 445 }
446 446
  447 +SrsNetworkDevices::SrsNetworkDevices()
  448 +{
  449 + ok = false;
  450 +
  451 + memset(name, 0, sizeof(name));
  452 + sample_time = 0;
  453 +
  454 + rbytes = 0;
  455 + rpackets = 0;
  456 + rerrs = 0;
  457 + rdrop = 0;
  458 + rfifo = 0;
  459 + rframe = 0;
  460 + rcompressed = 0;
  461 + rmulticast = 0;
  462 +
  463 + sbytes = 0;
  464 + spackets = 0;
  465 + serrs = 0;
  466 + sdrop = 0;
  467 + sfifo = 0;
  468 + scolls = 0;
  469 + scarrier = 0;
  470 + scompressed = 0;
  471 +}
  472 +
  473 +#define MAX_NETWORK_DEVICES_COUNT 16
  474 +static SrsNetworkDevices _srs_system_network_devices[MAX_NETWORK_DEVICES_COUNT];
  475 +static int _nb_srs_system_network_devices = -1;
  476 +
  477 +SrsNetworkDevices* srs_get_network_devices()
  478 +{
  479 + return _srs_system_network_devices;
  480 +}
  481 +
  482 +int srs_get_network_devices_count()
  483 +{
  484 + return _nb_srs_system_network_devices;
  485 +}
  486 +
  487 +void srs_update_network_devices()
  488 +{
  489 + if (true) {
  490 + FILE* f = fopen("/proc/net/dev", "r");
  491 + if (f == NULL) {
  492 + srs_warn("open proc network devices failed, ignore");
  493 + return;
  494 + }
  495 +
  496 + // ignore title.
  497 + static char buf[1024];
  498 + fgets(buf, sizeof(buf), f);
  499 + fgets(buf, sizeof(buf), f);
  500 +
  501 + for (int i = 0; i < MAX_NETWORK_DEVICES_COUNT; i++) {
  502 + SrsNetworkDevices& r = _srs_system_network_devices[i];
  503 + r.ok = false;
  504 + r.sample_time = 0;
  505 +
  506 + int ret = fscanf(f, "%6[^:]:%llu %lu %lu %lu %lu %lu %lu %lu %llu %lu %lu %lu %lu %lu %lu %lu\n",
  507 + r.name, &r.rbytes, &r.rpackets, &r.rerrs, &r.rdrop, &r.rfifo, &r.rframe, &r.rcompressed, &r.rmulticast,
  508 + &r.sbytes, &r.spackets, &r.serrs, &r.sdrop, &r.sfifo, &r.scolls, &r.scarrier, &r.scompressed);
  509 +
  510 + if (ret == 17) {
  511 + r.ok = true;
  512 + _nb_srs_system_network_devices = i + 1;
  513 + r.sample_time = srs_get_system_time_ms();
  514 + }
  515 +
  516 + if (ret == EOF) {
  517 + break;
  518 + }
  519 + }
  520 +
  521 + fclose(f);
  522 + }
  523 +}
  524 +
447 vector<string> _srs_system_ipv4_ips; 525 vector<string> _srs_system_ipv4_ips;
448 526
449 void retrieve_local_ipv4_ips() 527 void retrieve_local_ipv4_ips()
@@ -349,6 +349,47 @@ extern SrsPlatformInfo* srs_get_platform_info(); @@ -349,6 +349,47 @@ extern SrsPlatformInfo* srs_get_platform_info();
349 // the deamon st-thread will update it. 349 // the deamon st-thread will update it.
350 extern void srs_update_platform_info(); 350 extern void srs_update_platform_info();
351 351
  352 +// network device summary
  353 +class SrsNetworkDevices
  354 +{
  355 +public:
  356 + // whether the network device is ok.
  357 + bool ok;
  358 +
  359 + // 6-chars interfaces name
  360 + char name[7];
  361 + // the sample time in ms.
  362 + int64_t sample_time;
  363 +
  364 + // data for receive.
  365 + unsigned long long rbytes;
  366 + unsigned long rpackets;
  367 + unsigned long rerrs;
  368 + unsigned long rdrop;
  369 + unsigned long rfifo;
  370 + unsigned long rframe;
  371 + unsigned long rcompressed;
  372 + unsigned long rmulticast;
  373 +
  374 + // data for transmit
  375 + unsigned long long sbytes;
  376 + unsigned long spackets;
  377 + unsigned long serrs;
  378 + unsigned long sdrop;
  379 + unsigned long sfifo;
  380 + unsigned long scolls;
  381 + unsigned long scarrier;
  382 + unsigned long scompressed;
  383 +
  384 + SrsNetworkDevices();
  385 +};
  386 +
  387 +// get network devices info, use cache to avoid performance problem.
  388 +extern SrsNetworkDevices* srs_get_network_devices();
  389 +extern int srs_get_network_devices_count();
  390 +// the deamon st-thread will update it.
  391 +extern void srs_update_network_devices();
  392 +
352 // get local ip, fill to @param ips 393 // get local ip, fill to @param ips
353 extern void srs_retrieve_local_ipv4_ips(); 394 extern void srs_retrieve_local_ipv4_ips();
354 extern std::vector<std::string>& srs_get_local_ipv4_ips(); 395 extern std::vector<std::string>& srs_get_local_ipv4_ips();
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "124" 34 +#define VERSION_REVISION "125"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "SRS" 37 #define RTMP_SIG_SRS_KEY "SRS"