rippled
PerfLogImp.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2018 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_BASICS_PERFLOGIMP_H
21 #define RIPPLE_BASICS_PERFLOGIMP_H
22 
23 #include <ripple/basics/PerfLog.h>
24 #include <ripple/basics/chrono.h>
25 #include <ripple/beast/utility/Journal.h>
26 #include <ripple/protocol/jss.h>
27 #include <ripple/rpc/impl/Handler.h>
28 #include <boost/asio/ip/host_name.hpp>
29 #include <condition_variable>
30 #include <cstdint>
31 #include <fstream>
32 #include <memory>
33 #include <mutex>
34 #include <string>
35 #include <thread>
36 #include <type_traits>
37 #include <unordered_map>
38 #include <utility>
39 #include <vector>
40 
41 namespace ripple {
42 namespace perf {
43 
45 template <typename T>
46 struct Locked
47 {
48  T value;
49  mutable std::mutex mutex;
50 
51  Locked() = default;
52  Locked(T const& value) : value(value)
53  {
54  }
55  Locked(T&& value) : value(std::move(value))
56  {
57  }
58  Locked(Locked const& rhs) : value(rhs.value)
59  {
60  }
61  Locked(Locked&& rhs) : value(std::move(rhs.value))
62  {
63  }
64 };
65 
69 class PerfLogImp : public PerfLog
70 {
74  struct Counters
75  {
76  public:
81  struct Rpc
82  {
83  // Counters for each time a method starts and then either
84  // finishes successfully or with an exception.
88  // Cumulative duration of all finished and errored method calls.
90  };
91 
95  struct Jq
96  {
97  // Counters for each time a job is enqueued, begins to run,
98  // finishes.
102  // Cumulative duration of all jobs' queued and running times.
105  };
106 
107  // rpc_ and jq_ do not need mutex protection because all
108  // keys and values are created before more threads are started.
115 
116  Counters(
117  std::vector<char const*> const& labels,
118  JobTypes const& jobTypes);
120  countersJson() const;
122  currentJson() const;
123  };
124 
125  Setup const setup_;
127  std::function<void()> const signalStop_;
134  std::string const hostname_{boost::asio::ip::host_name()};
135  bool stop_{false};
136  bool rotate_{false};
137 
138  void
139  openLog();
140  void
141  run();
142  void
143  report();
144  void
145  rpcEnd(
146  std::string const& method,
147  std::uint64_t const requestId,
148  bool finish);
149 
150 public:
151  PerfLogImp(
152  Setup const& setup,
153  beast::Journal journal,
154  std::function<void()>&& signalStop);
155 
156  ~PerfLogImp() override;
157 
158  void
159  rpcStart(std::string const& method, std::uint64_t const requestId) override;
160 
161  void
162  rpcFinish(std::string const& method, std::uint64_t const requestId) override
163  {
164  rpcEnd(method, requestId, true);
165  }
166 
167  void
168  rpcError(std::string const& method, std::uint64_t const requestId) override
169  {
170  rpcEnd(method, requestId, false);
171  }
172 
173  void
174  jobQueue(JobType const type) override;
175  void
176  jobStart(
177  JobType const type,
178  microseconds dur,
179  steady_time_point startTime,
180  int instance) override;
181  void
182  jobFinish(JobType const type, microseconds dur, int instance) override;
183 
185  countersJson() const override
186  {
187  return counters_.countersJson();
188  }
189 
191  currentJson() const override
192  {
193  return counters_.currentJson();
194  }
195 
196  void
197  resizeJobs(int const resize) override;
198  void
199  rotate() override;
200 
201  void
202  start() override;
203 
204  void
205  stop() override;
206 };
207 
208 } // namespace perf
209 } // namespace ripple
210 
211 #endif // RIPPLE_BASICS_PERFLOGIMP_H
ripple::perf::PerfLog::microseconds
std::chrono::microseconds microseconds
Definition: PerfLog.h:56
ripple::perf::PerfLogImp::Counters::Jq::runningDuration
microseconds runningDuration
Definition: PerfLogImp.h:104
ripple::perf::PerfLogImp::Counters::Rpc::started
std::uint64_t started
Definition: PerfLogImp.h:85
fstream
std::string
STL class.
ripple::perf::PerfLogImp::Counters::Jq::finished
std::uint64_t finished
Definition: PerfLogImp.h:101
ripple::perf::PerfLogImp::lastLog_
system_time_point lastLog_
Definition: PerfLogImp.h:133
utility
ripple::JobTypes
Definition: JobTypes.h:32
ripple::perf::PerfLogImp::Counters::Jq::queued
std::uint64_t queued
Definition: PerfLogImp.h:99
ripple::perf::PerfLogImp::openLog
void openLog()
Definition: PerfLogImp.cpp:220
ripple::perf::PerfLogImp::Counters::jobsMutex_
std::mutex jobsMutex_
Definition: PerfLogImp.h:112
ripple::perf::PerfLogImp::countersJson
Json::Value countersJson() const override
Render performance counters in Json.
Definition: PerfLogImp.h:185
std::pair
ripple::perf::PerfLogImp::Counters::methodsMutex_
std::mutex methodsMutex_
Definition: PerfLogImp.h:114
vector
ripple::perf::PerfLogImp::jobFinish
void jobFinish(JobType const type, microseconds dur, int instance) override
Log job finishing.
Definition: PerfLogImp.cpp:409
ripple::perf::PerfLogImp::j_
const beast::Journal j_
Definition: PerfLogImp.h:126
ripple::perf::PerfLogImp::rotate
void rotate() override
Rotate perf log file.
Definition: PerfLogImp.cpp:436
ripple::perf::PerfLogImp::cond_
std::condition_variable cond_
Definition: PerfLogImp.h:132
ripple::perf::PerfLogImp::Counters::Rpc::finished
std::uint64_t finished
Definition: PerfLogImp.h:86
ripple::perf::PerfLogImp::Counters::Jq::started
std::uint64_t started
Definition: PerfLogImp.h:100
ripple::perf::PerfLog
Singleton class that maintains performance counters and optionally writes Json-formatted data to a di...
Definition: PerfLog.h:47
ripple::perf::PerfLogImp
Implementation class for PerfLog.
Definition: PerfLogImp.h:69
ripple::perf::PerfLogImp::Counters::methods_
std::unordered_map< std::uint64_t, MethodStart > methods_
Definition: PerfLogImp.h:113
std::function
ripple::perf::PerfLogImp::Counters::Rpc::errored
std::uint64_t errored
Definition: PerfLogImp.h:87
ripple::perf::PerfLogImp::hostname_
const std::string hostname_
Definition: PerfLogImp.h:134
ripple::perf::PerfLog::Setup
Configuration from [perf] section of rippled.cfg.
Definition: PerfLog.h:61
ripple::perf::Locked::Locked
Locked(T const &value)
Definition: PerfLogImp.h:52
ripple::perf::PerfLogImp::jobStart
void jobStart(JobType const type, microseconds dur, steady_time_point startTime, int instance) override
Log job executing.
Definition: PerfLogImp.cpp:386
ripple::perf::PerfLogImp::rotate_
bool rotate_
Definition: PerfLogImp.h:136
ripple::perf::PerfLogImp::currentJson
Json::Value currentJson() const override
Render currently executing jobs and RPC calls and durations in Json.
Definition: PerfLogImp.h:191
thread
ripple::perf::Locked::Locked
Locked(T &&value)
Definition: PerfLogImp.h:55
ripple::perf::Locked
A box coupling data with a mutex for locking access to it.
Definition: PerfLogImp.h:46
ripple::perf::PerfLogImp::mutex_
std::mutex mutex_
Definition: PerfLogImp.h:131
std::ofstream
STL class.
ripple::perf::PerfLogImp::Counters::jobs_
std::vector< std::pair< JobType, steady_time_point > > jobs_
Definition: PerfLogImp.h:111
ripple::perf::PerfLogImp::Counters::jq_
std::unordered_map< JobType, Locked< Jq > > jq_
Definition: PerfLogImp.h:110
ripple::JobTypes::instance
static JobTypes const & instance()
Definition: JobTypes.h:105
std::chrono::time_point
cstdint
ripple::perf::Locked::value
T value
Definition: PerfLogImp.h:48
ripple::perf::PerfLogImp::thread_
std::thread thread_
Definition: PerfLogImp.h:130
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
std::uint64_t
ripple::perf::PerfLogImp::signalStop_
const std::function< void()> signalStop_
Definition: PerfLogImp.h:127
ripple::perf::PerfLogImp::PerfLogImp
PerfLogImp(Setup const &setup, beast::Journal journal, std::function< void()> &&signalStop)
Definition: PerfLogImp.cpp:304
ripple::perf::PerfLogImp::Counters::rpc_
std::unordered_map< std::string, Locked< Rpc > > rpc_
Definition: PerfLogImp.h:109
memory
ripple::perf::PerfLogImp::Counters::Jq
Job Queue task performance counters.
Definition: PerfLogImp.h:95
ripple::perf::PerfLogImp::~PerfLogImp
~PerfLogImp() override
Definition: PerfLogImp.cpp:313
ripple::perf::PerfLogImp::Counters::Jq::queuedDuration
microseconds queuedDuration
Definition: PerfLogImp.h:103
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::perf::Locked::Locked
Locked(Locked &&rhs)
Definition: PerfLogImp.h:61
ripple::perf::PerfLog::steady_time_point
std::chrono::time_point< steady_clock > steady_time_point
Definition: PerfLog.h:52
ripple::perf::PerfLogImp::stop_
bool stop_
Definition: PerfLogImp.h:135
ripple::perf::PerfLogImp::Counters::Rpc
RPC performance counters.
Definition: PerfLogImp.h:81
std
STL namespace.
ripple::perf::PerfLogImp::rpcEnd
void rpcEnd(std::string const &method, std::uint64_t const requestId, bool finish)
Definition: PerfLogImp.cpp:338
ripple::perf::PerfLogImp::rpcStart
void rpcStart(std::string const &method, std::uint64_t const requestId) override
Log start of RPC call.
Definition: PerfLogImp.cpp:319
ripple::perf::PerfLogImp::Counters::currentJson
Json::Value currentJson() const
Definition: PerfLogImp.cpp:171
condition_variable
ripple::perf::PerfLogImp::Counters
Track performance counters and currently executing tasks.
Definition: PerfLogImp.h:74
ripple::perf::PerfLogImp::run
void run()
Definition: PerfLogImp.cpp:254
ripple::perf::Locked::mutex
std::mutex mutex
Definition: PerfLogImp.h:49
mutex
ripple::JobType
JobType
Definition: Job.h:34
ripple::perf::Locked::Locked
Locked(Locked const &rhs)
Definition: PerfLogImp.h:58
ripple::perf::PerfLogImp::setup_
const Setup setup_
Definition: PerfLogImp.h:125
ripple::perf::PerfLogImp::rpcFinish
void rpcFinish(std::string const &method, std::uint64_t const requestId) override
Log successful finish of RPC call.
Definition: PerfLogImp.h:162
ripple::perf::PerfLogImp::stop
void stop() override
Definition: PerfLogImp.cpp:454
ripple::perf::PerfLogImp::Counters::Counters
Counters(std::vector< char const * > const &labels, JobTypes const &jobTypes)
Definition: PerfLogImp.cpp:43
ripple::perf::PerfLogImp::logFile_
std::ofstream logFile_
Definition: PerfLogImp.h:129
ripple::perf::PerfLogImp::counters_
Counters counters_
Definition: PerfLogImp.h:128
ripple::RPC::getHandlerNames
std::vector< char const * > getHandlerNames()
Return names of all methods.
Definition: Handler.cpp:244
ripple::perf::PerfLogImp::Counters::Rpc::duration
microseconds duration
Definition: PerfLogImp.h:89
ripple::perf::PerfLogImp::jobQueue
void jobQueue(JobType const type) override
Log queued job.
Definition: PerfLogImp.cpp:373
unordered_map
ripple::perf::PerfLogImp::start
void start() override
Definition: PerfLogImp.cpp:447
type_traits
ripple::perf::PerfLogImp::resizeJobs
void resizeJobs(int const resize) override
Ensure enough room to store each currently executing job.
Definition: PerfLogImp.cpp:428
ripple::perf::PerfLogImp::Counters::countersJson
Json::Value countersJson() const
Definition: PerfLogImp.cpp:76
ripple::perf::PerfLogImp::report
void report()
Definition: PerfLogImp.cpp:279
ripple::perf::PerfLogImp::rpcError
void rpcError(std::string const &method, std::uint64_t const requestId) override
Log errored RPC call.
Definition: PerfLogImp.h:168
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::perf::Locked::Locked
Locked()=default
string