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/internal_tag_fwd.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>
31 last_successful_update_start_time{{}};
32 std::atomic<std::chrono::milliseconds> last_update_duration{{}};
33};
34
35void DumpMetric(utils::statistics::Writer& writer,
36 const UpdateStatistics& stats);
37
38struct Statistics final {
39 UpdateStatistics full_update;
40 UpdateStatistics incremental_update;
41 std::atomic<std::size_t> documents_current_count{0};
42};
43
44void DumpMetric(utils::statistics::Writer& writer, const Statistics& stats);
45
46enum class UpdateState { kNotFinished, kSuccess, kFailure };
47
48} // namespace impl
49
50/// @brief Allows a specific cache to fill cache statistics during an `Update`.
51///
52/// If `Update` returns without throwing an exception and without calling one
53/// of the `Finish*` methods, the behavior is undefined.
54///
55/// See components::CachingComponentBase::Set() for information on actual cache
56/// update, rather than statistics update.
57class UpdateStatisticsScope final {
58 public:
59 /// @cond
60 // For internal use only
61 UpdateStatisticsScope(impl::Statistics& stats, cache::UpdateType type);
62
63 ~UpdateStatisticsScope();
64
65 impl::UpdateState GetState(utils::InternalTag) const;
66 /// @endcond
67
68 /// @brief Mark that the `Update` has finished with changes
69 /// @param documents_count the new total number of items stored in the cache
70 void Finish(std::size_t total_documents_count);
71
72 /// @brief Mark that the `Update` has finished without changes
74
75 /// @brief Mark that the `Update` failed
77
78 /// @brief Each item received from the data source should be accounted with
79 /// this function
80 /// @note This method can be called multiple times per `Update`
81 /// @param add the number of items (both valid and non-valid) newly received
82 void IncreaseDocumentsReadCount(std::size_t add);
83
84 /// @brief Each received item that failed validation should be accounted with
85 /// this function, in addition to IncreaseDocumentsReadCount
86 /// @note This method can be called multiple times per `Update`
87 /// @param add the number of non-valid items newly received
88 void IncreaseDocumentsParseFailures(std::size_t add);
89
90 private:
91 void DoFinish(impl::UpdateState new_state);
92
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_;
97};
98
99} // namespace cache
100
101USERVER_NAMESPACE_END