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>
52 auto const inserted =
rpc_.emplace(label,
Rpc()).second;
63 for (
auto const& [jobType, _] : jobTypes)
65 auto const inserted =
jq_.emplace(jobType,
Jq()).second;
81 for (
auto const& proc : rpc_)
86 if (!proc.second.value.started && !proc.second.value.finished &&
87 !proc.second.value.errored)
91 value = proc.second.value;
103 rpcobj[proc.first] = p;
112 totalRpcJson[jss::duration_us] =
114 rpcobj[jss::total] = totalRpcJson;
120 for (
auto const& proc : jq_)
125 if (!proc.second.value.queued && !proc.second.value.started &&
126 !proc.second.value.finished)
130 value = proc.second.value;
140 j[jss::queued_duration_us] =
143 j[jss::running_duration_us] =
155 totalJqJson[jss::queued_duration_us] =
157 totalJqJson[jss::running_duration_us] =
159 jqobj[jss::total] = totalJqJson;
165 counters[jss::rpc] = rpcobj;
166 counters[jss::job_queue] = jqobj;
176 auto const jobs = [
this] {
181 for (
auto const& j : jobs)
188 std::chrono::duration_cast<microseconds>(present - j.second)
197 methods.
reserve(methods_.size());
198 for (
auto const& m : methods_)
201 for (
auto m : methods)
204 methodobj[jss::method] = m.first;
206 std::chrono::duration_cast<microseconds>(present - m.second)
208 methodsArray.
append(methodobj);
212 current[jss::jobs] = jobsArray;
213 current[jss::methods] = methodsArray;
229 if (!boost::filesystem::is_directory(logDir))
231 boost::system::error_code ec;
232 boost::filesystem::create_directories(logDir, ec);
235 JLOG(
j_.
fatal()) <<
"Unable to create performance log "
237 << logDir <<
": " << ec.message();
291 report[jss::time] =
to_string(std::chrono::floor<microseconds>(present));
330 ++counter->second.value.started;
355 startTime = e->second.second;
365 ++counter->second.value.finished;
367 ++counter->second.value.errored;
368 counter->second.value.duration += std::chrono::duration_cast<microseconds>(
382 ++counter->second.value.queued;
400 ++counter->second.value.started;
401 counter->second.value.queuedDuration += dur;
419 ++counter->second.value.finished;
420 counter->second.value.runningDuration += dur;
474 set(perfLog,
"perf_log", section);
477 setup.
perfLog = boost::filesystem::path(perfLog);
478 if (setup.
perfLog.is_relative())
481 boost::filesystem::absolute(setup.
perfLog, configDir);
497 return std::make_unique<PerfLogImp>(setup, journal, std::move(signalStop));