обновил сбор статистики, теперь он выполняется отдельно от загрузки состояния и может работать на FULL RATE. К тому же, статистика доступна только на SCPC модеме

This commit is contained in:
2025-04-03 15:26:03 +03:00
parent a204c4002b
commit 70a2257255
3 changed files with 32 additions and 22 deletions

View File

@@ -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;