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>
14#include <dynamic_config/variables/USERVER_RPS_CCONTROL.hpp>
16USERVER_NAMESPACE_BEGIN
19namespace congestion_control {
22 size_t times_with_overload{0};
23 size_t times_wo_overload{0};
25 bool is_overloaded{
false};
26 std::optional<size_t> current_limit;
28 size_t max_up_delta{1};
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};
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()) -
45using Policy = ::dynamic_config::userver_rps_ccontrol::VariableType;
47class Controller
final {
49 Controller(std::string name, dynamic_config::Source config_source);
51 void Feed(
const Sensor::Data&);
53 Limit GetLimit()
const;
55 Limit GetLimitRaw()
const;
57 void SetEnabled(
bool enabled);
59 bool IsEnabled()
const;
61 const Stats& GetStats()
const;
64 bool IsOverloadedNow(
const Sensor::Data& data,
const Policy& policy)
const;
66 size_t CalcNewLimit(
const Sensor::Data& data,
const Policy& policy)
const;
68 static bool IsThresholdReached(
const Sensor::Data& data,
int percent);
70 const std::string name_;
72 dynamic_config::Source config_source_;
74 std::atomic<
bool> is_enabled_;
82 Controller& controller;