void LogCollector::startLogUploadCheckTimer() { logUploadCheckTimer_.stop(); logUploadCheckTimer_.start(uploadStrategy_->getLogUploadCheckPeriod(),[this] { processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus())); }); }
void LogCollector::onLogUploadResponse(const LogSyncResponse& response) { KAA_MUTEX_LOCKING("storageGuard_"); KAA_MUTEX_UNIQUE_DECLARE(storageGuardLock, storageGuard_); KAA_MUTEX_LOCKED("storageGuard_"); if (!response.deliveryStatuses.is_null()) { const auto& deliveryStatuses = response.deliveryStatuses.get_array(); for (const auto& status : deliveryStatuses) { if (!removeDeliveryTimeout(status.requestId)) { continue; } if (status.result == SyncResponseResultType::SUCCESS) { KAA_LOG_INFO(boost::format("Logs (requestId %ld) successfully delivered") % status.requestId); storage_->removeRecordBlock(status.requestId); } else { storage_->notifyUploadFailed(status.requestId); KAA_MUTEX_UNLOCKING("storageGuard_"); KAA_UNLOCK(storageGuardLock); KAA_MUTEX_UNLOCKED("storageGuard_"); if (!status.errorCode.is_null()) { auto errocCode = status.errorCode.get_LogDeliveryErrorCode(); KAA_LOG_WARN(boost::format("Logs (requestId %ld) failed to deliver (error %d)") % status.requestId % (int)errocCode); executorContext_.getCallbackExecutor().add([this, errocCode] () { uploadStrategy_->onFailure(*this, errocCode); }); } else { KAA_LOG_WARN("Log delivery failed, but no error code received"); } KAA_MUTEX_LOCKING("storageGuard_"); KAA_LOCK(storageGuardLock); KAA_MUTEX_LOCKED("storageGuard_"); } } } KAA_MUTEX_UNLOCKING("storageGuard_"); KAA_UNLOCK(storageGuardLock); KAA_MUTEX_UNLOCKED("storageGuard_"); processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus())); }
void LogCollector::addLogRecord(const KaaUserLogRecord& record) { LogRecordPtr serializedRecord(new LogRecord(record)); KAA_MUTEX_LOCKING("storageGuard_"); KAA_MUTEX_UNIQUE_DECLARE(lock, storageGuard_); KAA_MUTEX_LOCKED("storageGuard_"); storage_->addLogRecord(serializedRecord); KAA_MUTEX_UNLOCKING("storageGuard_"); KAA_UNLOCK(lock); KAA_MUTEX_UNLOCKED("storageGuard_"); processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus())); }
void LogCollector::processTimeout() { executorContext_.getCallbackExecutor().add([this] () { uploadStrategy_->onTimeout(*this); }); KAA_LOG_WARN(boost::format("Going to notify log storage of logs delivery timeout...")); KAA_MUTEX_LOCKING("timeoutsGuard_"); KAA_MUTEX_UNIQUE_DECLARE(timeoutsGuardLock, timeoutsGuard_); KAA_MUTEX_LOCKED("timeoutsGuard_"); for (const auto& request : timeouts_) { storage_->notifyUploadFailed(request.first); } timeouts_.clear(); KAA_MUTEX_UNLOCKING("timeoutsGuard_"); KAA_UNLOCK(timeoutsGuardLock); KAA_MUTEX_UNLOCKED("timeoutsGuard_"); processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus())); }
void LogCollector::addLogRecord(const KaaUserLogRecord& record) { /* * To avoid overhead on copying big-sized log records while capturing in lambdas, * serialization has been performed before adding task to executor. */ LogRecordPtr serializedRecord(new LogRecord(record)); executorContext_.getApiExecutor().add([this, serializedRecord] () { KAA_MUTEX_LOCKING("storageGuard_"); KAA_MUTEX_UNIQUE_DECLARE(lock, storageGuard_); KAA_MUTEX_LOCKED("storageGuard_"); storage_->addLogRecord(serializedRecord); KAA_MUTEX_UNLOCKING("storageGuard_"); KAA_UNLOCK(lock); KAA_MUTEX_UNLOCKED("storageGuard_"); processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus())); }); }
void LogCollector::processLogUploadDecision(LogUploadStrategyDecision decision) { switch (decision) { case LogUploadStrategyDecision::UPLOAD: { KAA_LOG_DEBUG("Going to upload logs"); doSync(); break; } case LogUploadStrategyDecision::NOOP: KAA_LOG_TRACE("Nothing to do now"); if (storage_->getStatus().getRecordsCount() > 0) { logUploadCheckTimer_.stop(); logUploadCheckTimer_.start(uploadStrategy_->getLogUploadCheckPeriod(),[&] { processLogUploadDecision(uploadStrategy_->isUploadNeeded(storage_->getStatus())); }); } break; default: KAA_LOG_WARN("Unknown log upload decision"); break; } }