20 #include <ripple/perflog/impl/PerfLogImp.h> 
   22 #include <ripple/basics/BasicConfig.h> 
   23 #include <ripple/beast/core/CurrentThreadName.h> 
   24 #include <ripple/beast/utility/Journal.h> 
   25 #include <ripple/core/JobTypes.h> 
   26 #include <ripple/json/json_writer.h> 
   27 #include <ripple/json/to_string.h> 
   28 #include <ripple/nodestore/DatabaseShard.h> 
   54             auto const inserted = 
rpc_.emplace(label, 
Rpc()).second;
 
   65         for (
auto const& [jobType, _] : jobTypes)
 
   67             auto const inserted = 
jq_.emplace(jobType, 
Jq()).second;
 
   83     for (
auto const& proc : rpc_)
 
   88             if (!proc.second.value.started && !proc.second.value.finished &&
 
   89                 !proc.second.value.errored)
 
   93             value = proc.second.value;
 
  105         rpcobj[proc.first] = p;
 
  114         totalRpcJson[jss::duration_us] =
 
  116         rpcobj[jss::total] = totalRpcJson;
 
  122     for (
auto const& proc : jq_)
 
  127             if (!proc.second.value.queued && !proc.second.value.started &&
 
  128                 !proc.second.value.finished)
 
  132             value = proc.second.value;
 
  142         j[jss::queued_duration_us] =
 
  145         j[jss::running_duration_us] =
 
  157         totalJqJson[jss::queued_duration_us] =
 
  159         totalJqJson[jss::running_duration_us] =
 
  161         jqobj[jss::total] = totalJqJson;
 
  167     counters[jss::rpc] = rpcobj;
 
  168     counters[jss::job_queue] = jqobj;
 
  178     auto const jobs = [
this] {
 
  183     for (
auto const& j : jobs)
 
  190             std::chrono::duration_cast<microseconds>(present - j.second)
 
  199         methods.
reserve(methods_.size());
 
  200         for (
auto const& m : methods_)
 
  203     for (
auto m : methods)
 
  206         methodobj[jss::method] = m.first;
 
  208             std::chrono::duration_cast<microseconds>(present - m.second)
 
  210         methodsArray.
append(methodobj);
 
  214     current[jss::jobs] = jobsArray;
 
  215     current[jss::methods] = methodsArray;
 
  231     if (!boost::filesystem::is_directory(logDir))
 
  233         boost::system::error_code ec;
 
  234         boost::filesystem::create_directories(logDir, ec);
 
  237             JLOG(
j_.
fatal()) << 
"Unable to create performance log " 
  239                              << logDir << 
": " << ec.message();
 
  293     report[jss::time] = 
to_string(std::chrono::floor<microseconds>(present));
 
  339         ++counter->second.value.started;
 
  364             startTime = e->second.second;
 
  374         ++counter->second.value.finished;
 
  376         ++counter->second.value.errored;
 
  377     counter->second.value.duration += std::chrono::duration_cast<microseconds>(
 
  391     ++counter->second.value.queued;
 
  409         ++counter->second.value.started;
 
  410         counter->second.value.queuedDuration += dur;
 
  428         ++counter->second.value.finished;
 
  429         counter->second.value.runningDuration += dur;
 
  483     set(perfLog, 
"perf_log", section);
 
  486         setup.
perfLog = boost::filesystem::path(perfLog);
 
  487         if (setup.
perfLog.is_relative())
 
  490                 boost::filesystem::absolute(setup.
perfLog, configDir);
 
  507     return std::make_unique<PerfLogImp>(
 
  508         setup, app, journal, std::move(signalStop));