winlin

Merge pull request #279 from tufang14/develop

add client num for stream in statistic for #227
@@ -530,9 +530,7 @@ int SrsApiVhosts::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) @@ -530,9 +530,7 @@ int SrsApiVhosts::do_process_request(SrsStSocket* skt, SrsHttpMessage* req)
530 ss << __SRS_JOBJECT_START 530 ss << __SRS_JOBJECT_START
531 << __SRS_JFIELD_ERROR(ret) << __SRS_JFIELD_CONT 531 << __SRS_JFIELD_ERROR(ret) << __SRS_JFIELD_CONT
532 << __SRS_JFIELD_ORG("server", stat->server_id()) << __SRS_JFIELD_CONT 532 << __SRS_JFIELD_ORG("server", stat->server_id()) << __SRS_JFIELD_CONT
533 - << __SRS_JFIELD_ORG("vhosts", __SRS_JARRAY_START)  
534 - << data.str()  
535 - << __SRS_JARRAY_END 533 + << __SRS_JFIELD_ORG("vhosts", data.str())
536 << __SRS_JOBJECT_END; 534 << __SRS_JOBJECT_END;
537 535
538 return res_json(skt, req, ss.str()); 536 return res_json(skt, req, ss.str());
@@ -562,9 +560,7 @@ int SrsApiStreams::do_process_request(SrsStSocket* skt, SrsHttpMessage* req) @@ -562,9 +560,7 @@ int SrsApiStreams::do_process_request(SrsStSocket* skt, SrsHttpMessage* req)
562 ss << __SRS_JOBJECT_START 560 ss << __SRS_JOBJECT_START
563 << __SRS_JFIELD_ERROR(ret) << __SRS_JFIELD_CONT 561 << __SRS_JFIELD_ERROR(ret) << __SRS_JFIELD_CONT
564 << __SRS_JFIELD_ORG("server", stat->server_id()) << __SRS_JFIELD_CONT 562 << __SRS_JFIELD_ORG("server", stat->server_id()) << __SRS_JFIELD_CONT
565 - << __SRS_JFIELD_ORG("streams", __SRS_JARRAY_START)  
566 - << data.str()  
567 - << __SRS_JARRAY_END 563 + << __SRS_JFIELD_ORG("streams", data.str())
568 << __SRS_JOBJECT_END; 564 << __SRS_JOBJECT_END;
569 565
570 return res_json(skt, req, ss.str()); 566 return res_json(skt, req, ss.str());
@@ -200,6 +200,7 @@ int SrsRtmpConn::do_cycle() @@ -200,6 +200,7 @@ int SrsRtmpConn::do_cycle()
200 200
201 ret = service_cycle(); 201 ret = service_cycle();
202 http_hooks_on_close(); 202 http_hooks_on_close();
  203 + SrsStatistic::instance()->on_close(_srs_context->get_id());
203 204
204 return ret; 205 return ret;
205 } 206 }
@@ -121,7 +121,35 @@ int SrsStatistic::on_client(int id, SrsRequest* req) @@ -121,7 +121,35 @@ int SrsStatistic::on_client(int id, SrsRequest* req)
121 } else { 121 } else {
122 stream = streams[url]; 122 stream = streams[url];
123 } 123 }
  124 +
  125 + // create client if not exists
  126 + SrsStatisticClient* client = NULL;
  127 + if (clients.find(id) == clients.end()) {
  128 + client = new SrsStatisticClient();
  129 + client->stream = stream;
  130 + clients[id] = client;
  131 + } else {
  132 + client = clients[id];
  133 + }
124 134
  135 + stream->clients[id] = client;
  136 +
  137 + return ret;
  138 +}
  139 +
  140 +int SrsStatistic::on_close(int id)
  141 +{
  142 + int ret = ERROR_SUCCESS;
  143 +
  144 + std::map<int, SrsStatisticClient*>::iterator it;
  145 + it = clients.find(id);
  146 + if (it != clients.end()) {
  147 + SrsStatisticClient* client = it->second;
  148 + client->stream->clients.erase(id);
  149 + srs_freep(client);
  150 + clients.erase(it);
  151 + }
  152 +
125 return ret; 153 return ret;
126 } 154 }
127 155
@@ -134,15 +162,21 @@ int SrsStatistic::dumps_vhosts(stringstream& ss) @@ -134,15 +162,21 @@ int SrsStatistic::dumps_vhosts(stringstream& ss)
134 { 162 {
135 int ret = ERROR_SUCCESS; 163 int ret = ERROR_SUCCESS;
136 164
  165 + ss << __SRS_JARRAY_START;
137 std::map<std::string, SrsStatisticVhost*>::iterator it; 166 std::map<std::string, SrsStatisticVhost*>::iterator it;
138 for (it = vhosts.begin(); it != vhosts.end(); it++) { 167 for (it = vhosts.begin(); it != vhosts.end(); it++) {
139 SrsStatisticVhost* vhost = it->second; 168 SrsStatisticVhost* vhost = it->second;
  169 + if (it != vhosts.begin()) {
  170 + ss << __SRS_JFIELD_CONT;
  171 + }
  172 +
140 ss << __SRS_JOBJECT_START 173 ss << __SRS_JOBJECT_START
141 << __SRS_JFIELD_ORG("id", vhost->id) << __SRS_JFIELD_CONT 174 << __SRS_JFIELD_ORG("id", vhost->id) << __SRS_JFIELD_CONT
142 << __SRS_JFIELD_STR("name", vhost->vhost) 175 << __SRS_JFIELD_STR("name", vhost->vhost)
143 << __SRS_JOBJECT_END; 176 << __SRS_JOBJECT_END;
144 } 177 }
145 - 178 + ss << __SRS_JARRAY_END;
  179 +
146 return ret; 180 return ret;
147 } 181 }
148 182
@@ -150,15 +184,22 @@ int SrsStatistic::dumps_streams(stringstream& ss) @@ -150,15 +184,22 @@ int SrsStatistic::dumps_streams(stringstream& ss)
150 { 184 {
151 int ret = ERROR_SUCCESS; 185 int ret = ERROR_SUCCESS;
152 186
  187 + ss << __SRS_JARRAY_START;
153 std::map<std::string, SrsStatisticStream*>::iterator it; 188 std::map<std::string, SrsStatisticStream*>::iterator it;
154 for (it = streams.begin(); it != streams.end(); it++) { 189 for (it = streams.begin(); it != streams.end(); it++) {
155 SrsStatisticStream* stream = it->second; 190 SrsStatisticStream* stream = it->second;
  191 + if (it != streams.begin()) {
  192 + ss << __SRS_JFIELD_CONT;
  193 + }
  194 +
156 ss << __SRS_JOBJECT_START 195 ss << __SRS_JOBJECT_START
157 << __SRS_JFIELD_ORG("id", stream->id) << __SRS_JFIELD_CONT 196 << __SRS_JFIELD_ORG("id", stream->id) << __SRS_JFIELD_CONT
158 << __SRS_JFIELD_STR("name", stream->stream) << __SRS_JFIELD_CONT 197 << __SRS_JFIELD_STR("name", stream->stream) << __SRS_JFIELD_CONT
159 - << __SRS_JFIELD_ORG("vhost", stream->vhost->id) 198 + << __SRS_JFIELD_ORG("vhost", stream->vhost->id) << __SRS_JFIELD_CONT
  199 + << __SRS_JFIELD_ORG("clients", stream->clients.size())
160 << __SRS_JOBJECT_END; 200 << __SRS_JOBJECT_END;
161 } 201 }
  202 + ss << __SRS_JARRAY_END;
162 203
163 return ret; 204 return ret;
164 } 205 }
@@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 #include <string> 34 #include <string>
35 35
36 class SrsRequest; 36 class SrsRequest;
  37 +struct SrsStatisticClient;
37 38
38 struct SrsStatisticVhost 39 struct SrsStatisticVhost
39 { 40 {
@@ -53,6 +54,7 @@ public: @@ -53,6 +54,7 @@ public:
53 std::string app; 54 std::string app;
54 std::string stream; 55 std::string stream;
55 std::string url; 56 std::string url;
  57 + std::map<int, SrsStatisticClient*> clients;
56 public: 58 public:
57 SrsStatisticStream(); 59 SrsStatisticStream();
58 virtual ~SrsStatisticStream(); 60 virtual ~SrsStatisticStream();
@@ -89,6 +91,10 @@ public: @@ -89,6 +91,10 @@ public:
89 * @param req, the client request object. 91 * @param req, the client request object.
90 */ 92 */
91 virtual int on_client(int id, SrsRequest* req); 93 virtual int on_client(int id, SrsRequest* req);
  94 + /**
  95 + * client close
  96 + */
  97 + virtual int on_close(int id);
92 public: 98 public:
93 /** 99 /**
94 * get the server id, used to identify the server. 100 * get the server id, used to identify the server.