20#include <xrpld/core/JobTypes.h>
21#include <xrpld/perflog/detail/PerfLogImp.h>
23#include <xrpl/basics/BasicConfig.h>
24#include <xrpl/beast/core/CurrentThreadName.h>
25#include <xrpl/beast/utility/Journal.h>
26#include <xrpl/json/json_writer.h>
52 auto const inserted =
rpc_.emplace(label,
Rpc()).second;
58 "ripple::perf::PerfLogImp::Counters::Counters : failed to "
67 for (
auto const& [jobType, _] : jobTypes)
69 auto const inserted =
jq_.emplace(jobType,
Jq()).second;
75 "ripple::perf::PerfLogImp::Counters::Counters : failed to "
89 for (
auto const& proc : rpc_)
94 if (!proc.second.value.started && !proc.second.value.finished &&
95 !proc.second.value.errored)
99 value = proc.second.value;
111 rpcobj[proc.first] = p;
120 totalRpcJson[jss::duration_us] =
122 rpcobj[jss::total] = totalRpcJson;
128 for (
auto const& proc : jq_)
133 if (!proc.second.value.queued && !proc.second.value.started &&
134 !proc.second.value.finished)
138 value = proc.second.value;
148 j[jss::queued_duration_us] =
151 j[jss::running_duration_us] =
163 totalJqJson[jss::queued_duration_us] =
165 totalJqJson[jss::running_duration_us] =
167 jqobj[jss::total] = totalJqJson;
173 counters[jss::rpc] = rpcobj;
174 counters[jss::job_queue] = jqobj;
184 auto const jobs = [
this] {
189 for (
auto const& j : jobs)
196 std::chrono::duration_cast<microseconds>(present - j.second)
205 methods.
reserve(methods_.size());
206 for (
auto const& m : methods_)
209 for (
auto m : methods)
212 methodobj[jss::method] = m.first;
214 std::chrono::duration_cast<microseconds>(present - m.second)
216 methodsArray.
append(methodobj);
220 current[jss::jobs] = jobsArray;
221 current[jss::methods] = methodsArray;
237 if (!boost::filesystem::is_directory(logDir))
239 boost::system::error_code ec;
240 boost::filesystem::create_directories(logDir, ec);
243 JLOG(
j_.
fatal()) <<
"Unable to create performance log "
245 << logDir <<
": " << ec.message();
299 report[jss::time] =
to_string(std::chrono::floor<microseconds>(present));
337 UNREACHABLE(
"ripple::perf::PerfLogImp::rpcStart : valid method input");
344 ++counter->second.value.started;
361 UNREACHABLE(
"ripple::perf::PerfLogImp::rpcEnd : valid method input");
371 startTime = e->second.second;
378 "ripple::perf::PerfLogImp::rpcEnd : valid requestId input");
384 ++counter->second.value.finished;
386 ++counter->second.value.errored;
387 counter->second.value.duration += std::chrono::duration_cast<microseconds>(
399 "ripple::perf::PerfLogImp::jobQueue : valid job type input");
404 ++counter->second.value.queued;
419 "ripple::perf::PerfLogImp::jobStart : valid job type input");
426 ++counter->second.value.started;
427 counter->second.value.queuedDuration += dur;
442 "ripple::perf::PerfLogImp::jobFinish : valid job type input");
449 ++counter->second.value.finished;
450 counter->second.value.runningDuration += dur;
504 set(perfLog,
"perf_log", section);
507 setup.
perfLog = boost::filesystem::path(perfLog);
508 if (setup.
perfLog.is_relative())
511 boost::filesystem::absolute(setup.
perfLog, configDir);
529 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