From bc87d9a27250c4a2face5b06ed1db45d76413bf6 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Fri, 13 Dec 2024 10:47:18 -0400 Subject: [PATCH 1/2] feat: improve server timing headers --- .../Middleware/ServerTimingMiddleware.php | 5 +++- .../Providers/ProcessMakerServiceProvider.php | 4 ---- .../Traits/PluginServiceProviderTrait.php | 24 ++++++++++++++----- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php b/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php index 1c687d4f5d..50a9bf6a66 100644 --- a/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php +++ b/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php @@ -41,7 +41,10 @@ public function handle(Request $request, Closure $next): Response foreach ($packageTimes as $package => $timing) { $time = ($timing['end'] - $timing['start']) * 1000; - $serverTiming[] = "{$package};dur={$time}"; + // Only include packages that took more than 5ms + if ($time > 5) { + $serverTiming[] = "{$package};dur={$time}"; + } } // Add Server-Timing headers diff --git a/ProcessMaker/Providers/ProcessMakerServiceProvider.php b/ProcessMaker/Providers/ProcessMakerServiceProvider.php index 9bb9442cf2..75be7f5747 100644 --- a/ProcessMaker/Providers/ProcessMakerServiceProvider.php +++ b/ProcessMaker/Providers/ProcessMakerServiceProvider.php @@ -407,8 +407,6 @@ public static function getQueryTime(): float */ public static function setPackageBootStart(string $package, $time): void { - $package = ucfirst(\Str::camel(str_replace(['ProcessMaker\Packages\\', '\\'], '', $package))); - self::$packageBootTiming[$package] = [ 'start' => $time, 'end' => null, @@ -422,8 +420,6 @@ public static function setPackageBootStart(string $package, $time): void */ public static function setPackageBootedTime(string $package, $time): void { - $package = ucfirst(\Str::camel(str_replace(['ProcessMaker\Packages\\', '\\'], '', $package))); - self::$packageBootTiming[$package]['end'] = $time; } diff --git a/ProcessMaker/Traits/PluginServiceProviderTrait.php b/ProcessMaker/Traits/PluginServiceProviderTrait.php index 028409f4a4..8c4e141b0b 100644 --- a/ProcessMaker/Traits/PluginServiceProviderTrait.php +++ b/ProcessMaker/Traits/PluginServiceProviderTrait.php @@ -30,24 +30,36 @@ public function __construct($app) { parent::__construct($app); - $this->booting(function () { - self::$bootStart = microtime(true); + $package = $this->getPackageName(); - $package = defined('static::name') ? static::name : $this::class; + $this->booting(function () use ($package) { + self::$bootStart = microtime(true); ProcessMakerServiceProvider::setPackageBootStart($package, self::$bootStart); }); - $this->booted(function () { + $this->booted(function () use ($package) { self::$bootTime = microtime(true); - $package = defined('static::name') ? static::name : $this::class; - ProcessMakerServiceProvider::setPackageBootedTime($package, self::$bootTime); }); } + /** + * Get the package name for the Server Timing header + * + * @return string + */ + protected function getPackageName() + { + if (defined('static::name')) { + return ucfirst(\Str::camel(static::name)); + } + + return substr(static::class, strrpos(static::class, '\\') + 1); + } + /** * Boot the PM plug-in. */ From f6fc5ba88d119c7d6226e421fc80bcdadb067832 Mon Sep 17 00:00:00 2001 From: Miguel Angel Date: Fri, 13 Dec 2024 13:16:06 -0400 Subject: [PATCH 2/2] fix(cr): add missing validations --- .../Http/Middleware/ServerTimingMiddleware.php | 12 +++++++++--- .../Providers/ProcessMakerServiceProvider.php | 17 ++++++++++++++++- .../Traits/PluginServiceProviderTrait.php | 2 +- config/app.php | 6 +++++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php b/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php index 50a9bf6a66..b90ce654f4 100644 --- a/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php +++ b/ProcessMaker/Http/Middleware/ServerTimingMiddleware.php @@ -4,12 +4,18 @@ use Closure; use Illuminate\Http\Request; -use Illuminate\Support\Facades\DB; use ProcessMaker\Providers\ProcessMakerServiceProvider; use Symfony\Component\HttpFoundation\Response; class ServerTimingMiddleware { + // Minimum time in ms to include a package in the Server-Timing header + private static $minPackageTime; + + public function __construct() + { + self::$minPackageTime = config('app.server_timing.min_package_time'); + } /** * Handle an incoming request. * @@ -41,8 +47,8 @@ public function handle(Request $request, Closure $next): Response foreach ($packageTimes as $package => $timing) { $time = ($timing['end'] - $timing['start']) * 1000; - // Only include packages that took more than 5ms - if ($time > 5) { + // Only include packages that took more than MIN_PACKAGE_TIME ms + if ($time > self::$minPackageTime) { $serverTiming[] = "{$package};dur={$time}"; } } diff --git a/ProcessMaker/Providers/ProcessMakerServiceProvider.php b/ProcessMaker/Providers/ProcessMakerServiceProvider.php index 75be7f5747..38bde2a4e2 100644 --- a/ProcessMaker/Providers/ProcessMakerServiceProvider.php +++ b/ProcessMaker/Providers/ProcessMakerServiceProvider.php @@ -11,6 +11,7 @@ use Illuminate\Notifications\Events\NotificationSent; use Illuminate\Support\Facades; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\URL; use Laravel\Dusk\DuskServiceProvider; use Laravel\Horizon\Horizon; @@ -403,10 +404,17 @@ public static function getQueryTime(): float /** * Set the boot time for service providers. * + * @param string $package * @param float $time */ - public static function setPackageBootStart(string $package, $time): void + public static function setPackageBootStart(string $package, float $time): void { + if ($time < 0) { + Log::info("Server Timing: Invalid boot time for package: {$package}, time: {$time}"); + + $time = 0; + } + self::$packageBootTiming[$package] = [ 'start' => $time, 'end' => null, @@ -416,10 +424,17 @@ public static function setPackageBootStart(string $package, $time): void /** * Set the boot time for service providers. * + * * @param float $time */ public static function setPackageBootedTime(string $package, $time): void { + if (!isset(self::$packageBootTiming[$package]) || $time < 0) { + Log::info("Server Timing: Invalid booted time for package: {$package}, time: {$time}"); + + return; + } + self::$packageBootTiming[$package]['end'] = $time; } diff --git a/ProcessMaker/Traits/PluginServiceProviderTrait.php b/ProcessMaker/Traits/PluginServiceProviderTrait.php index 8c4e141b0b..16436d319d 100644 --- a/ProcessMaker/Traits/PluginServiceProviderTrait.php +++ b/ProcessMaker/Traits/PluginServiceProviderTrait.php @@ -51,7 +51,7 @@ public function __construct($app) * * @return string */ - protected function getPackageName() + protected function getPackageName(): string { if (defined('static::name')) { return ucfirst(\Str::camel(static::name)); diff --git a/config/app.php b/config/app.php index a011248e48..ca6b69e43f 100644 --- a/config/app.php +++ b/config/app.php @@ -246,7 +246,7 @@ // Process Request security log rate limit: 1 per day (86400 seconds) 'process_request_errors_rate_limit' => env('PROCESS_REQUEST_ERRORS_RATE_LIMIT', 1), 'process_request_errors_rate_limit_duration' => env('PROCESS_REQUEST_ERRORS_RATE_LIMIT_DURATION', 86400), - + 'default_colors' => [ 'primary' => '#2773F3', 'secondary' => '#728092', @@ -266,4 +266,8 @@ 'vault_token' => env('ENCRYPTED_DATA_VAULT_TOKEN', ''), 'vault_transit_key' => env('ENCRYPTED_DATA_VAULT_TRANSIT_KEY', ''), ], + + 'server_timing' => [ + 'min_package_time' => env('SERVER_TIMING_MIN_PACKAGE_TIME', 5), // Minimum time in milliseconds + ], ];