userver: userver/congestion_control/controller.hpp Source File
Loading...
Searching...
No Matches
controller.hpp
1#pragma once
2
3#include <atomic>
4#include <chrono>
5#include <cstddef>
6#include <optional>
7#include <string>
8
9#include <userver/congestion_control/limiter.hpp>
10#include <userver/congestion_control/sensor.hpp>
11#include <userver/dynamic_config/source.hpp>
12#include <userver/formats/json_fwd.hpp>
13
14#include <dynamic_config/variables/USERVER_RPS_CCONTROL.hpp>
15
16USERVER_NAMESPACE_BEGIN
17
18/// Congestion Control
19namespace congestion_control {
20
21struct PolicyState {
22 size_t times_with_overload{0};
23 size_t times_wo_overload{0};
24
25 bool is_overloaded{false};
26 std::optional<size_t> current_limit;
27
28 size_t max_up_delta{1};
29};
30
31struct Stats final {
32 std::atomic<size_t> no_limit{0};
33 std::atomic<size_t> not_overload_no_pressure{0};
34 std::atomic<size_t> not_overload_pressure{0};
35 std::atomic<size_t> overload_no_pressure{0};
36 std::atomic<size_t> overload_pressure{0};
37
38 std::atomic<size_t> current_state{0};
39 std::atomic<std::chrono::seconds> last_overload_pressure{
40 std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now().time_since_epoch()) -
41 std::chrono::hours(1)
42 };
43};
44
45using Policy = ::dynamic_config::userver_rps_ccontrol::VariableType;
46
47class Controller final {
48public:
49 Controller(std::string name, dynamic_config::Source config_source);
50
51 void Feed(const Sensor::Data&);
52
53 Limit GetLimit() const;
54
55 Limit GetLimitRaw() const;
56
57 void SetEnabled(bool enabled);
58
59 bool IsEnabled() const;
60
61 const Stats& GetStats() const;
62
63private:
64 bool IsOverloadedNow(const Sensor::Data& data, const Policy& policy) const;
65
66 size_t CalcNewLimit(const Sensor::Data& data, const Policy& policy) const;
67
68 static bool IsThresholdReached(const Sensor::Data& data, int percent);
69
70 const std::string name_;
71 Limit limit_;
72 dynamic_config::Source config_source_;
73 PolicyState state_;
74 std::atomic<bool> is_enabled_;
75
76 Stats stats_;
77};
78
79struct ControllerInfo {
80 Sensor& sensor;
81 Limiter& limiter;
82 Controller& controller;
83};
84
85} // namespace congestion_control
86
87USERVER_NAMESPACE_END