10#include <userver/cache/update_type.hpp> 
   11#include <userver/utils/internal_tag_fwd.hpp> 
   12#include <userver/utils/statistics/fwd.hpp> 
   13#include <userver/utils/statistics/rate_counter.hpp> 
   15USERVER_NAMESPACE_BEGIN
 
   21struct UpdateStatistics 
final {
 
   22  utils::statistics::RateCounter update_attempt_count{0};
 
   23  utils::statistics::RateCounter update_no_changes_count{0};
 
   24  utils::statistics::RateCounter update_failures_count{0};
 
   26  utils::statistics::RateCounter documents_read_count{0};
 
   27  utils::statistics::RateCounter documents_parse_failures{0};
 
   29  std::atomic<std::chrono::steady_clock::time_point> last_update_start_time{{}};
 
   30  std::atomic<std::chrono::steady_clock::time_point>
 
   31      last_successful_update_start_time{{}};
 
   32  std::atomic<std::chrono::milliseconds> last_update_duration{{}};
 
   35void DumpMetric(utils::statistics::Writer& writer,
 
   36                const UpdateStatistics& stats);
 
   38struct Statistics 
final {
 
   39  UpdateStatistics full_update;
 
   40  UpdateStatistics incremental_update;
 
   41  std::atomic<std::size_t> documents_current_count{0};
 
   44void DumpMetric(utils::statistics::Writer& writer, 
const Statistics& stats);
 
   46enum class UpdateState { kNotFinished, kSuccess, kFailure };
 
   57class UpdateStatisticsScope 
final {
 
   61  UpdateStatisticsScope(
impl::Statistics& stats, cache::
UpdateType type);
 
   63  ~UpdateStatisticsScope();
 
   65  impl::UpdateState GetState(utils::InternalTag) 
const;
 
   70  void Finish(std::size_t total_documents_count);
 
   91  void DoFinish(
impl::UpdateState new_state);
 
   93  impl::Statistics& stats_;
 
   94  impl::UpdateStatistics& update_stats_;
 
   95  impl::UpdateState state_{
impl::UpdateState::kNotFinished};
 
   96  const std::chrono::steady_clock::time_point update_start_time_;