void Retrier::emit_metrics()

in aws/kinesis/core/retrier.cc [262:304]


void Retrier::emit_metrics(const std::shared_ptr<UserRecord>& ur) {
  using aws::metrics::constants::Names;

  assert(ur->attempts().size() > 0);

  bool successful = ur->attempts().back();

  std::string shard_id;
  if (successful) {
    shard_id = ur->attempts().back().shard_id();
  } else if (ur->predicted_shard()) {
    shard_id = ShardMap::shard_id_to_str(*ur->predicted_shard());
  }

  auto put = [&](auto name, auto val) {
    auto f = metrics_manager_->finder().set_name(name)
                                       .set_stream(ur->stream());
    if (!shard_id.empty()) {
      f.set_shard(shard_id);
    }
    f.find()->put(val);
  };

  if (successful) {
    put(Names::UserRecordsPut, 1);
    put(Names::UserRecordsDataPut, ur->data().length());
  } else {
    put(Names::UserRecordsPut, 0);
    if (ur->attempts().back().error_code() == "Expired") {
      put(Names::UserRecordExpired, 1);
    }
  }

  auto last = ur->arrival();
  for (auto& a : ur->attempts()) {
    put(Names::BufferingTime,
        std::chrono::duration_cast<std::chrono::milliseconds>(
            a.start() - last).count());
    last = a.end();
  }

  put(Names::RetriesPerRecord, ur->attempts().size() - 1);
}