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