From d0b19cf7958c8bf036e9767fefbff1d5936073d7 Mon Sep 17 00:00:00 2001 From: Rodrigo Date: Fri, 26 Jun 2026 08:41:15 -0400 Subject: [PATCH] feat(FOUR-32024): review and fix the calculation of DB timing when loaded by octane --- .../Middleware/ServerTimingMiddleware.php | 2 ++ .../Providers/ProcessMakerServiceProvider.php | 8 +++++++ tests/Feature/ServerTimingMiddlewareTest.php | 24 +++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php b/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php index 96ade2bded..2a15e84a6d 100644 --- a/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php +++ b/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php @@ -28,6 +28,8 @@ public function handle(Request $request, Closure $next): Response return $next($request); } + ProcessMakerServiceProvider::beginRequestTiming(); + // Start time for controller execution $startController = microtime(true); diff --git a/ProcessMaker/Providers/ProcessMakerServiceProvider.php b/ProcessMaker/Providers/ProcessMakerServiceProvider.php index c19ded9d5f..72c71c2a46 100644 --- a/ProcessMaker/Providers/ProcessMakerServiceProvider.php +++ b/ProcessMaker/Providers/ProcessMakerServiceProvider.php @@ -508,6 +508,14 @@ public static function getBootTime(): ?float return self::$bootTime; } + /** + * Reset per-request query timing metrics. + */ + public static function beginRequestTiming(): void + { + self::$queryTime = 0; + } + /** * Get the query time for the request. * diff --git a/tests/Feature/ServerTimingMiddlewareTest.php b/tests/Feature/ServerTimingMiddlewareTest.php index b9449ebfed..040401d227 100644 --- a/tests/Feature/ServerTimingMiddlewareTest.php +++ b/tests/Feature/ServerTimingMiddlewareTest.php @@ -6,6 +6,8 @@ use Illuminate\Support\Facades\Route; use ProcessMaker\Http\Middleware\ServerTimingMiddleware; use ProcessMaker\Models\User; +use ProcessMaker\Providers\ProcessMakerServiceProvider; +use ReflectionClass; use Tests\Feature\Shared\RequestHelper; use Tests\TestCase; @@ -41,6 +43,28 @@ public function testServerTimingHeaderIncludesAllMetrics() $this->assertStringContainsString('db;dur=', $serverTiming[2]); } + public function testBeginRequestTimingClearsAccumulatedQueryTime() + { + $reflection = new ReflectionClass(ProcessMakerServiceProvider::class); + $property = $reflection->getProperty('queryTime'); + $property->setAccessible(true); + $property->setValue(null, 500); + + Route::middleware(ServerTimingMiddleware::class)->get('/timing-reset-test', function () { + DB::select('SELECT 1'); + + return response()->json(['message' => 'Timing reset test']); + }); + + $response = $this->get('/timing-reset-test'); + $serverTiming = $this->getHeader($response, 'server-timing'); + + preg_match('/db;dur=([\d.]+)/', implode(',', $serverTiming), $matches); + $dbTime = (float) ($matches[1] ?? 500); + + $this->assertLessThan(500, $dbTime); + } + public function testQueryTimeIsMeasured() { // Mock a route with a query