From 01ffc42f9f919397e5a0fc46aba3d7049bf4db1d Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 20 Oct 2017 14:16:44 +0200 Subject: [PATCH] Stats delay for input/output can now be set separately, input delay by default 2 instead of 15. --- lib/defines.h | 1 + src/controller/controller_statistics.cpp | 83 ++++++++++++++---------- 2 files changed, 51 insertions(+), 33 deletions(-) diff --git a/lib/defines.h b/lib/defines.h index 5f9de780..23950f13 100644 --- a/lib/defines.h +++ b/lib/defines.h @@ -92,6 +92,7 @@ static inline void show_stackframe(){} #ifndef STATS_DELAY #define STATS_DELAY 15 #endif +#define STATS_INPUT_DELAY 2 #ifndef INPUT_TIMEOUT #define INPUT_TIMEOUT STATS_DELAY diff --git a/src/controller/controller_statistics.cpp b/src/controller/controller_statistics.cpp index c4357627..3125e786 100644 --- a/src/controller/controller_statistics.cpp +++ b/src/controller/controller_statistics.cpp @@ -329,11 +329,13 @@ void Controller::SharedMemStats(void * config){ if (sessions.size()){ std::list mustWipe; unsigned long long cutOffPoint = Util::epoch() - STAT_CUTOFF; - unsigned long long disconnectPoint = Util::epoch() - STATS_DELAY; + unsigned long long disconnectPointIn = Util::epoch() - STATS_INPUT_DELAY; + unsigned long long disconnectPointOut = Util::epoch() - STATS_DELAY; for (std::map::iterator it = sessions.begin(); it != sessions.end(); it++){ - it->second.ping(it->first, disconnectPoint); + unsigned long long dPoint = it->second.getSessType() == SESS_INPUT ? disconnectPointIn : disconnectPointOut; + it->second.ping(it->first, dPoint); if (it->second.sync == 100){ - it->second.wipeOld(disconnectPoint); + it->second.wipeOld(dPoint); }else{ it->second.wipeOld(cutOffPoint); } @@ -1199,16 +1201,23 @@ void Controller::fillActive(JSON::Value & req, JSON::Value & rep, bool onlyNow){ //collect the data first std::set streams; std::map clients; - unsigned int t = Util::epoch() - STATS_DELAY; + unsigned int tOut = Util::epoch() - STATS_DELAY; + unsigned int tIn = Util::epoch() - STATS_INPUT_DELAY; //check all sessions { tthread::lock_guard guard(statsMutex); if (sessions.size()){ for (std::map::iterator it = sessions.begin(); it != sessions.end(); it++){ - if (!onlyNow || (it->second.hasDataFor(t) && it->second.isViewerOn(t))){ - streams.insert(it->first.streamName); - if (it->second.getSessType() == SESS_VIEWER){ - clients[it->first.streamName]++; + if (it->second.getSessType() == SESS_INPUT){ + if (!onlyNow || (it->second.hasDataFor(tIn) && it->second.isViewerOn(tIn))){ + streams.insert(it->first.streamName); + } + }else{ + if (!onlyNow || (it->second.hasDataFor(tOut) && it->second.isViewerOn(tOut))){ + streams.insert(it->first.streamName); + if (it->second.getSessType() == SESS_VIEWER){ + clients[it->first.streamName]++; + } } } } @@ -1438,7 +1447,7 @@ void Controller::handlePrometheus(HTTP::Parser & H, Socket::Connection & conn, i break; } H.SetHeader("Server", "MistServer/" PACKAGE_VERSION); - H.StartResponse("200", "OK", H, conn); + H.StartResponse("200", "OK", H, conn, true); //Collect core server stats @@ -1549,28 +1558,32 @@ void Controller::handlePrometheus(HTTP::Parser & H, Socket::Connection & conn, i std::map streams; std::map outputs; unsigned long totViewers = 0, totInputs = 0, totOutputs = 0; - unsigned int t = Util::epoch() - STATS_DELAY; + unsigned int tOut = Util::epoch() - STATS_DELAY; + unsigned int tIn = Util::epoch() - STATS_INPUT_DELAY; //check all sessions if (sessions.size()){ for (std::map::iterator it = sessions.begin(); it != sessions.end(); it++){ - if (it->second.hasDataFor(t) && it->second.isViewerOn(t)){ - switch (it->second.getSessType()){ - case SESS_UNSET: - case SESS_VIEWER: + switch (it->second.getSessType()){ + case SESS_UNSET: + case SESS_VIEWER: + if (it->second.hasDataFor(tOut) && it->second.isViewerOn(tOut)){ streams[it->first.streamName].viewers++; outputs[it->first.connector]++; totViewers++; - break; - case SESS_INPUT: + } + break; + case SESS_INPUT: + if (it->second.hasDataFor(tIn) && it->second.isViewerOn(tIn)){ streams[it->first.streamName].inputs++; totInputs++; - break; - case SESS_OUTPUT: + } + break; + case SESS_OUTPUT: + if (it->second.hasDataFor(tOut) && it->second.isViewerOn(tOut)){ streams[it->first.streamName].outputs++; totOutputs++; - break; - } - + } + break; } } } @@ -1639,28 +1652,32 @@ void Controller::handlePrometheus(HTTP::Parser & H, Socket::Connection & conn, i std::map streams; std::map outputs; unsigned long totViewers = 0, totInputs = 0, totOutputs = 0; - unsigned int t = Util::epoch() - STATS_DELAY; + unsigned int tOut = Util::epoch() - STATS_DELAY; + unsigned int tIn = Util::epoch() - STATS_INPUT_DELAY; //check all sessions if (sessions.size()){ for (std::map::iterator it = sessions.begin(); it != sessions.end(); it++){ - if (it->second.hasDataFor(t) && it->second.isViewerOn(t)){ - switch (it->second.getSessType()){ - case SESS_UNSET: - case SESS_VIEWER: + switch (it->second.getSessType()){ + case SESS_UNSET: + case SESS_VIEWER: + if (it->second.hasDataFor(tOut) && it->second.isViewerOn(tOut)){ streams[it->first.streamName].viewers++; outputs[it->first.connector]++; totViewers++; - break; - case SESS_INPUT: + } + break; + case SESS_INPUT: + if (it->second.hasDataFor(tIn) && it->second.isViewerOn(tIn)){ streams[it->first.streamName].inputs++; totInputs++; - break; - case SESS_OUTPUT: + } + break; + case SESS_OUTPUT: + if (it->second.hasDataFor(tOut) && it->second.isViewerOn(tOut)){ streams[it->first.streamName].outputs++; totOutputs++; - break; - } - + } + break; } } }