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/PerfLog.h>
7
8#include <boost/asio/ip/host_name.hpp>
9
10#include <condition_variable>
11#include <cstdint>
12#include <fstream>
13#include <memory>
14#include <string>
15#include <thread>
16#include <unordered_map>
17#include <vector>
18
19namespace xrpl::perf {
20
22template <typename T>
23struct Locked
24{
27
28 Locked() = default;
29 Locked(T const& value) : value(value)
30 {
31 }
32 Locked(T&& value) : value(std::move(value))
33 {
34 }
35 Locked(Locked const& rhs) : value(rhs.value)
36 {
37 }
38 Locked(Locked&& rhs) : value(std::move(rhs.value))
39 {
40 }
41};
42
46class PerfLogImp : public PerfLog
47{
51 struct Counters
52 {
53 public:
58 struct Rpc
59 {
60 // Counters for each time a method starts and then either
61 // finishes successfully or with an exception.
65 // Cumulative duration of all finished and errored method calls.
67 };
68
72 struct Jq
73 {
74 // Counters for each time a job is enqueued, begins to run,
75 // finishes.
79 // Cumulative duration of all jobs' queued and running times.
82 };
83
84 // rpc and jq do not need mutex protection because all
85 // keys and values are created before more threads are started.
92
93 Counters(std::set<char const*> const& labels, JobTypes const& jobTypes);
95 countersJson() const;
97 currentJson() const;
98 };
99
110 std::string const hostname_{boost::asio::ip::host_name()};
111 bool stop_{false};
112 bool rotate_{false};
113
114 void
115 openLog();
116 void
117 run();
118 void
119 report();
120 void
121 rpcEnd(std::string const& method, std::uint64_t const requestId, bool finish);
122
123public:
125 Setup setup,
126 Application& app,
127 beast::Journal journal,
128 std::function<void()>&& signalStop);
129
130 ~PerfLogImp() override;
131
132 void
133 rpcStart(std::string const& method, std::uint64_t const requestId) override;
134
135 void
136 rpcFinish(std::string const& method, std::uint64_t const requestId) override
137 {
138 rpcEnd(method, requestId, true);
139 }
140
141 void
142 rpcError(std::string const& method, std::uint64_t const requestId) override
143 {
144 rpcEnd(method, requestId, false);
145 }
146
147 void
148 jobQueue(JobType const type) override;
149 void
150 jobStart(JobType const type, microseconds dur, steady_time_point startTime, int instance)
151 override;
152 void
153 jobFinish(JobType const type, microseconds dur, int instance) override;
154
156 countersJson() const override
157 {
158 return counters_.countersJson();
159 }
160
162 currentJson() const override
163 {
164 return counters_.currentJson();
165 }
166
167 void
168 resizeJobs(int const resize) override;
169 void
170 rotate() override;
171
172 void
173 start() override;
174
175 void
176 stop() override;
177};
178
179} // namespace xrpl::perf
A generic endpoint for log messages.
Definition Journal.h:38
Represents a JSON value.
Definition json_value.h:130
static JobTypes const & instance()
Definition JobTypes.h:102
std::condition_variable cond_
Definition PerfLogImp.h:108
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:105
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:109
beast::Journal const j_
Definition PerfLogImp.h:102
json::Value currentJson() const override
Render currently executing jobs and RPC calls and durations in Json.
Definition PerfLogImp.h:162
void rpcFinish(std::string const &method, std::uint64_t const requestId) override
Log successful finish of RPC call.
Definition PerfLogImp.h:136
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:103
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:156
std::string const hostname_
Definition PerfLogImp.h:110
void rpcError(std::string const &method, std::uint64_t const requestId) override
Log errored RPC call.
Definition PerfLogImp.h:142
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.
std::set< char const * > getHandlerNames()
Return names of all methods.
Definition Handler.cpp:484
Dummy class for unit tests.
Definition Workers.h:14
JobType
Definition Job.h:16
Locked(T const &value)
Definition PerfLogImp.h:29
Locked(Locked const &rhs)
Definition PerfLogImp.h:35
Locked(Locked &&rhs)
Definition PerfLogImp.h:38
std::mutex mutex
Definition PerfLogImp.h:26
Locked(T &&value)
Definition PerfLogImp.h:32
Job Queue task performance counters.
Definition PerfLogImp.h:73
RPC performance counters.
Definition PerfLogImp.h:59
Track performance counters and currently executing tasks.
Definition PerfLogImp.h:52
std::pair< char const *, steady_time_point > MethodStart
Definition PerfLogImp.h:54
std::vector< std::pair< JobType, steady_time_point > > jobs
Definition PerfLogImp.h:88
std::unordered_map< std::string, Locked< Rpc > > rpc
Definition PerfLogImp.h:86
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:87
std::unordered_map< std::uint64_t, MethodStart > methods
Definition PerfLogImp.h:90
Configuration from [perf] section of xrpld.cfg.
Definition PerfLog.h:45