1#include <xrpld/perflog/detail/PerfLogImp.h>
3#include <xrpl/basics/BasicConfig.h>
4#include <xrpl/beast/core/CurrentThreadName.h>
5#include <xrpl/beast/utility/Journal.h>
6#include <xrpl/core/JobTypes.h>
7#include <xrpl/json/json_writer.h>
33 auto const inserted =
rpc_.emplace(label,
Rpc()).second;
39 "xrpl::perf::PerfLogImp::Counters::Counters : failed to "
48 for (
auto const& [jobType, _] : jobTypes)
50 auto const inserted =
jq_.emplace(jobType,
Jq()).second;
56 "xrpl::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 jobQueueObj[jss::total] = totalJqJson;
154 counters[jss::rpc] = rpcobj;
155 counters[jss::job_queue] = jobQueueObj;
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(
"xrpl::perf::PerfLogImp::rpcStart : valid method input");
325 ++counter->second.value.started;
342 UNREACHABLE(
"xrpl::perf::PerfLogImp::rpcEnd : valid method input");
352 startTime = e->second.second;
359 "xrpl::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>(
379 UNREACHABLE(
"xrpl::perf::PerfLogImp::jobQueue : valid job type input");
384 ++counter->second.value.queued;
398 UNREACHABLE(
"xrpl::perf::PerfLogImp::jobStart : valid job type input");
405 ++counter->second.value.started;
406 counter->second.value.queuedDuration += dur;
420 UNREACHABLE(
"xrpl::perf::PerfLogImp::jobFinish : valid job type input");
427 ++counter->second.value.finished;
428 counter->second.value.runningDuration += dur;
482 set(perfLog,
"perf_log", section);
485 setup.
perfLog = boost::filesystem::path(perfLog);
486 if (setup.
perfLog.is_relative())
489 boost::filesystem::absolute(setup.
perfLog, configDir);
507 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
Map::size_type size() const
static std::string const & name(JobType jt)
virtual void stateAccounting(Json::Value &obj)=0
void getCountsJson(Json::Value &obj)
Holds a collection of configuration values.
std::condition_variable cond_
void jobFinish(JobType const type, microseconds dur, int instance) override
Log job finishing.
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_
void rpcEnd(std::string const &method, std::uint64_t const requestId, bool finish)
void rotate() override
Rotate perf log file.
std::function< void()> const signalStop_
PerfLogImp(Setup const &setup, Application &app, beast::Journal journal, std::function< void()> &&signalStop)
void jobStart(JobType const type, microseconds dur, steady_time_point startTime, int instance) override
Log job executing.
std::string const hostname_
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.
std::unique_ptr< PerfLog > make_PerfLog(PerfLog::Setup const &setup, Application &app, beast::Journal journal, std::function< void()> &&signalStop)
PerfLog::Setup setup_PerfLog(Section const §ion, boost::filesystem::path const &configDir)
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,...
std::string to_string(base_uint< Bits, Tag > const &a)
@ current
This was a new validation and was added.
bool get_if_exists(Section const §ion, std::string const &name, T &v)
Job Queue task performance counters.
microseconds queuedDuration
microseconds runningDuration
RPC performance counters.
std::unordered_map< JobType, Locked< Jq > > jq_
std::vector< std::pair< JobType, steady_time_point > > jobs_
Json::Value currentJson() const
std::unordered_map< std::uint64_t, MethodStart > methods_
std::unordered_map< std::string, Locked< Rpc > > rpc_
Json::Value countersJson() const
Counters(std::set< char const * > const &labels, JobTypes const &jobTypes)
Configuration from [perf] section of xrpld.cfg.
boost::filesystem::path perfLog