Aws::CloudWatchLogs::ROSCloudWatchLogsErrors CloudWatchLogsFacade::SendLogsRequest()

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