正在显示
6 个修改的文件
包含
151 行增加
和
3 行删除
| @@ -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" |
-
请 注册 或 登录 后发表评论