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));