20 #include <ripple/basics/BasicConfig.h>
21 #include <ripple/basics/impl/PerfLogImp.h>
22 #include <ripple/beast/core/CurrentThreadName.h>
23 #include <ripple/beast/utility/Journal.h>
24 #include <ripple/core/JobTypes.h>
25 #include <ripple/json/json_writer.h>
26 #include <ripple/json/to_string.h>
27 #include <ripple/nodestore/DatabaseShard.h>
53 auto const inserted =
rpc_.emplace(label,
Rpc()).second;
64 for (
auto const& [jobType, _] : jobTypes)
66 auto const inserted =
jq_.emplace(jobType,
Jq()).second;
82 for (
auto const& proc : rpc_)
87 if (!proc.second.value.started && !proc.second.value.finished &&
88 !proc.second.value.errored)
92 value = proc.second.value;
104 rpcobj[proc.first] = p;
113 totalRpcJson[jss::duration_us] =
115 rpcobj[jss::total] = totalRpcJson;
121 for (
auto const& proc : jq_)
126 if (!proc.second.value.queued && !proc.second.value.started &&
127 !proc.second.value.finished)
131 value = proc.second.value;
141 j[jss::queued_duration_us] =
144 j[jss::running_duration_us] =
156 totalJqJson[jss::queued_duration_us] =
158 totalJqJson[jss::running_duration_us] =
160 jqobj[jss::total] = totalJqJson;
166 counters[jss::rpc] = rpcobj;
167 counters[jss::job_queue] = jqobj;
177 auto const jobs = [
this] {
182 for (
auto const& j : jobs)
189 std::chrono::duration_cast<microseconds>(present - j.second)
198 methods.
reserve(methods_.size());
199 for (
auto const& m : methods_)
202 for (
auto m : methods)
205 methodobj[jss::method] = m.first;
207 std::chrono::duration_cast<microseconds>(present - m.second)
209 methodsArray.
append(methodobj);
213 current[jss::jobs] = jobsArray;
214 current[jss::methods] = methodsArray;
230 if (!boost::filesystem::is_directory(logDir))
232 boost::system::error_code ec;
233 boost::filesystem::create_directories(logDir, ec);
236 JLOG(
j_.
fatal()) <<
"Unable to create performance log "
238 << logDir <<
": " << ec.message();
292 report[jss::time] =
to_string(std::chrono::floor<microseconds>(present));
338 ++counter->second.value.started;
363 startTime = e->second.second;
373 ++counter->second.value.finished;
375 ++counter->second.value.errored;
376 counter->second.value.duration += std::chrono::duration_cast<microseconds>(
390 ++counter->second.value.queued;
408 ++counter->second.value.started;
409 counter->second.value.queuedDuration += dur;
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);
506 return std::make_unique<PerfLogImp>(
507 setup, app, journal, std::move(signalStop));