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_;
128  std::function<void()> const signalStop_;
135  std::string const hostname_{boost::asio::ip::host_name()};
136  bool stop_{false};
137  bool rotate_{false};
138 
139  void
140  openLog();
141  void
142  run();
143  void
144  report();
145  void
146  rpcEnd(
147  std::string const& method,
148  std::uint64_t const requestId,
149  bool finish);
150 
151 public:
152  PerfLogImp(
153  Setup const& setup,
154  Application& app,
155  beast::Journal journal,
156  std::function<void()>&& signalStop);
157 
158  ~PerfLogImp() override;
159 
160  void
161  rpcStart(std::string const& method, std::uint64_t const requestId) override;
162 
163  void
164  rpcFinish(std::string const& method, std::uint64_t const requestId) override
165  {
166  rpcEnd(method, requestId, true);
167  }
168 
169  void
170  rpcError(std::string const& method, std::uint64_t const requestId) override
171  {
172  rpcEnd(method, requestId, false);
173  }
174 
175  void
176  jobQueue(JobType const type) override;
177  void
178  jobStart(
179  JobType const type,
180  microseconds dur,
181  steady_time_point startTime,
182  int instance) override;
183  void
184  jobFinish(JobType const type, microseconds dur, int instance) override;
185 
187  countersJson() const override
188  {
189  return counters_.countersJson();
190  }
191 
193  currentJson() const override
194  {
195  return counters_.currentJson();
196  }
197 
198  void
199  resizeJobs(int const resize) override;
200  void
201  rotate() override;
202 
203  void
204  start() override;
205 
206  void
207  stop() override;
208 };
209 
210 } // namespace perf
211 } // namespace ripple
212 
213 #endif // RIPPLE_BASICS_PERFLOGIMP_H
ripple::perf::PerfLog::microseconds
std::chrono::microseconds microseconds
Definition: PerfLog.h:57
ripple::Application
Definition: Application.h:115
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:134
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::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:187
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:127
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:133
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:135
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:137
ripple::perf::PerfLogImp::currentJson
Json::Value currentJson() const override
Render currently executing jobs and RPC calls and durations in Json.
Definition: PerfLogImp.h:193
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:132
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:125
cstdint
ripple::perf::Locked::value
T value
Definition: PerfLogImp.h:48
ripple::perf::PerfLogImp::thread_
std::thread thread_
Definition: PerfLogImp.h:131
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:128
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:136
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: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:164
ripple::perf::PerfLogImp::stop
void stop() override
Definition: PerfLogImp.cpp:463
ripple::perf::PerfLogImp::app_
Application & app_
Definition: PerfLogImp.h:126
ripple::perf::PerfLogImp::Counters::Counters
Counters(std::vector< char const * > const &labels, JobTypes const &jobTypes)
Definition: PerfLogImp.cpp:45
ripple::perf::PerfLogImp::logFile_
std::ofstream logFile_
Definition: PerfLogImp.h:130
ripple::perf::PerfLogImp::counters_
Counters counters_
Definition: PerfLogImp.h:129
ripple::RPC::getHandlerNames
std::vector< char const * > getHandlerNames()
Return names of all methods.
Definition: Handler.cpp:249
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
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:170
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::perf::Locked::Locked
Locked()=default
string