Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
BackendCounters.hpp
1#pragma once
2
3#include "util/prometheus/Counter.hpp"
4#include "util/prometheus/Gauge.hpp"
5#include "util/prometheus/Histogram.hpp"
6
7#include <boost/json/object.hpp>
8
9#include <chrono>
10#include <cstdint>
11#include <functional>
12#include <memory>
13#include <string>
14
15namespace data {
16
20template <typename T>
21concept SomeBackendCounters = requires(T a) {
22 typename T::PtrType;
23 { a.registerTooBusy() } -> std::same_as<void>;
24 { a.registerWriteSync(std::chrono::steady_clock::time_point{}) } -> std::same_as<void>;
25 { a.registerWriteSyncRetry() } -> std::same_as<void>;
26 { a.registerWriteStarted() } -> std::same_as<void>;
27 { a.registerWriteFinished(std::chrono::steady_clock::time_point{}) } -> std::same_as<void>;
28 { a.registerWriteRetry() } -> std::same_as<void>;
29 { a.registerReadStarted(std::uint64_t{}) } -> std::same_as<void>;
30 {
31 a.registerReadFinished(std::chrono::steady_clock::time_point{}, std::uint64_t{})
32 } -> std::same_as<void>;
33 { a.registerReadRetry(std::uint64_t{}) } -> std::same_as<void>;
34 { a.registerReadError(std::uint64_t{}) } -> std::same_as<void>;
35 { a.report() } -> std::same_as<boost::json::object>;
36};
37
43class BackendCounters {
44public:
45 using PtrType = std::shared_ptr<BackendCounters>;
46
52 static PtrType
53 make();
54
58 void
60
66 void
67 registerWriteSync(std::chrono::steady_clock::time_point startTime);
68
72 void
74
78 void
80
86 void
87 registerWriteFinished(std::chrono::steady_clock::time_point startTime);
88
92 void
94
100 void
101 registerReadStarted(std::uint64_t count = 1u);
102
109 void
110 registerReadFinished(std::chrono::steady_clock::time_point startTime, std::uint64_t count = 1u);
111
117 void
118 registerReadRetry(std::uint64_t count = 1u);
119
125 void
126 registerReadError(std::uint64_t count = 1u);
127
133 boost::json::object
134 report() const;
135
136private:
137 BackendCounters();
138
139 class AsyncOperationCounters {
140 public:
141 AsyncOperationCounters(std::string name);
142
143 void
144 registerStarted(std::uint64_t count);
145
146 void
147 registerFinished(std::uint64_t count);
148
149 void
150 registerRetry(std::uint64_t count);
151
152 void
153 registerError(std::uint64_t count);
154
155 boost::json::object
156 report() const;
157
158 private:
159 std::string name_;
160 std::reference_wrapper<util::prometheus::GaugeInt> pendingCounter_;
161 std::reference_wrapper<util::prometheus::CounterInt> completedCounter_;
162 std::reference_wrapper<util::prometheus::CounterInt> retryCounter_;
163 std::reference_wrapper<util::prometheus::CounterInt> errorCounter_;
164 };
165
166 std::reference_wrapper<util::prometheus::CounterInt> tooBusyCounter_;
167
168 std::reference_wrapper<util::prometheus::CounterInt> writeSyncCounter_;
169 std::reference_wrapper<util::prometheus::CounterInt> writeSyncRetryCounter_;
170
171 AsyncOperationCounters asyncWriteCounters_{"write_async"};
172 AsyncOperationCounters asyncReadCounters_{"read_async"};
173
174 std::reference_wrapper<util::prometheus::HistogramInt> readDurationHistogram_;
175 std::reference_wrapper<util::prometheus::HistogramInt> writeDurationHistogram_;
176};
177
178} // namespace data
void registerTooBusy()
Register that the backend was too busy to process a request.
Definition BackendCounters.cpp:86
void registerWriteRetry()
Register that a write operation was retried.
Definition BackendCounters.cpp:119
void registerReadStarted(std::uint64_t count=1u)
Register that one or more read operations were started.
Definition BackendCounters.cpp:125
boost::json::object report() const
Get a report of the backend counters.
Definition BackendCounters.cpp:155
void registerWriteFinished(std::chrono::steady_clock::time_point startTime)
Register that a write operation was finished.
Definition BackendCounters.cpp:111
void registerWriteStarted()
Register that a write operation was started.
Definition BackendCounters.cpp:105
void registerWriteSync(std::chrono::steady_clock::time_point startTime)
Register that a write operation was started.
Definition BackendCounters.cpp:92
void registerReadFinished(std::chrono::steady_clock::time_point startTime, std::uint64_t count=1u)
Register that one or more read operations were finished.
Definition BackendCounters.cpp:131
void registerReadRetry(std::uint64_t count=1u)
Register that one or more read operations were retried.
Definition BackendCounters.cpp:143
void registerWriteSyncRetry()
Register that a write operation was retried.
Definition BackendCounters.cpp:99
static PtrType make()
Create a new BackendCounters object.
Definition BackendCounters.cpp:79
void registerReadError(std::uint64_t count=1u)
Register that one or more read operations had an error.
Definition BackendCounters.cpp:149
A concept for a class that can be used to count backend operations.
Definition BackendCounters.hpp:21
This namespace implements the data access layer and related components.
Definition AmendmentCenter.cpp:56