1#include <xrpld/core/JobTypes.h>
2#include <xrpld/perflog/detail/PerfLogImp.h>
4#include <xrpl/basics/BasicConfig.h>
5#include <xrpl/beast/core/CurrentThreadName.h>
6#include <xrpl/beast/utility/Journal.h>
7#include <xrpl/json/json_writer.h>
33 auto const inserted =
rpc_.emplace(label,
Rpc()).second;
39 "ripple::perf::PerfLogImp::Counters::Counters : failed to "
48 for (
auto const& [jobType, _] : jobTypes)
50 auto const inserted =
jq_.emplace(jobType,
Jq()).second;
56 "ripple::perf::PerfLogImp::Counters::Counters : failed to "
70 for (
auto const& proc : rpc_)
75 if (!proc.second.value.started && !proc.second.value.finished &&
76 !proc.second.value.errored)
80 value = proc.second.value;
92 rpcobj[proc.first] = p;
101 totalRpcJson[jss::duration_us] =
103 rpcobj[jss::total] = totalRpcJson;
109 for (
auto const& proc : jq_)
114 if (!proc.second.value.queued && !proc.second.value.started &&
115 !proc.second.value.finished)
119 value = proc.second.value;
129 j[jss::queued_duration_us] =
132 j[jss::running_duration_us] =
144 totalJqJson[jss::queued_duration_us] =
146 totalJqJson[jss::running_duration_us] =
148 jqobj[jss::total] = totalJqJson;
154 counters[jss::rpc] = rpcobj;
155 counters[jss::job_queue] = jqobj;
165 auto const jobs = [
this] {
170 for (
auto const& j : jobs)
177 std::chrono::duration_cast<microseconds>(present - j.second)
186 methods.
reserve(methods_.size());
187 for (
auto const& m : methods_)
190 for (
auto m : methods)
193 methodobj[jss::method] = m.first;
195 std::chrono::duration_cast<microseconds>(present - m.second)
197 methodsArray.
append(methodobj);
201 current[jss::jobs] = jobsArray;
202 current[jss::methods] = methodsArray;
218 if (!boost::filesystem::is_directory(logDir))
220 boost::system::error_code ec;
221 boost::filesystem::create_directories(logDir, ec);
224 JLOG(
j_.
fatal()) <<
"Unable to create performance log "
226 << logDir <<
": " << ec.message();
280 report[jss::time] =
to_string(std::chrono::floor<microseconds>(present));
318 UNREACHABLE(
"ripple::perf::PerfLogImp::rpcStart : valid method input");
325 ++counter->second.value.started;
342 UNREACHABLE(
"ripple::perf::PerfLogImp::rpcEnd : valid method input");
352 startTime = e->second.second;
359 "ripple::perf::PerfLogImp::rpcEnd : valid requestId input");
365 ++counter->second.value.finished;
367 ++counter->second.value.errored;
368 counter->second.value.duration += std::chrono::duration_cast<microseconds>(
380 "ripple::perf::PerfLogImp::jobQueue : valid job type input");
385 ++counter->second.value.queued;
400 "ripple::perf::PerfLogImp::jobStart : valid job type input");
407 ++counter->second.value.started;
408 counter->second.value.queuedDuration += dur;
423 "ripple::perf::PerfLogImp::jobFinish : valid job type input");
430 ++counter->second.value.finished;
431 counter->second.value.runningDuration += dur;
485 set(perfLog,
"perf_log", section);
488 setup.
perfLog = boost::filesystem::path(perfLog);
489 if (setup.
perfLog.is_relative())
492 boost::filesystem::absolute(setup.
perfLog, configDir);
510 setup, app, journal, std::move(signalStop));
Decorator for streaming out compact json.
Value & append(Value const &value)
Append value to array at the end.
A generic endpoint for log messages.
virtual NodeStore::Database & getNodeStore()=0
virtual NetworkOPs & getOPs()=0
static std::string const & name(JobType jt)
Map::size_type size() const
virtual void stateAccounting(Json::Value &obj)=0
void getCountsJson(Json::Value &obj)
Holds a collection of configuration values.
std::string const hostname_
void rpcEnd(std::string const &method, std::uint64_t const requestId, bool finish)
void resizeJobs(int const resize) override
Ensure enough room to store each currently executing job.
std::function< void()> const signalStop_
void jobQueue(JobType const type) override
Log queued job.
void jobStart(JobType const type, microseconds dur, steady_time_point startTime, int instance) override
Log job executing.
void rpcStart(std::string const &method, std::uint64_t const requestId) override
Log start of RPC call.
void rotate() override
Rotate perf log file.
std::condition_variable cond_
PerfLogImp(Setup const &setup, Application &app, beast::Journal journal, std::function< void()> &&signalStop)
void jobFinish(JobType const type, microseconds dur, int instance) override
Log job finishing.
system_time_point lastLog_
std::chrono::time_point< steady_clock > steady_time_point
@ arrayValue
array value (ordered list)
@ objectValue
object value (collection of name/value pairs).
void setCurrentThreadName(std::string_view newThreadName)
Changes the name of the caller thread.
PerfLog::Setup setup_PerfLog(Section const §ion, boost::filesystem::path const &configDir)
std::unique_ptr< PerfLog > make_PerfLog(PerfLog::Setup const &setup, Application &app, beast::Journal journal, std::function< void()> &&signalStop)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
bool set(T &target, std::string const &name, Section const §ion)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
bool get_if_exists(Section const §ion, std::string const &name, T &v)
@ current
This was a new validation and was added.
std::string to_string(base_uint< Bits, Tag > const &a)
Job Queue task performance counters.
microseconds runningDuration
microseconds queuedDuration
RPC performance counters.
Json::Value currentJson() const
std::unordered_map< std::string, Locked< Rpc > > rpc_
std::vector< std::pair< JobType, steady_time_point > > jobs_
std::unordered_map< std::uint64_t, MethodStart > methods_
Counters(std::set< char const * > const &labels, JobTypes const &jobTypes)
Json::Value countersJson() const
std::unordered_map< JobType, Locked< Jq > > jq_
Configuration from [perf] section of rippled.cfg.
boost::filesystem::path perfLog