userver: userver/congestion_control/sensor.hpp Source File
Loading...
Searching...
No Matches
sensor.hpp
1#pragma once
2
3#include <chrono>
4#include <cstdint>
5#include <string>
6#include <unordered_map>
7
8USERVER_NAMESPACE_BEGIN
9
10namespace congestion_control {
11
12/// Abstract sensor that fetches counters. These counters will be used
13/// to forecast saturation levels and limit current load.
14class Sensor {
15public:
16 struct Data {
17 std::uint64_t current_load{0};
18 std::uint64_t overload_events_count{0};
19 std::uint64_t no_overload_events_count{0};
20 std::chrono::steady_clock::time_point tp;
21
22 double GetLoadPercent() const;
23 };
24
25 virtual ~Sensor() = default;
26
27 /// @brief Fetch current counters
28 /// @note Can be called both from coroutine and non-coroutine context
29 virtual Data FetchCurrent() = 0;
30};
31
32namespace v2 {
33
34class Sensor {
35public:
36 struct SingleObjectData {
37 static constexpr auto kCommonObjectName = "common";
38
39 std::size_t total{0};
40 std::size_t timeouts{0};
41 std::size_t timings_sum_ms{0};
42
43 double GetRate() const { return static_cast<double>(timeouts) / (total ? total : 1); }
44 std::string ToLogString() const;
45 };
46
47 struct Data {
48 std::unordered_map<std::string, SingleObjectData> objects;
49 std::size_t current_load{0};
50 };
51
52 virtual ~Sensor() = default;
53
54 virtual Data GetCurrent() = 0;
55};
56
57} // namespace v2
58
59} // namespace congestion_control
60
61USERVER_NAMESPACE_END