void MetricsManager::upload()

in aws/metrics/metrics_manager.cc [85:130]


void MetricsManager::upload() {
  std::vector<std::shared_ptr<Metric>> uploads;

  for (auto& m : metrics_index_.get_all()) {
    if (constants::filter(m->all_dimensions(), level_, granularity_) &&
        m->accumulator().count(kNumBuckets) > 0) {
      uploads.push_back(std::move(m));
    }
  }

  std::sort(uploads.begin(), uploads.end(), MetricsCmp());

  for (size_t i = 1; i <= uploads.size(); i++) {
    size_t step = uploads.size() / i;
    if (step > 20) {
      continue;
    }

    std::vector<Aws::CloudWatch::Model::PutMetricDataRequest> batches;

    for (size_t j = 0; j < uploads.size(); j += step) {
      size_t k = std::min(j + step, uploads.size());
      Aws::CloudWatch::Model::PutMetricDataRequest req;
      req.SetNamespace(cw_namespace_);
      for (size_t z = j; z < k; z++) {
        req.AddMetricData(detail::to_sdk_metric_datum(uploads[z], kNumBuckets));
      }
      batches.emplace_back(req);
    }

    bool small_enough = true;
    for (auto& pmdr : batches) {
      if (pmdr.SerializePayload().size() > 38 * 1024) {
        small_enough = false;
        break;
      }
    }

    if (small_enough) {
      for (auto& pmdr : batches) {
        upload_one(pmdr, std::make_shared<detail::UploadContext>());
      }
      break;
    }
  }
}