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