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 std::atomic<bool> is_first_sync_update_complete{false}; // Success or failure does not matter here.
41};
42
43void DumpMetric(utils::statistics::Writer& writer, const Statistics& stats);
44
45enum class UpdateState { kNotFinished, kSuccess, kNoChanges, kFailure };
46
47} // namespace impl
48
49/// @brief Allows a specific cache to fill cache statistics during an `Update`.
50///
51/// If `Update` returns without throwing an exception and without calling one
52/// of the `Finish*` methods, the behavior is undefined.
53///
54/// See components::CachingComponentBase::Set() for information on actual cache
55/// update, rather than statistics update.
56class UpdateStatisticsScope final {
57public:
58 /// @cond
59 // Note: DO NOT try to create `UpdateStatisticsScope` manually for manual `Update` calls.
60 // CachingComponentBase's internals WILL be corrupted.
61 // Call `InvalidateAsync` or `UpdateSyncDebug` instead.
62 // For internal use only.
63 UpdateStatisticsScope(utils::impl::InternalTag, impl::Statistics& stats, cache::UpdateType type);
64
65 ~UpdateStatisticsScope();
66
67 // For internal use only.
68 impl::UpdateState GetState(utils::impl::InternalTag) const;
69 /// @endcond
70
71 /// @brief Mark that the `Update` has finished with changes
72 /// @param total_documents_count the new total number of items stored in the cache
73 void Finish(std::size_t total_documents_count);
74
75 /// @brief Mark that the `Update` has finished without changes
77
78 /// @brief Mark that the `Update` failed
80
81 /// @brief Each item received from the data source should be accounted with
82 /// this function
83 /// @note This method can be called multiple times per `Update`
84 /// @param add the number of items (both valid and non-valid) newly received
85 void IncreaseDocumentsReadCount(std::size_t add);
86
87 /// @brief Each received item that failed validation should be accounted with
88 /// this function, in addition to IncreaseDocumentsReadCount
89 /// @note This method can be called multiple times per `Update`
90 /// @param add the number of non-valid items newly received
91 void IncreaseDocumentsParseFailures(std::size_t add);
92
93private:
94 void DoFinish(impl::UpdateState new_state);
95
96 impl::Statistics& stats_;
97 impl::UpdateStatistics& update_stats_;
98 impl::UpdateState state_{impl::UpdateState::kNotFinished};
99 const std::chrono::steady_clock::time_point update_start_time_;
100};
101
102} // namespace cache
103
104USERVER_NAMESPACE_END