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(std::set<char const*> const& labels, JobTypes const& jobTypes);
118  countersJson() const;
120  currentJson() const;
121  };
122 
123  Setup const setup_;
126  std::function<void()> const signalStop_;
133  std::string const hostname_{boost::asio::ip::host_name()};
134  bool stop_{false};
135  bool rotate_{false};
136 
137  void
138  openLog();
139  void
140  run();
141  void
142  report();
143  void
144  rpcEnd(
145  std::string const& method,
146  std::uint64_t const requestId,
147  bool finish);
148 
149 public:
150  PerfLogImp(
151  Setup const& setup,
152  Application& app,
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:57
ripple::Application
Definition: Application.h:116
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:132
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:222
ripple::RPC::getHandlerNames
std::set< char const * > getHandlerNames()
Return names of all methods.
Definition: Handler.cpp:313
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::PerfLogImp
PerfLogImp(Setup const &setup, Application &app, beast::Journal journal, std::function< void()> &&signalStop)
Definition: PerfLogImp.cpp:312
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:418
ripple::perf::PerfLogImp::j_
const beast::Journal j_
Definition: PerfLogImp.h:125
ripple::perf::PerfLogImp::rotate
void rotate() override
Rotate perf log file.
Definition: PerfLogImp.cpp:445
ripple::perf::PerfLogImp::cond_
std::condition_variable cond_
Definition: PerfLogImp.h:131
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:48
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:133
ripple::perf::PerfLog::Setup
Configuration from [perf] section of rippled.cfg.
Definition: PerfLog.h:62
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:395
ripple::perf::PerfLogImp::rotate_
bool rotate_
Definition: PerfLogImp.h:135
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:130
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::perf::PerfLogImp::Counters::Counters
Counters(std::set< char const * > const &labels, JobTypes const &jobTypes)
Definition: PerfLogImp.cpp:45
ripple::JobTypes::instance
static JobTypes const & instance()
Definition: JobTypes.h:125
cstdint
ripple::perf::Locked::value
T value
Definition: PerfLogImp.h:48
ripple::perf::PerfLogImp::thread_
std::thread thread_
Definition: PerfLogImp.h:129
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:126
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:322
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:53
ripple::perf::PerfLogImp::stop_
bool stop_
Definition: PerfLogImp.h:134
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:347
ripple::perf::PerfLog::system_time_point
std::chrono::time_point< system_clock > system_time_point
Definition: PerfLog.h:54
ripple::perf::PerfLogImp::rpcStart
void rpcStart(std::string const &method, std::uint64_t const requestId) override
Log start of RPC call.
Definition: PerfLogImp.cpp:328
ripple::perf::PerfLogImp::Counters::currentJson
Json::Value currentJson() const
Definition: PerfLogImp.cpp:173
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:256
ripple::perf::Locked::mutex
std::mutex mutex
Definition: PerfLogImp.h:49
mutex
ripple::JobType
JobType
Definition: Job.h:35
ripple::perf::Locked::Locked
Locked(Locked const &rhs)
Definition: PerfLogImp.h:58
ripple::perf::PerfLogImp::setup_
const Setup setup_
Definition: PerfLogImp.h:123
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:463
ripple::perf::PerfLogImp::app_
Application & app_
Definition: PerfLogImp.h:124
ripple::perf::PerfLogImp::logFile_
std::ofstream logFile_
Definition: PerfLogImp.h:128
ripple::perf::PerfLogImp::counters_
Counters counters_
Definition: PerfLogImp.h:127
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:382
unordered_map
ripple::perf::PerfLogImp::start
void start() override
Definition: PerfLogImp.cpp:456
type_traits
std::set
STL class.
ripple::perf::PerfLogImp::resizeJobs
void resizeJobs(int const resize) override
Ensure enough room to store each currently executing job.
Definition: PerfLogImp.cpp:437
ripple::perf::PerfLogImp::Counters::countersJson
Json::Value countersJson() const
Definition: PerfLogImp.cpp:78
ripple::perf::PerfLogImp::report
void report()
Definition: PerfLogImp.cpp:281
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