обновил сбор статистики, теперь он выполняется отдельно от загрузки состояния и может работать на FULL RATE. К тому же, статистика доступна только на SCPC модеме
This commit is contained in:
parent
a204c4002b
commit
70a2257255
@ -480,7 +480,7 @@ public:
|
||||
rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)});
|
||||
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||
}));
|
||||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/dev/settings", this->auth, http::auth::User::DEVELOPER, [this](const auto& req, auto& rep) {
|
||||
std::string result;
|
||||
if (req.method == "GET") {
|
||||
@ -519,6 +519,7 @@ public:
|
||||
rep.content.clear();
|
||||
http::resource::loadFile("/tmp/weblog-statistics.csv", rep.content);
|
||||
}));
|
||||
#endif
|
||||
}
|
||||
|
||||
~ServerResources() = default;
|
||||
|
@ -136,6 +136,7 @@ std::string makeTimepointFromMillis(int64_t unix_time_ms) {
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
class api_driver::StatisticsLogger {
|
||||
public:
|
||||
StatisticsLogger(): timeStart(TIME_NOW()) {}
|
||||
@ -238,6 +239,7 @@ private:
|
||||
std::fstream logFile{};
|
||||
std::shared_mutex mutex;
|
||||
};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Этот демон нужен для того, чтобы получать статистику из API, а так же корректно сохранять настройки
|
||||
@ -266,9 +268,8 @@ private:
|
||||
std::string tmpDevState;
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDmaDebug(status_init)", CP_GetDmaDebug(sid, "status_init", &tmpDevState));
|
||||
#endif
|
||||
#ifdef MODEM_IS_SCPC
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetDebugMetrics()", CP_GetDebugMetrics(sid, debugMetrics));
|
||||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
bool isCinC = getIsCinC();
|
||||
if (isCinC) {
|
||||
logCpApiError("api_driver::TerminalApiDaemon::updateState()->CP_GetCinCState()", CP_GetCinCState(sid, cinc));
|
||||
@ -443,6 +444,7 @@ private:
|
||||
std::function<void()> callback;
|
||||
|
||||
bool checkNeedUpdate(int64_t now) const {
|
||||
if (periodMs < 0) return false;
|
||||
// тут нет смысла спать меньше чем на 20мс, поэтому можно разрешить чтение на некоторое время раньше
|
||||
return now - lastUpdate >= (periodMs - 20);
|
||||
}
|
||||
@ -457,6 +459,22 @@ private:
|
||||
};
|
||||
|
||||
IntervalUpdate_t updaters[] = {
|
||||
#ifdef MODEM_IS_SCPC
|
||||
// обновление логов
|
||||
{.lastUpdate = 0, .periodMs = -1, .callback = [this]() {
|
||||
try {
|
||||
{
|
||||
std::lock_guard _alock(this->cpApiMutex);
|
||||
std::lock_guard _slock(this->stateMutex);
|
||||
logCpApiError("api_driver::TerminalApiDaemon->statsLogs.putItem()->CP_GetDebugMetrics()", CP_GetDebugMetrics(sid, debugMetrics));
|
||||
}
|
||||
this->statsLogs.putItem(debugMetrics);
|
||||
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon->statsLogs.putItem(): success write statistics state to log!";
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon->statsLogs.putItem() failed to log: " << e.what();
|
||||
}
|
||||
}},
|
||||
#endif
|
||||
// обновление статистики
|
||||
{.lastUpdate = 0, .periodMs = CACHE_STATISTICS_UPDATE_MS, .callback = [this]() {
|
||||
try {
|
||||
@ -465,22 +483,6 @@ private:
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateState(): " << e.what();
|
||||
}
|
||||
|
||||
// запись статистики в лог, если нужно
|
||||
try {
|
||||
static int uc = 0;
|
||||
if (uc == 0) {
|
||||
this->statsLogs.putItem(debugMetrics);
|
||||
|
||||
BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateState(): success write statistics state to log!";
|
||||
}
|
||||
uc++;
|
||||
if (uc * CACHE_STATISTICS_UPDATE_MS >= this->statsLogs.logPeriodMs) {
|
||||
uc = 0;
|
||||
}
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateState() failed to log: " << e.what();
|
||||
}
|
||||
}},
|
||||
// обновление состояния устройства (обновления, температура)
|
||||
{.lastUpdate = 0, .periodMs = CACHE_DEV_STATE_UPDATE_MS, .callback = [this]() {
|
||||
@ -526,7 +528,9 @@ private:
|
||||
CP_Logout(this->sid);
|
||||
this->connectToApi();
|
||||
}
|
||||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
updaters[0].periodMs = this->statsLogs.logEn ? this->statsLogs.logPeriodMs.load() : -1;
|
||||
#endif
|
||||
int64_t sleepTime = 60000; // минута по-умолчанию
|
||||
auto now = TIME_NOW();
|
||||
for (auto& u: updaters) {
|
||||
@ -555,8 +559,8 @@ private:
|
||||
demodulator_state demodState{};
|
||||
device_state devState{};
|
||||
std::string deviceInitState;
|
||||
debug_metrics debugMetrics{};
|
||||
#ifdef MODEM_IS_SCPC
|
||||
debug_metrics debugMetrics{};
|
||||
CinC_state cincState{};
|
||||
#endif
|
||||
|
||||
@ -580,7 +584,9 @@ private:
|
||||
TerminalFirmwareVersion firmware;
|
||||
|
||||
public:
|
||||
#ifdef MODEM_IS_SCPC
|
||||
StatisticsLogger statsLogs;
|
||||
#endif
|
||||
|
||||
std::mutex cpApiMutex;
|
||||
TSID sid;
|
||||
@ -1371,7 +1377,7 @@ void api_driver::ApiDriver::executeInApi(const std::function<void(TSID sid)>& ca
|
||||
BOOST_LOG_TRIVIAL(error) << "ApiDriver::executeInApi(): failed to exec with error: " << e.what();
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
std::string api_driver::ApiDriver::getLoggingStatisticsSettings() {
|
||||
return this->daemon->statsLogs.getSettings();
|
||||
}
|
||||
@ -1379,6 +1385,7 @@ std::string api_driver::ApiDriver::getLoggingStatisticsSettings() {
|
||||
void api_driver::ApiDriver::setLoggingStatisticsSettings(boost::property_tree::ptree &pt) {
|
||||
this->daemon->statsLogs.setSettings(pt);
|
||||
}
|
||||
#endif
|
||||
|
||||
std::string api_driver::ApiDriver::loadSysInfo() {
|
||||
std::stringstream result;
|
||||
|
@ -72,6 +72,7 @@ namespace api_driver {
|
||||
|
||||
void executeInApi(const std::function<void(TSID sid)> &callback);
|
||||
|
||||
#ifdef MODEM_IS_SCPC
|
||||
std::string getLoggingStatisticsSettings();
|
||||
void setLoggingStatisticsSettings(boost::property_tree::ptree &pt);
|
||||
|
||||
@ -84,6 +85,7 @@ namespace api_driver {
|
||||
* @param maxItems
|
||||
*/
|
||||
void readLoggingStatistics(std::vector<uint8_t>& out, int timeStart = -1, int timeEnd = -1, bool ordering = false, int maxItems = -1);
|
||||
#endif
|
||||
|
||||
static std::string loadSysInfo();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user