diff options
author | Carl Schwan <carl@carlschwan.eu> | 2022-01-20 01:30:34 +0300 |
---|---|---|
committer | Carl Schwan <carl@carlschwan.eu> | 2022-04-04 11:28:26 +0300 |
commit | 7d272c54d013538746d6731097ec37f360effb5d (patch) | |
tree | d754c4184926ea8011bd2b0fe276adebaf4082f6 /lib/public | |
parent | cf4c77e064fd52d891bc842d78431cceb2f34952 (diff) |
Add a built-in profiler inside Nextcloud
The webui is provided by a seperate application named profiler
Signed-off-by: Carl Schwan <carl@carlschwan.eu>
Diffstat (limited to 'lib/public')
-rw-r--r-- | lib/public/DataCollector/AbstractDataCollector.php | 87 | ||||
-rw-r--r-- | lib/public/DataCollector/IDataCollector.php | 55 | ||||
-rw-r--r-- | lib/public/ICache.php | 6 | ||||
-rw-r--r-- | lib/public/Profiler/IProfile.php | 168 | ||||
-rw-r--r-- | lib/public/Profiler/IProfiler.php | 101 |
5 files changed, 417 insertions, 0 deletions
diff --git a/lib/public/DataCollector/AbstractDataCollector.php b/lib/public/DataCollector/AbstractDataCollector.php new file mode 100644 index 00000000000..68298671b7b --- /dev/null +++ b/lib/public/DataCollector/AbstractDataCollector.php @@ -0,0 +1,87 @@ +<?php + +declare(strict_types=1); +/** + * @copyright 2022 Carl Schwan <carl@carlschwan.eu> + * + * @author Carl Schwan <carl@carlschwan.eu> + * @author Fabien Potencier <fabien@symfony.com> + * + * @license AGPL-3.0-or-later AND MIT + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\DataCollector; + +/** + * Children of this class must store the collected data in + * the data property. + * + * @author Fabien Potencier <fabien@symfony.com> + * @author Bernhard Schussek <bschussek@symfony.com> + * @author Carl Schwan <carl@carlschwan.eu> + * @since 24.0.0 + */ +abstract class AbstractDataCollector implements IDataCollector, \JsonSerializable { + /** @var array */ + protected $data = []; + + /** + * @since 24.0.0 + */ + public function getName(): string { + return static::class; + } + + /** + * Reset the state of the profiler. By default it only empties the + * $this->data contents, but you can override this method to do + * additional cleaning. + * @since 24.0.0 + */ + public function reset(): void { + $this->data = []; + } + + /** + * @since 24.0.0 + */ + public function __sleep(): array { + return ['data']; + } + + /** + * @internal to prevent implementing \Serializable + * @since 24.0.0 + */ + final protected function serialize() { + } + + /** + * @internal to prevent implementing \Serializable + * @since 24.0.0 + */ + final protected function unserialize(string $data) { + } + + /** + * @since 24.0.0 + */ + #[\ReturnTypeWillChange] + public function jsonSerialize() { + return $this->data; + } +} diff --git a/lib/public/DataCollector/IDataCollector.php b/lib/public/DataCollector/IDataCollector.php new file mode 100644 index 00000000000..0fb914727df --- /dev/null +++ b/lib/public/DataCollector/IDataCollector.php @@ -0,0 +1,55 @@ +<?php + +declare(strict_types=1); +/** + * @copyright 2022 Carl Schwan <carl@carlschwan.eu> + * + * @author Carl Schwan <carl@carlschwan.eu> + * @author Fabien Potencier <fabien@symfony.com> + * + * @license AGPL-3.0-or-later AND MIT + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\DataCollector; + +use OC\AppFramework\Http\Request; +use OCP\AppFramework\Http\Response; + +/** + * DataCollectorInterface. + * + * @since 24.0.0 + */ +interface IDataCollector { + /** + * Collects data for the given Request and Response. + * @since 24.0.0 + */ + public function collect(Request $request, Response $response, \Throwable $exception = null): void; + + /** + * Reset the state of the profiler. + * @since 24.0.0 + */ + public function reset(): void; + + /** + * Returns the name of the collector. + * @since 24.0.0 + */ + public function getName(): string; +} diff --git a/lib/public/ICache.php b/lib/public/ICache.php index 47b0e2f4c3d..0e818277f60 100644 --- a/lib/public/ICache.php +++ b/lib/public/ICache.php @@ -76,4 +76,10 @@ interface ICache { * @since 6.0.0 */ public function clear($prefix = ''); + + /** + * Check if the cache implementation is available + * @since 24.0.0 + */ + public static function isAvailable(): bool; } diff --git a/lib/public/Profiler/IProfile.php b/lib/public/Profiler/IProfile.php new file mode 100644 index 00000000000..1831496a5a7 --- /dev/null +++ b/lib/public/Profiler/IProfile.php @@ -0,0 +1,168 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright 2022 Carl Schwan <carl@carlschwan.eu> + * + * @author Carl Schwan <carl@carlschwan.eu> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Profiler; + +use OCP\DataCollector\IDataCollector; + +/** + * This interface store the results of the profiling of one + * request. You can get the saved profiles from the @see IProfiler. + * + * ```php + * <?php + * $profiler = \OC::$server->get(IProfiler::class); + * $profiles = $profiler->find('/settings/users', 10); + * ``` + * + * This interface is meant to be used directly and not extended. + * @since 24.0.0 + */ +interface IProfile { + /** + * Get the token of the profile + * @since 24.0.0 + */ + public function getToken(): string; + + /** + * Set the token of the profile + * @since 24.0.0 + */ + public function setToken(string $token): void; + + /** + * Get the time of the profile + * @since 24.0.0 + */ + public function getTime(): ?int; + + /** + * Set the time of the profile + * @since 24.0.0 + */ + public function setTime(int $time): void; + + /** + * Get the url of the profile + * @since 24.0.0 + */ + public function getUrl(): ?string; + + /** + * Set the url of the profile + * @since 24.0.0 + */ + public function setUrl(string $url): void; + + /** + * Get the method of the profile + * @since 24.0.0 + */ + public function getMethod(): ?string; + + /** + * Set the method of the profile + * @since 24.0.0 + */ + public function setMethod(string $method): void; + + /** + * Get the status code of the profile + * @since 24.0.0 + */ + public function getStatusCode(): ?int; + + /** + * Set the status code of the profile + * @since 24.0.0 + */ + public function setStatusCode(int $statusCode): void; + + /** + * Add a data collector to the profile + * @since 24.0.0 + */ + public function addCollector(IDataCollector $collector); + + /** + * Get the parent profile to this profile + * @since 24.0.0 + */ + public function getParent(): ?IProfile; + + /** + * Set the parent profile to this profile + * @since 24.0.0 + */ + public function setParent(?IProfile $parent): void; + + /** + * Get the parent token to this profile + * @since 24.0.0 + */ + public function getParentToken(): ?string; + + /** + * Get the profile's children + * @return IProfile[] + * @since 24.0.0 + **/ + public function getChildren(): array; + + /** + * Set the profile's children + * @param IProfile[] $children + * @since 24.0.0 + */ + public function setChildren(array $children): void; + + /** + * Add the child profile + * @since 24.0.0 + */ + public function addChild(IProfile $profile): void; + + /** + * Get all the data collectors + * @return IDataCollector[] + * @since 24.0.0 + */ + public function getCollectors(): array; + + /** + * Set all the data collectors + * @param IDataCollector[] $collectors + * @since 24.0.0 + */ + public function setCollectors(array $collectors): void; + + /** + * Get a data collector by name + * @since 24.0.0 + */ + public function getCollector(string $collectorName): ?IDataCollector; +} diff --git a/lib/public/Profiler/IProfiler.php b/lib/public/Profiler/IProfiler.php new file mode 100644 index 00000000000..78325089523 --- /dev/null +++ b/lib/public/Profiler/IProfiler.php @@ -0,0 +1,101 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright 2022 Carl Schwan <carl@carlschwan.eu> + * + * @author Carl Schwan <carl@carlschwan.eu> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Profiler; + +use OC\AppFramework\Http\Request; +use OCP\AppFramework\Http\Response; +use OCP\DataCollector\IDataCollector; + +/** + * This interface allows to interact with the built-in Nextcloud profiler. + * @since 24.0.0 + */ +interface IProfiler { + /** + * Add a new data collector to the profiler. This allows to later on + * collect all the data from every registered collector. + * + * @see IDataCollector + * @since 24.0.0 + */ + public function add(IDataCollector $dataCollector): void; + + /** + * Load a profile from a response object + * @since 24.0.0 + */ + public function loadProfileFromResponse(Response $response): ?IProfile; + + /** + * Load a profile from the response token + * @since 24.0.0 + */ + public function loadProfile(string $token): ?IProfile; + + /** + * Save a profile on the disk. This allows to later load it again in the + * profiler user interface. + * @since 24.0.0 + */ + public function saveProfile(IProfile $profile): bool; + + /** + * Find a profile from various search parameters + * @since 24.0.0 + */ + public function find(?string $url, ?int $limit, ?string $method, ?int $start, ?int $end, string $statusCode = null): array; + + /** + * Get the list of data providers by identifier + * @return string[] + * @since 24.0.0 + */ + public function dataProviders(): array; + + /** + * Check if the profiler is enabled. + * + * If it is not enabled, data provider shouldn't be created and + * shouldn't collect any data. + * @since 24.0.0 + */ + public function isEnabled(): bool; + + /** + * Set if the profiler is enabled. + * @see isEnabled + * @since 24.0.0 + */ + public function setEnabled(bool $enabled): void; + + /** + * Collect all the information from the current request and construct + * a IProfile from it. + * @since 24.0.0 + */ + public function collect(Request $request, Response $response): IProfile; +} |