diff options
author | Joas Schilling <coding@schilljs.com> | 2024-06-20 12:37:02 +0200 |
---|---|---|
committer | Joas Schilling <coding@schilljs.com> | 2024-06-21 11:41:22 +0200 |
commit | 3aeb78539988299567835003a0d4cb7df630654d (patch) | |
tree | 795ea81854dd6294eb7eefef63c18c00c43ac383 /lib/private/CapabilitiesManager.php | |
parent | 425e2d0172625443e32b7e7178fc0bca0579d24a (diff) | |
download | nextcloud-server-3aeb78539988299567835003a0d4cb7df630654d.tar.gz nextcloud-server-3aeb78539988299567835003a0d4cb7df630654d.zip |
perf(capabilities): Log capabilities providers that are slow
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'lib/private/CapabilitiesManager.php')
-rw-r--r-- | lib/private/CapabilitiesManager.php | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/private/CapabilitiesManager.php b/lib/private/CapabilitiesManager.php index bb84ebb65e8..d7bf25f078a 100644 --- a/lib/private/CapabilitiesManager.php +++ b/lib/private/CapabilitiesManager.php @@ -15,6 +15,12 @@ use OCP\Capabilities\IPublicCapability; use Psr\Log\LoggerInterface; class CapabilitiesManager { + /** + * Anything above 0.1s to load the capabilities of an app qualifies for bad code + * and should be cached within the app. + */ + public const ACCEPTABLE_LOADING_TIME = 0.1; + /** @var \Closure[] */ private $capabilities = []; @@ -51,7 +57,27 @@ class CapabilitiesManager { // that we would otherwise inject to every page load continue; } + $startTime = microtime(true); $capabilities = array_replace_recursive($capabilities, $c->getCapabilities()); + $endTime = microtime(true); + $timeSpent = $endTime - $startTime; + if ($timeSpent > self::ACCEPTABLE_LOADING_TIME) { + $logLevel = match (true) { + $timeSpent > self::ACCEPTABLE_LOADING_TIME * 16 => \OCP\ILogger::FATAL, + $timeSpent > self::ACCEPTABLE_LOADING_TIME * 8 => \OCP\ILogger::ERROR, + $timeSpent > self::ACCEPTABLE_LOADING_TIME * 4 => \OCP\ILogger::WARN, + $timeSpent > self::ACCEPTABLE_LOADING_TIME * 2 => \OCP\ILogger::INFO, + default => \OCP\ILogger::DEBUG, + }; + $this->logger->log( + $logLevel, + 'Capabilities of {className} took {duration} seconds to generate.', + [ + 'className' => get_class($c), + 'duration' => round($timeSpent, 2), + ] + ); + } } } else { throw new \InvalidArgumentException('The given Capability (' . get_class($c) . ') does not implement the ICapability interface'); |