in cloudwatch_logs_common/src/utils/cloudwatch_logs_facade.cpp [62:104]
Aws::CloudWatchLogs::ROSCloudWatchLogsErrors CloudWatchLogsFacade::SendLogsRequest(
const Aws::CloudWatchLogs::Model::PutLogEventsRequest & request, Aws::String & next_token)
{
Aws::CloudWatchLogs::ROSCloudWatchLogsErrors status = CW_LOGS_SUCCEEDED;
// Rate limiting
const auto time_since_last_put = now() - last_put_time_;
if (time_since_last_put < kMinPutLogsPeriod) {
// This will wait _at most_ kMinPutLogsPeriod.
const auto sleep_for = kMinPutLogsPeriod - time_since_last_put;
AWS_LOG_WARN(__func__, "PutLogEvents occurring too quickly, rate limiting in effect. Delaying PutLogs call by %d ms", sleep_for.count());
std::this_thread::sleep_for(sleep_for);
}
auto response = this->cw_client_->PutLogEvents(request);
last_put_time_ = now();
if (!response.IsSuccess()) {
AWS_LOGSTREAM_ERROR(__func__, "Send log request failed due to: "
<< response.GetError().GetMessage() << ", with error code: "
<< static_cast<int>(response.GetError().GetErrorType()));
switch(response.GetError().GetErrorType()) {
case Aws::CloudWatchLogs::CloudWatchLogsErrors::NETWORK_CONNECTION:
status = CW_LOGS_NOT_CONNECTED;
break;
case Aws::CloudWatchLogs::CloudWatchLogsErrors::INVALID_PARAMETER_COMBINATION:
case Aws::CloudWatchLogs::CloudWatchLogsErrors::INVALID_PARAMETER_VALUE:
case Aws::CloudWatchLogs::CloudWatchLogsErrors::MISSING_PARAMETER:
status = CW_LOGS_INVALID_PARAMETER;
break;
default:
status = CW_LOGS_FAILED;
}
} else {
AWS_LOG_DEBUG(__func__, "Setting the sequence token to use for the next send log request.");
next_token = response.GetResult().GetNextSequenceToken();
}
return status;
}