@@ -435,6 +435,7 @@ bool ProcessRequest(
435
435
boost::beast::http::request<boost::beast::http::string_body>& request,
436
436
ApiUser::Ptr& authenticatedUser,
437
437
boost::beast::http::response<boost::beast::http::string_body>& response,
438
+ std::chrono::steady_clock::duration& cpuBoundWorkTime,
438
439
boost::asio::yield_context& yc
439
440
)
440
441
{
@@ -443,7 +444,10 @@ bool ProcessRequest(
443
444
auto stream (server.GetStream ());
444
445
445
446
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 ());
446
449
CpuBoundWork handlingRequest (yc);
450
+ cpuBoundWorkTime = std::chrono::steady_clock::now () - start;
447
451
448
452
HttpHandler::ProcessRequest (server, authenticatedUser, request, response, yc);
449
453
} catch (const std::exception& ex) {
@@ -534,9 +538,15 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc)
534
538
<< " , user: " << (authenticatedUser ? authenticatedUser->GetName () : " <unauthenticated>" )
535
539
<< " , agent: " << request[http::field::user_agent]; // operator[] - Returns the value for a field, or "" if it does not exist.
536
540
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." ;
540
550
});
541
551
542
552
if (!HandleAccessControl (*m_Stream, request, response, yc)) {
@@ -557,7 +567,7 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc)
557
567
558
568
m_Seen = std::numeric_limits<decltype (m_Seen)>::max ();
559
569
560
- if (!ProcessRequest (*this , request, authenticatedUser, response, yc)) {
570
+ if (!ProcessRequest (*this , request, authenticatedUser, response, cpuBoundWorkTime, yc)) {
561
571
break ;
562
572
}
563
573
0 commit comments