xrpld
Loading...
Searching...
No Matches
PerfLogImp.h
1#pragma once
2
3#include <xrpld/rpc/detail/Handler.h>
4
5#include <xrpl/beast/utility/Journal.h>
6#include <xrpl/core/Job.h>
7#include <xrpl/core/JobTypes.h>
8#include <xrpl/core/PerfLog.h>
9#include <xrpl/json/json_value.h>
10
11#include <boost/asio/ip/host_name.hpp>
12
13#include <condition_variable>
14#include <cstdint>
15#include <fstream>
16#include <functional>
17#include <mutex>
18#include <set>
19#include <string>
20#include <thread>
21#include <unordered_map>
22#include <utility>
23#include <vector>
24
25namespace xrpl::perf {
26
30template <typename T>
31struct Locked
32{
35
36 Locked() = default;
37 Locked(T const& value) : value(value)
38 {
39 }
40 Locked(T&& value) : value(std::move(value))
41 {
42 }
43 Locked(Locked const& rhs) : value(rhs.value)
44 {
45 }
46 Locked(Locked&& rhs) : value(std::move(rhs.value))
47 {
48 }
49};
50
54class PerfLogImp : public PerfLog
55{
59 struct Counters
60 {
61 public:
66 struct Rpc
67 {
68 // Counters for each time a method starts and then either
69 // finishes successfully or with an exception.
73 // Cumulative duration of all finished and errored method calls.
75 };
76
80 struct Jq
81 {
82 // Counters for each time a job is enqueued, begins to run,
83 // finishes.
87 // Cumulative duration of all jobs' queued and running times.
90 };
91
92 // rpc and jq do not need mutex protection because all
93 // keys and values are created before more threads are started.
100
101 Counters(std::set<char const*> const& labels, JobTypes const& jobTypes);
103 countersJson() const;
105 currentJson() const;
106 };
107
118 std::string const hostname_{boost::asio::ip::host_name()};
119 bool stop_{false};
120 bool rotate_{false};
121
122 void
123 openLog();
124 void
125 run();
126 void
127 report();
128 void
129 rpcEnd(std::string const& method, std::uint64_t const requestId, bool finish);
130
131public:
133 Setup setup,
134 Application& app,
135 beast::Journal journal,
136 std::function<void()>&& signalStop);
137
138 ~PerfLogImp() override;
139
140 void
141 rpcStart(std::string const& method, std::uint64_t const requestId) override;
142
143 void
144 rpcFinish(std::string const& method, std::uint64_t const requestId) override
145 {
146 rpcEnd(method, requestId, true);
147 }
148
149 void
150 rpcError(std::string const& method, std::uint64_t const requestId) override
151 {
152 rpcEnd(method, requestId, false);
153 }
154
155 void
156 jobQueue(JobType const type) override;
157 void
158 jobStart(JobType const type, microseconds dur, steady_time_point startTime, int instance)
159 override;
160 void
161 jobFinish(JobType const type, microseconds dur, int instance) override;
162
164 countersJson() const override
165 {
166 return counters_.countersJson();
167 }
168
170 currentJson() const override
171 {
172 return counters_.currentJson();
173 }
174
175 void
176 resizeJobs(int const resize) override;
177 void
178 rotate() override;
179
180 void
181 start() override;
182
183 void
184 stop() override;
185};
186
187} // namespace xrpl::perf
A generic endpoint for log messages.
Definition Journal.h:44
Represents a JSON value.
Definition json_value.h:117
static JobTypes const & instance()
Definition JobTypes.h:106
std::condition_variable cond_
Definition PerfLogImp.h:116
void jobFinish(JobType const type, microseconds dur, int instance) override
Log job finishing.
void start() override
PerfLogImp(Setup setup, Application &app, beast::Journal journal, std::function< void()> &&signalStop)
std::ofstream logFile_
Definition PerfLogImp.h:113
void rpcStart(std::string const &method, std::uint64_t const requestId) override
Log start of RPC call.
void jobQueue(JobType const type) override
Log queued job.
void resizeJobs(int const resize) override
Ensure enough room to store each currently executing job.
system_time_point lastLog_
Definition PerfLogImp.h:117
beast::Journal const j_
Definition PerfLogImp.h:110
json::Value currentJson() const override
Render currently executing jobs and RPC calls and durations in Json.
Definition PerfLogImp.h:170
void rpcFinish(std::string const &method, std::uint64_t const requestId) override
Log successful finish of RPC call.
Definition PerfLogImp.h:144
void rpcEnd(std::string const &method, std::uint64_t const requestId, bool finish)
void stop() override
void rotate() override
Rotate perf log file.
std::function< void()> const signalStop_
Definition PerfLogImp.h:111
void jobStart(JobType const type, microseconds dur, steady_time_point startTime, int instance) override
Log job executing.
json::Value countersJson() const override
Render performance counters in Json.
Definition PerfLogImp.h:164
std::string const hostname_
Definition PerfLogImp.h:118
void rpcError(std::string const &method, std::uint64_t const requestId) override
Log errored RPC call.
Definition PerfLogImp.h:150
Singleton class that maintains performance counters and optionally writes Json-formatted data to a di...
Definition PerfLog.h:31
std::chrono::microseconds microseconds
Definition PerfLog.h:39
std::chrono::time_point< steady_clock > steady_time_point
Definition PerfLog.h:35
std::chrono::time_point< system_clock > system_time_point
Definition PerfLog.h:36
STL namespace.
Dummy class for unit tests.
Definition Workers.h:14
std::set< char const * > getHandlerNames()
Return names of all methods.
Definition Handler.cpp:486
JobType
Definition Job.h:21
Locked(T const &value)
Definition PerfLogImp.h:37
Locked(Locked const &rhs)
Definition PerfLogImp.h:43
Locked(Locked &&rhs)
Definition PerfLogImp.h:46
std::mutex mutex
Definition PerfLogImp.h:34
Locked(T &&value)
Definition PerfLogImp.h:40
Job Queue task performance counters.
Definition PerfLogImp.h:81
RPC performance counters.
Definition PerfLogImp.h:67
Track performance counters and currently executing tasks.
Definition PerfLogImp.h:60
std::pair< char const *, steady_time_point > MethodStart
Definition PerfLogImp.h:62
std::vector< std::pair< JobType, steady_time_point > > jobs
Definition PerfLogImp.h:96
std::unordered_map< std::string, Locked< Rpc > > rpc
Definition PerfLogImp.h:94
json::Value countersJson() const
json::Value currentJson() const
Counters(std::set< char const * > const &labels, JobTypes const &jobTypes)
std::unordered_map< JobType, Locked< Jq > > jq
Definition PerfLogImp.h:95
std::unordered_map< std::uint64_t, MethodStart > methods
Definition PerfLogImp.h:98
Configuration from [perf] section of xrpld.cfg.
Definition PerfLog.h:45