userver: userver/cache/cache_statistics.hpp Source File
Loading...
Searching...
No Matches
cache_statistics.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/cache/cache_statistics.hpp
4/// @brief Statistics collection for components::CachingComponentBase
5
6#include <atomic>
7#include <chrono>
8#include <cstddef>
9
10#include <userver/cache/update_type.hpp>
11#include <userver/utils/impl/internal_tag.hpp>
12#include <userver/utils/statistics/fwd.hpp>
13#include <userver/utils/statistics/rate_counter.hpp>
14
15USERVER_NAMESPACE_BEGIN
16
17namespace cache {
18
19namespace impl {
20
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};
25
26 utils::statistics::RateCounter documents_read_count{0};
27 utils::statistics::RateCounter documents_parse_failures{0};
28
29 std::atomic<std::chrono::steady_clock::time_point> last_update_start_time{{}};
30 std::atomic<std::chrono::steady_clock::time_point> last_successful_update_start_time{{}};
31 std::atomic<std::chrono::milliseconds> last_update_duration{{}};
32};
33
34void DumpMetric(utils::statistics::Writer& writer, const UpdateStatistics& stats);
35
36struct Statistics final {
37 UpdateStatistics full_update;
38 UpdateStatistics incremental_update;
39 std::atomic<std::size_t> documents_current_count{0};
40};
41
42void DumpMetric(utils::statistics::Writer& writer, const Statistics& stats);
43
44enum class UpdateState { kNotFinished, kSuccess, kNoChanges, kFailure };
45
46} // namespace impl
47
48/// @brief Allows a specific cache to fill cache statistics during an `Update`.
49///
50/// If `Update` returns without throwing an exception and without calling one
51/// of the `Finish*` methods, the behavior is undefined.
52///
53/// See components::CachingComponentBase::Set() for information on actual cache
54/// update, rather than statistics update.
55class UpdateStatisticsScope final {
56public:
57 /// @cond
58 // For internal use only
59 UpdateStatisticsScope(impl::Statistics& stats, cache::UpdateType type);
60
61 ~UpdateStatisticsScope();
62
63 // For internal use only
64 impl::UpdateState GetState(utils::impl::InternalTag) const;
65 /// @endcond
66
67 /// @brief Mark that the `Update` has finished with changes
68 /// @param documents_count the new total number of items stored in the cache
69 void Finish(std::size_t total_documents_count);
70
71 /// @brief Mark that the `Update` has finished without changes
73
74 /// @brief Mark that the `Update` failed
76
77 /// @brief Each item received from the data source should be accounted with
78 /// this function
79 /// @note This method can be called multiple times per `Update`
80 /// @param add the number of items (both valid and non-valid) newly received
81 void IncreaseDocumentsReadCount(std::size_t add);
82
83 /// @brief Each received item that failed validation should be accounted with
84 /// this function, in addition to IncreaseDocumentsReadCount
85 /// @note This method can be called multiple times per `Update`
86 /// @param add the number of non-valid items newly received
87 void IncreaseDocumentsParseFailures(std::size_t add);
88
89private:
90 void DoFinish(impl::UpdateState new_state);
91
92 impl::Statistics& stats_;
93 impl::UpdateStatistics& update_stats_;
94 impl::UpdateState state_{impl::UpdateState::kNotFinished};
95 const std::chrono::steady_clock::time_point update_start_time_;
96};
97
98} // namespace cache
99
100USERVER_NAMESPACE_END