Skip to content

Commit 93484ed

Browse files
committed
HttpServerConnection: Log noticable CPU semaphore wait time
1 parent 7998983 commit 93484ed

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

lib/remote/httpserverconnection.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ bool ProcessRequest(
435435
boost::beast::http::request<boost::beast::http::string_body>& request,
436436
ApiUser::Ptr& authenticatedUser,
437437
boost::beast::http::response<boost::beast::http::string_body>& response,
438+
std::chrono::steady_clock::duration& cpuBoundWorkTime,
438439
boost::asio::yield_context& yc
439440
)
440441
{
@@ -443,7 +444,10 @@ bool ProcessRequest(
443444
auto stream (server.GetStream());
444445

445446
try {
447+
// Cache the elapsed time to acquire a CPU semaphore used to detect extremely heavy workloads.
448+
auto start (std::chrono::steady_clock::now());
446449
CpuBoundWork handlingRequest (yc);
450+
cpuBoundWorkTime = std::chrono::steady_clock::now() - start;
447451

448452
HttpHandler::ProcessRequest(server, authenticatedUser, request, response, yc);
449453
} catch (const std::exception& ex) {
@@ -534,9 +538,15 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc)
534538
<< ", user: " << (authenticatedUser ? authenticatedUser->GetName() : "<unauthenticated>")
535539
<< ", agent: " << request[http::field::user_agent]; //operator[] - Returns the value for a field, or "" if it does not exist.
536540

537-
Defer addRespCode ([&response, start, &logMsg]() {
538-
logMsg << ", status: " << response.result() << ") took "
539-
<< ch::duration_cast<ch::milliseconds>(ch::steady_clock::now() - start).count() << "ms.";
541+
ch::steady_clock::duration cpuBoundWorkTime(0);
542+
Defer addRespCode ([&response, start, &logMsg, &cpuBoundWorkTime]() {
543+
logMsg << ", status: " << response.result() << ")";
544+
545+
if (ch::duration_cast<ch::seconds>(cpuBoundWorkTime).count()) {
546+
logMsg << " waited '" << ch::duration_cast<ch::milliseconds>(cpuBoundWorkTime).count() << "ms' on semaphore and";
547+
}
548+
549+
logMsg << " took total " << ch::duration_cast<ch::milliseconds>(ch::steady_clock::now() - start).count() << "ms.";
540550
});
541551

542552
if (!HandleAccessControl(*m_Stream, request, response, yc)) {
@@ -557,7 +567,7 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc)
557567

558568
m_Seen = std::numeric_limits<decltype(m_Seen)>::max();
559569

560-
if (!ProcessRequest(*this, request, authenticatedUser, response, yc)) {
570+
if (!ProcessRequest(*this, request, authenticatedUser, response, cpuBoundWorkTime, yc)) {
561571
break;
562572
}
563573

0 commit comments

Comments
 (0)