From f173345e15ce7971ca294c36e33b2ebef07ce943 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 23 Jun 2014 15:44:49 +0800 Subject: [PATCH] support report summaries in heartbeat. 0.9.132 --- README.md | 1 + trunk/conf/full.conf | 11 ++++ trunk/src/app/srs_app_config.cpp | 32 +++++++++ trunk/src/app/srs_app_config.hpp | 4 ++ trunk/src/app/srs_app_heartbeat.cpp | 14 ++-- trunk/src/app/srs_app_http_api.cpp | 91 +------------------------- trunk/src/app/srs_app_http_client.cpp | 2 +- trunk/src/app/srs_app_utility.cpp | 94 +++++++++++++++++++++++++++ trunk/src/app/srs_app_utility.hpp | 3 + trunk/src/core/srs_core.hpp | 2 +- 10 files changed, 157 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index ee34e1c51..5f2b3181c 100755 --- a/README.md +++ b/README.md @@ -241,6 +241,7 @@ Supported operating systems and hardware: * 2013-10-17, Created.
## History +* v1.0, 2014-06-23, support report summaries in heartbeat. 0.9.132 * v1.0, 2014-06-22, performance refine, support [3k+](https://github.com/winlinvip/simple-rtmp-server/wiki/Performance#%E6%80%A7%E8%83%BD%E4%BE%8B%E8%A1%8C%E6%8A%A5%E5%91%8A4k) connections(270kbps). 0.9.130 * v1.0, 2014-06-21, support edge [token traverse](https://github.com/winlinvip/simple-rtmp-server/wiki/DRM#tokentraverse), fix [#104](https://github.com/winlinvip/simple-rtmp-server/issues/104). 0.9.129 * v1.0, 2014-06-19, add connections count to api summaries. 0.9.127 diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index e2cd62c5c..782822311 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -61,6 +61,17 @@ heartbeat { url http://127.0.0.1:8085/api/v1/servers; # the id of devide. device_id "my-srs-device"; + # the index of device ip. + # we may retrieve more than one network device. + # default: 0 + device_index 0; + # whether report with summaries + # if true, put /api/v1/summaries to the request data: + # { + # "summaries": summaries object. + # } + # default: off + summaries off; } ############################################################################################# diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index c18626d22..1ae191a7d 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -2869,6 +2869,38 @@ string SrsConfig::get_heartbeat_device_id() return conf->arg0(); } +int SrsConfig::get_heartbeat_device_index() +{ + SrsConfDirective* conf = get_heartbeart(); + + if (!conf) { + return SRS_CONF_DEFAULT_HTTP_HEAETBEAT_INDEX; + } + + conf = conf->get("device_index"); + if (!conf || conf->arg0().empty()) { + return SRS_CONF_DEFAULT_HTTP_HEAETBEAT_INDEX; + } + + return ::atoi(conf->arg0().c_str()); +} + +bool SrsConfig::get_heartbeat_summaries() +{ + SrsConfDirective* conf = get_heartbeart(); + + if (!conf) { + return SRS_CONF_DEFAULT_HTTP_HEAETBEAT_SUMMARIES; + } + + conf = conf->get("summaries"); + if (!conf || conf->arg0() != "on") { + return SRS_CONF_DEFAULT_HTTP_HEAETBEAT_SUMMARIES; + } + + return true; +} + bool srs_directive_equals(SrsConfDirective* a, SrsConfDirective* b) { // both NULL, equal. diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index b1c74589f..3d8df3c93 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -71,6 +71,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_ENABLED false #define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_INTERVAL 9.9 #define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_URL "http://127.0.0.1:8085/api/v1/servers" +#define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_INDEX 0 +#define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_SUMMARIES false #define SRS_STAGE_PLAY_USER_INTERVAL_MS 10000 #define SRS_STAGE_PUBLISH_USER_INTERVAL_MS 10000 @@ -297,6 +299,8 @@ public: virtual int64_t get_heartbeat_interval(); virtual std::string get_heartbeat_url(); virtual std::string get_heartbeat_device_id(); + virtual int get_heartbeat_device_index(); + virtual bool get_heartbeat_summaries(); }; /** diff --git a/trunk/src/app/srs_app_heartbeat.cpp b/trunk/src/app/srs_app_heartbeat.cpp index 05464e3e6..78bf75509 100644 --- a/trunk/src/app/srs_app_heartbeat.cpp +++ b/trunk/src/app/srs_app_heartbeat.cpp @@ -61,26 +61,30 @@ void SrsHttpHeartbeat::heartbeat() vector& ips = srs_get_local_ipv4_ips(); if (!ips.empty()) { - ip = ips[0]; // TODO: FIXME: maybe need to config it. + ip = ips[_srs_config->get_heartbeat_device_index() % (int)ips.size()]; } std::stringstream ss; ss << JOBJECT_START << JFIELD_STR("device_id", device_id) << JFIELD_CONT - << JFIELD_STR("ip", ip) - << JOBJECT_END; + << JFIELD_STR("ip", ip); + if (_srs_config->get_heartbeat_summaries()) { + ss << JFIELD_CONT << JFIELD_ORG("summaries", ""); + srs_api_dump_summaries(ss); + } + ss << JOBJECT_END; std::string data = ss.str(); std::string res; SrsHttpClient http; if ((ret = http.post(&uri, data, res)) != ERROR_SUCCESS) { - srs_error("http post hartbeart uri failed. " + srs_info("http post hartbeart uri failed. " "url=%s, request=%s, response=%s, ret=%d", url.c_str(), data.c_str(), res.c_str(), ret); return; } - srs_trace("http hook hartbeart success. " + srs_info("http hook hartbeart success. " "url=%s, request=%s, response=%s, ret=%d", url.c_str(), data.c_str(), res.c_str(), ret); diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 4d8ec39c6..5a89da9c5 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -382,96 +382,7 @@ bool SrsApiSummaries::can_handle(const char* path, int length, const char** /*pc int SrsApiSummaries::do_process_request(SrsSocket* skt, SrsHttpMessage* req) { std::stringstream ss; - - SrsRusage* r = srs_get_system_rusage(); - SrsProcSelfStat* u = srs_get_self_proc_stat(); - SrsProcSystemStat* s = srs_get_system_proc_stat(); - SrsCpuInfo* c = srs_get_cpuinfo(); - SrsMemInfo* m = srs_get_meminfo(); - SrsPlatformInfo* p = srs_get_platform_info(); - SrsNetworkDevices* n = srs_get_network_devices(); - SrsNetworkRtmpServer* nrs = srs_get_network_rtmp_server(); - - float self_mem_percent = 0; - if (m->MemTotal > 0) { - 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; - - bool n_ok = false; - int64_t n_sample_time = 0; - int64_t nr_bytes = 0; - int64_t ns_bytes = 0; - int nb_n = srs_get_network_devices_count(); - for (int i = 0; i < nb_n; i++) { - SrsNetworkDevices& o = n[i]; - - // ignore the lo interface. - std::string inter = o.name; - if (!o.ok || inter == "lo") { - continue; - } - - n_ok = true; - nr_bytes += o.rbytes; - ns_bytes += o.sbytes; - n_sample_time = o.sample_time; - } - - ss << JOBJECT_START - << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT - << JFIELD_ORG("data", JOBJECT_START) - << JFIELD_ORG("rusage_ok", (r->ok? "true":"false")) << JFIELD_CONT - << JFIELD_ORG("self_cpu_stat_ok", (u->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("meminfo_ok", (m->ok? "true":"false")) << JFIELD_CONT - << JFIELD_ORG("platform_ok", (p->ok? "true":"false")) << JFIELD_CONT - << JFIELD_ORG("network_ok", (n_ok? "true":"false")) << JFIELD_CONT - << JFIELD_ORG("network_srs_ok", (nrs->ok? "true":"false")) << JFIELD_CONT - << JFIELD_ORG("now_ms", now) << JFIELD_CONT - << JFIELD_ORG("self", JOBJECT_START) - << JFIELD_ORG("pid", getpid()) << JFIELD_CONT - << JFIELD_ORG("ppid", u->ppid) << JFIELD_CONT - << JFIELD_STR("argv", _srs_config->argv()) << JFIELD_CONT - << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT - << JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT - << JFIELD_ORG("mem_percent", self_mem_percent) << JFIELD_CONT - << JFIELD_ORG("cpu_percent", u->percent) << JFIELD_CONT - << JFIELD_ORG("srs_uptime", srs_uptime) - << JOBJECT_END << JFIELD_CONT - << JFIELD_ORG("system", JOBJECT_START) - << JFIELD_ORG("cpu_percent", s->percent) << JFIELD_CONT - << JFIELD_ORG("mem_ram_kbyte", m->MemTotal) << 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_percent", m->percent_swap) << JFIELD_CONT - << JFIELD_ORG("cpus", c->nb_processors) << JFIELD_CONT - << 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) << JFIELD_CONT - << JFIELD_ORG("net_sample_time", n_sample_time) << JFIELD_CONT - << JFIELD_ORG("net_recv_bytes", nr_bytes) << JFIELD_CONT - << JFIELD_ORG("net_send_bytes", ns_bytes) << JFIELD_CONT - << JFIELD_ORG("srs_sample_time", nrs->sample_time) << JFIELD_CONT - << JFIELD_ORG("srs_recv_bytes", nrs->rbytes) << JFIELD_CONT - << JFIELD_ORG("srs_recv_kbps", nrs->rkbps) << JFIELD_CONT - << JFIELD_ORG("srs_send_bytes", nrs->sbytes) << JFIELD_CONT - << JFIELD_ORG("srs_send_kbps", nrs->skbps) << JFIELD_CONT - << JFIELD_ORG("conn_sys", nrs->nb_conn_sys) << JFIELD_CONT - << JFIELD_ORG("conn_sys_et", nrs->nb_conn_sys_et) << JFIELD_CONT - << JFIELD_ORG("conn_sys_tw", nrs->nb_conn_sys_tw) << JFIELD_CONT - << JFIELD_ORG("conn_sys_ls", nrs->nb_conn_sys_ls) << JFIELD_CONT - << JFIELD_ORG("conn_srs", nrs->nb_conn_srs) - << JOBJECT_END - << JOBJECT_END - << JOBJECT_END; - + srs_api_dump_summaries(ss); return res_json(skt, req, ss.str()); } diff --git a/trunk/src/app/srs_app_http_client.cpp b/trunk/src/app/srs_app_http_client.cpp index cd2cc249a..f4e6e067a 100644 --- a/trunk/src/app/srs_app_http_client.cpp +++ b/trunk/src/app/srs_app_http_client.cpp @@ -64,7 +64,7 @@ int SrsHttpClient::post(SrsHttpUri* uri, string req, string& res) } if ((ret = connect(uri)) != ERROR_SUCCESS) { - srs_error("http connect server failed. ret=%d", ret); + srs_warn("http connect server failed. ret=%d", ret); return ret; } diff --git a/trunk/src/app/srs_app_utility.cpp b/trunk/src/app/srs_app_utility.cpp index 47b748cb9..ec3044ad2 100644 --- a/trunk/src/app/srs_app_utility.cpp +++ b/trunk/src/app/srs_app_utility.cpp @@ -35,6 +35,7 @@ using namespace std; #include #include #include +#include #define SRS_LOCAL_LOOP_IP "127.0.0.1" @@ -731,3 +732,96 @@ string srs_get_peer_ip(int fd) return ip; } + +void srs_api_dump_summaries(std::stringstream& ss) +{ + SrsRusage* r = srs_get_system_rusage(); + SrsProcSelfStat* u = srs_get_self_proc_stat(); + SrsProcSystemStat* s = srs_get_system_proc_stat(); + SrsCpuInfo* c = srs_get_cpuinfo(); + SrsMemInfo* m = srs_get_meminfo(); + SrsPlatformInfo* p = srs_get_platform_info(); + SrsNetworkDevices* n = srs_get_network_devices(); + SrsNetworkRtmpServer* nrs = srs_get_network_rtmp_server(); + + float self_mem_percent = 0; + if (m->MemTotal > 0) { + 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; + + bool n_ok = false; + int64_t n_sample_time = 0; + int64_t nr_bytes = 0; + int64_t ns_bytes = 0; + int nb_n = srs_get_network_devices_count(); + for (int i = 0; i < nb_n; i++) { + SrsNetworkDevices& o = n[i]; + + // ignore the lo interface. + std::string inter = o.name; + if (!o.ok || inter == "lo") { + continue; + } + + n_ok = true; + nr_bytes += o.rbytes; + ns_bytes += o.sbytes; + n_sample_time = o.sample_time; + } + + ss << JOBJECT_START + << JFIELD_ERROR(ERROR_SUCCESS) << JFIELD_CONT + << JFIELD_ORG("data", JOBJECT_START) + << JFIELD_ORG("rusage_ok", (r->ok? "true":"false")) << JFIELD_CONT + << JFIELD_ORG("self_cpu_stat_ok", (u->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("meminfo_ok", (m->ok? "true":"false")) << JFIELD_CONT + << JFIELD_ORG("platform_ok", (p->ok? "true":"false")) << JFIELD_CONT + << JFIELD_ORG("network_ok", (n_ok? "true":"false")) << JFIELD_CONT + << JFIELD_ORG("network_srs_ok", (nrs->ok? "true":"false")) << JFIELD_CONT + << JFIELD_ORG("now_ms", now) << JFIELD_CONT + << JFIELD_ORG("self", JOBJECT_START) + << JFIELD_STR("version", RTMP_SIG_SRS_VERSION) << JFIELD_CONT + << JFIELD_ORG("pid", getpid()) << JFIELD_CONT + << JFIELD_ORG("ppid", u->ppid) << JFIELD_CONT + << JFIELD_STR("argv", _srs_config->argv()) << JFIELD_CONT + << JFIELD_STR("cwd", _srs_config->cwd()) << JFIELD_CONT + << JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << JFIELD_CONT + << JFIELD_ORG("mem_percent", self_mem_percent) << JFIELD_CONT + << JFIELD_ORG("cpu_percent", u->percent) << JFIELD_CONT + << JFIELD_ORG("srs_uptime", srs_uptime) + << JOBJECT_END << JFIELD_CONT + << JFIELD_ORG("system", JOBJECT_START) + << JFIELD_ORG("cpu_percent", s->percent) << JFIELD_CONT + << JFIELD_ORG("mem_ram_kbyte", m->MemTotal) << 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_percent", m->percent_swap) << JFIELD_CONT + << JFIELD_ORG("cpus", c->nb_processors) << JFIELD_CONT + << 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) << JFIELD_CONT + << JFIELD_ORG("net_sample_time", n_sample_time) << JFIELD_CONT + << JFIELD_ORG("net_recv_bytes", nr_bytes) << JFIELD_CONT + << JFIELD_ORG("net_send_bytes", ns_bytes) << JFIELD_CONT + << JFIELD_ORG("srs_sample_time", nrs->sample_time) << JFIELD_CONT + << JFIELD_ORG("srs_recv_bytes", nrs->rbytes) << JFIELD_CONT + << JFIELD_ORG("srs_recv_kbps", nrs->rkbps) << JFIELD_CONT + << JFIELD_ORG("srs_send_bytes", nrs->sbytes) << JFIELD_CONT + << JFIELD_ORG("srs_send_kbps", nrs->skbps) << JFIELD_CONT + << JFIELD_ORG("conn_sys", nrs->nb_conn_sys) << JFIELD_CONT + << JFIELD_ORG("conn_sys_et", nrs->nb_conn_sys_et) << JFIELD_CONT + << JFIELD_ORG("conn_sys_tw", nrs->nb_conn_sys_tw) << JFIELD_CONT + << JFIELD_ORG("conn_sys_ls", nrs->nb_conn_sys_ls) << JFIELD_CONT + << JFIELD_ORG("conn_srs", nrs->nb_conn_srs) + << JOBJECT_END + << JOBJECT_END + << JOBJECT_END; +} diff --git a/trunk/src/app/srs_app_utility.hpp b/trunk/src/app/srs_app_utility.hpp index abd1f2a47..a92b23d44 100644 --- a/trunk/src/app/srs_app_utility.hpp +++ b/trunk/src/app/srs_app_utility.hpp @@ -32,6 +32,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include +#include #include @@ -439,4 +440,6 @@ std::string srs_get_local_ip(int fd); // where peer ip is the client public ip which connected to server. std::string srs_get_peer_ip(int fd); +void srs_api_dump_summaries(std::stringstream& ss); + #endif diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 85970f376..aa2cc5ae9 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR "0" #define VERSION_MINOR "9" -#define VERSION_REVISION "131" +#define VERSION_REVISION "132" #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION // server info. #define RTMP_SIG_SRS_KEY "SRS"