diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index 41c752dde..10f932f1c 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -530,9 +530,7 @@ int SrsApiVhosts::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) ss << __SRS_JOBJECT_START << __SRS_JFIELD_ERROR(ret) << __SRS_JFIELD_CONT << __SRS_JFIELD_ORG("server", stat->server_id()) << __SRS_JFIELD_CONT - << __SRS_JFIELD_ORG("vhosts", __SRS_JARRAY_START) - << data.str() - << __SRS_JARRAY_END + << __SRS_JFIELD_ORG("vhosts", data.str()) << __SRS_JOBJECT_END; return res_json(skt, req, ss.str()); @@ -562,9 +560,7 @@ int SrsApiStreams::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) ss << __SRS_JOBJECT_START << __SRS_JFIELD_ERROR(ret) << __SRS_JFIELD_CONT << __SRS_JFIELD_ORG("server", stat->server_id()) << __SRS_JFIELD_CONT - << __SRS_JFIELD_ORG("streams", __SRS_JARRAY_START) - << data.str() - << __SRS_JARRAY_END + << __SRS_JFIELD_ORG("streams", data.str()) << __SRS_JOBJECT_END; return res_json(skt, req, ss.str()); diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index bce2175be..6c1499be9 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -200,6 +200,7 @@ int SrsRtmpConn::do_cycle() ret = service_cycle(); http_hooks_on_close(); + SrsStatistic::instance()->on_close(_srs_context->get_id()); return ret; } diff --git a/trunk/src/app/srs_app_statistic.cpp b/trunk/src/app/srs_app_statistic.cpp index 45e0019c7..49eef587f 100644 --- a/trunk/src/app/srs_app_statistic.cpp +++ b/trunk/src/app/srs_app_statistic.cpp @@ -121,7 +121,35 @@ int SrsStatistic::on_client(int id, SrsRequest* req) } else { stream = streams[url]; } + + // create client if not exists + SrsStatisticClient* client = NULL; + if (clients.find(id) == clients.end()) { + client = new SrsStatisticClient(); + client->stream = stream; + clients[id] = client; + } else { + client = clients[id]; + } + stream->clients[id] = client; + + return ret; +} + +int SrsStatistic::on_close(int id) +{ + int ret = ERROR_SUCCESS; + + std::map::iterator it; + it = clients.find(id); + if (it != clients.end()) { + SrsStatisticClient* client = it->second; + client->stream->clients.erase(id); + srs_freep(client); + clients.erase(it); + } + return ret; } @@ -134,15 +162,21 @@ int SrsStatistic::dumps_vhosts(stringstream& ss) { int ret = ERROR_SUCCESS; + ss << __SRS_JARRAY_START; std::map::iterator it; for (it = vhosts.begin(); it != vhosts.end(); it++) { SrsStatisticVhost* vhost = it->second; + if (it != vhosts.begin()) { + ss << __SRS_JFIELD_CONT; + } + ss << __SRS_JOBJECT_START << __SRS_JFIELD_ORG("id", vhost->id) << __SRS_JFIELD_CONT << __SRS_JFIELD_STR("name", vhost->vhost) << __SRS_JOBJECT_END; } - + ss << __SRS_JARRAY_END; + return ret; } @@ -150,15 +184,22 @@ int SrsStatistic::dumps_streams(stringstream& ss) { int ret = ERROR_SUCCESS; + ss << __SRS_JARRAY_START; std::map::iterator it; for (it = streams.begin(); it != streams.end(); it++) { SrsStatisticStream* stream = it->second; + if (it != streams.begin()) { + ss << __SRS_JFIELD_CONT; + } + ss << __SRS_JOBJECT_START << __SRS_JFIELD_ORG("id", stream->id) << __SRS_JFIELD_CONT << __SRS_JFIELD_STR("name", stream->stream) << __SRS_JFIELD_CONT - << __SRS_JFIELD_ORG("vhost", stream->vhost->id) + << __SRS_JFIELD_ORG("vhost", stream->vhost->id) << __SRS_JFIELD_CONT + << __SRS_JFIELD_ORG("clients", stream->clients.size()) << __SRS_JOBJECT_END; } + ss << __SRS_JARRAY_END; return ret; } diff --git a/trunk/src/app/srs_app_statistic.hpp b/trunk/src/app/srs_app_statistic.hpp index f261962ea..0d380549d 100644 --- a/trunk/src/app/srs_app_statistic.hpp +++ b/trunk/src/app/srs_app_statistic.hpp @@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include class SrsRequest; +struct SrsStatisticClient; struct SrsStatisticVhost { @@ -53,6 +54,7 @@ public: std::string app; std::string stream; std::string url; + std::map clients; public: SrsStatisticStream(); virtual ~SrsStatisticStream(); @@ -89,6 +91,10 @@ public: * @param req, the client request object. */ virtual int on_client(int id, SrsRequest* req); + /** + * client close + */ + virtual int on_close(int id); public: /** * get the server id, used to identify the server.