mirror of
https://github.com/friendica/friendica
synced 2024-12-23 03:20:15 +00:00
Refactored DependencyFactory for Profiler
This commit is contained in:
parent
cdcf1667d7
commit
5e5c39b0e1
12 changed files with 65 additions and 47 deletions
|
@ -144,7 +144,7 @@ if (!$foreground) {
|
||||||
file_put_contents($pidfile, $pid);
|
file_put_contents($pidfile, $pid);
|
||||||
|
|
||||||
// We lose the database connection upon forking
|
// We lose the database connection upon forking
|
||||||
Factory\DBFactory::init($configCache, $_SERVER);
|
Factory\DBFactory::init($a->getConfigCache(), $a->getProfiler(), $_SERVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
Config::set('system', 'worker_daemon_mode', true);
|
Config::set('system', 'worker_daemon_mode', true);
|
||||||
|
|
|
@ -326,7 +326,7 @@ function api_call(App $a)
|
||||||
|
|
||||||
Logger::info(API_LOG_PREFIX . 'username {username}', ['module' => 'api', 'action' => 'call', 'username' => $a->user['username'], 'duration' => round($duration, 2)]);
|
Logger::info(API_LOG_PREFIX . 'username {username}', ['module' => 'api', 'action' => 'call', 'username' => $a->user['username'], 'duration' => round($duration, 2)]);
|
||||||
|
|
||||||
$a->getProfiler()->saveLog(API_LOG_PREFIX . 'performance');
|
$a->getProfiler()->saveLog($a->getLogger(), API_LOG_PREFIX . 'performance');
|
||||||
|
|
||||||
if (false === $return) {
|
if (false === $return) {
|
||||||
/*
|
/*
|
||||||
|
|
20
src/App.php
20
src/App.php
|
@ -12,7 +12,6 @@ use Friendica\Core\Config\Cache\ConfigCacheLoader;
|
||||||
use Friendica\Core\Config\Cache\IConfigCache;
|
use Friendica\Core\Config\Cache\IConfigCache;
|
||||||
use Friendica\Core\Config\Configuration;
|
use Friendica\Core\Config\Configuration;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Factory\ConfigFactory;
|
|
||||||
use Friendica\Network\HTTPException\InternalServerErrorException;
|
use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||||
use Friendica\Util\Profiler;
|
use Friendica\Util\Profiler;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
@ -114,6 +113,11 @@ class App
|
||||||
*/
|
*/
|
||||||
private $config;
|
private $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var LoggerInterface The logger
|
||||||
|
*/
|
||||||
|
private $logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Profiler The profiler of this app
|
* @var Profiler The profiler of this app
|
||||||
*/
|
*/
|
||||||
|
@ -139,6 +143,16 @@ class App
|
||||||
return $this->basePath;
|
return $this->basePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Logger of this app
|
||||||
|
*
|
||||||
|
* @return LoggerInterface
|
||||||
|
*/
|
||||||
|
public function getLogger()
|
||||||
|
{
|
||||||
|
return $this->logger;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The profiler of this app
|
* The profiler of this app
|
||||||
*
|
*
|
||||||
|
@ -192,7 +206,7 @@ class App
|
||||||
* @brief App constructor.
|
* @brief App constructor.
|
||||||
*
|
*
|
||||||
* @param Configuration $config The Configuration
|
* @param Configuration $config The Configuration
|
||||||
* @param LoggerInterface $logger Logger of this application
|
* @param LoggerInterface $logger The current app logger
|
||||||
* @param Profiler $profiler The profiler of this application
|
* @param Profiler $profiler The profiler of this application
|
||||||
* @param bool $isBackend Whether it is used for backend or frontend (Default true=backend)
|
* @param bool $isBackend Whether it is used for backend or frontend (Default true=backend)
|
||||||
*
|
*
|
||||||
|
@ -200,8 +214,8 @@ class App
|
||||||
*/
|
*/
|
||||||
public function __construct(Configuration $config, LoggerInterface $logger, Profiler $profiler, $isBackend = true)
|
public function __construct(Configuration $config, LoggerInterface $logger, Profiler $profiler, $isBackend = true)
|
||||||
{
|
{
|
||||||
$this->config = $config;
|
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
|
$this->config = $config;
|
||||||
$this->profiler = $profiler;
|
$this->profiler = $profiler;
|
||||||
$this->basePath = $this->config->get('system', 'basepath');
|
$this->basePath = $this->config->get('system', 'basepath');
|
||||||
|
|
||||||
|
|
|
@ -4,18 +4,20 @@ namespace Friendica\Factory;
|
||||||
|
|
||||||
use Friendica\Core\Config\Cache;
|
use Friendica\Core\Config\Cache;
|
||||||
use Friendica\Database;
|
use Friendica\Database;
|
||||||
|
use Friendica\Util\Profiler;
|
||||||
|
|
||||||
class DBFactory
|
class DBFactory
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Initialize the DBA connection
|
* Initialize the DBA connection
|
||||||
*
|
*
|
||||||
* @param Cache\ConfigCache $configCache The configuration cache
|
* @param Cache\IConfigCache $configCache The configuration cache
|
||||||
|
* @param Profiler $profiler The profiler
|
||||||
* @param array $server The $_SERVER variables
|
* @param array $server The $_SERVER variables
|
||||||
*
|
*
|
||||||
* @throws \Exception if connection went bad
|
* @throws \Exception if connection went bad
|
||||||
*/
|
*/
|
||||||
public static function init(Cache\ConfigCache $configCache, array $server)
|
public static function init(Cache\IConfigCache $configCache, Profiler $profiler, array $server)
|
||||||
{
|
{
|
||||||
if (Database\DBA::connected()) {
|
if (Database\DBA::connected()) {
|
||||||
return;
|
return;
|
||||||
|
@ -46,7 +48,7 @@ class DBFactory
|
||||||
$db_data = $server['MYSQL_DATABASE'];
|
$db_data = $server['MYSQL_DATABASE'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Database\DBA::connect($configCache, $db_host, $db_user, $db_pass, $db_data, $charset)) {
|
if (Database\DBA::connect($configCache, $profiler, $db_host, $db_user, $db_pass, $db_data, $charset)) {
|
||||||
// Loads DB_UPDATE_VERSION constant
|
// Loads DB_UPDATE_VERSION constant
|
||||||
Database\DBStructure::definition($configCache->get('system', 'basepath'), false);
|
Database\DBStructure::definition($configCache->get('system', 'basepath'), false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,12 +25,13 @@ class DependencyFactory
|
||||||
$basedir = BasePath::create($directory, $_SERVER);
|
$basedir = BasePath::create($directory, $_SERVER);
|
||||||
$configLoader = new Cache\ConfigCacheLoader($basedir);
|
$configLoader = new Cache\ConfigCacheLoader($basedir);
|
||||||
$configCache = Factory\ConfigFactory::createCache($configLoader);
|
$configCache = Factory\ConfigFactory::createCache($configLoader);
|
||||||
Factory\DBFactory::init($configCache, $_SERVER);
|
$profiler = Factory\ProfilerFactory::create($configCache);
|
||||||
|
Factory\DBFactory::init($configCache, $profiler, $_SERVER);
|
||||||
$config = Factory\ConfigFactory::createConfig($configCache);
|
$config = Factory\ConfigFactory::createConfig($configCache);
|
||||||
// needed to call PConfig::init()
|
// needed to call PConfig::init()
|
||||||
Factory\ConfigFactory::createPConfig($configCache);
|
Factory\ConfigFactory::createPConfig($configCache);
|
||||||
Factory\LoggerFactory::create($channel, $config);
|
$logger = Factory\LoggerFactory::create($channel, $config);
|
||||||
|
|
||||||
return new App($config, $isBackend);
|
return new App($config, $logger, $profiler, $isBackend);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,8 @@ class LoggerFactory
|
||||||
if ($debugging) {
|
if ($debugging) {
|
||||||
$loglevel = self::mapLegacyConfigDebugLevel((string)$level);
|
$loglevel = self::mapLegacyConfigDebugLevel((string)$level);
|
||||||
static::addStreamHandler($logger, $stream, $loglevel);
|
static::addStreamHandler($logger, $stream, $loglevel);
|
||||||
|
} else {
|
||||||
|
static::addVoidHandler($logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger::init($logger);
|
Logger::init($logger);
|
||||||
|
@ -153,4 +155,11 @@ class LoggerFactory
|
||||||
throw new InternalServerErrorException('Logger instance incompatible for MonologFactory');
|
throw new InternalServerErrorException('Logger instance incompatible for MonologFactory');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function addVoidHandler($logger)
|
||||||
|
{
|
||||||
|
if ($logger instanceof Monolog\Logger) {
|
||||||
|
$logger->pushHandler(new Monolog\Handler\NullHandler());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,24 +2,25 @@
|
||||||
|
|
||||||
namespace Friendica\Factory;
|
namespace Friendica\Factory;
|
||||||
|
|
||||||
use Friendica\Core\Config\ConfigCache;
|
use Friendica\Core\Config\Cache\IConfigCache;
|
||||||
use Friendica\Util\Profiler;
|
use Friendica\Util\Profiler;
|
||||||
use Psr\Log\LoggerInterface;
|
|
||||||
|
|
||||||
class ProfilerFactory
|
class ProfilerFactory
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Creates a Profiler for the current execution
|
* Creates a Profiler for the current execution
|
||||||
*
|
*
|
||||||
* @param LoggerInterface $logger The logger for saving the profiling data
|
* @param IConfigCache $configCache The configuration cache
|
||||||
* @param ConfigCache $configCache The configuration cache
|
|
||||||
*
|
*
|
||||||
* @return Profiler
|
* @return Profiler
|
||||||
*/
|
*/
|
||||||
public static function create(LoggerInterface $logger, ConfigCache $configCache)
|
public static function create(IConfigCache $configCache)
|
||||||
{
|
{
|
||||||
$enabled = $configCache->get('system', 'profiler', false);
|
$enabled = $configCache->get('system', 'profiler');
|
||||||
$renderTime = $configCache->get('rendertime', 'callstack', false);
|
$enabled = isset($enabled) && $enabled !== '!<unset>!';
|
||||||
return new Profiler($logger, $enabled, $renderTime);
|
$renderTime = $configCache->get('rendertime', 'callstack');
|
||||||
|
$renderTime = isset($renderTime) && $renderTime !== '!<unset>!';
|
||||||
|
|
||||||
|
return new Profiler($enabled, $renderTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,20 +33,13 @@ class Profiler implements ContainerInterface
|
||||||
private $rendertime;
|
private $rendertime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var LoggerInterface The profiler logger
|
|
||||||
*/
|
|
||||||
private $logger;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param LoggerInterface $logger The profiler logger
|
|
||||||
* @param bool $enabled True, if the Profiler is enabled
|
* @param bool $enabled True, if the Profiler is enabled
|
||||||
* @param bool $renderTime True, if the Profiler should measure the whole rendertime including functions
|
* @param bool $renderTime True, if the Profiler should measure the whole rendertime including functions
|
||||||
*/
|
*/
|
||||||
public function __construct(LoggerInterface $logger, $enabled = false, $renderTime = false)
|
public function __construct($enabled = false, $renderTime = false)
|
||||||
{
|
{
|
||||||
$this->enabled = $enabled;
|
$this->enabled = $enabled;
|
||||||
$this->rendertime = $renderTime;
|
$this->rendertime = $renderTime;
|
||||||
$this->logger = $logger;
|
|
||||||
$this->reset();
|
$this->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,16 +122,17 @@ class Profiler implements ContainerInterface
|
||||||
/**
|
/**
|
||||||
* Save the current profiling data to a log entry
|
* Save the current profiling data to a log entry
|
||||||
*
|
*
|
||||||
|
* @param LoggerInterface $logger The logger to save the current log
|
||||||
* @param string $message Additional message for the log
|
* @param string $message Additional message for the log
|
||||||
*/
|
*/
|
||||||
public function saveLog($message = '')
|
public function saveLog(LoggerInterface $logger, $message = '')
|
||||||
{
|
{
|
||||||
// Write down the performance values into the log
|
// Write down the performance values into the log
|
||||||
if (!$this->enabled) {
|
if (!$this->enabled) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$duration = microtime(true) - $this->get('start');
|
$duration = microtime(true) - $this->get('start');
|
||||||
$this->logger->info(
|
$logger->info(
|
||||||
$message,
|
$message,
|
||||||
[
|
[
|
||||||
'action' => 'profiling',
|
'action' => 'profiling',
|
||||||
|
@ -205,7 +199,7 @@ class Profiler implements ContainerInterface
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->logger->info($message . ": " . $o, ['action' => 'profiling']);
|
$logger->info($message . ": " . $o, ['action' => 'profiling']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -39,13 +39,12 @@ class ApiTest extends DatabaseTest
|
||||||
$basedir = BasePath::create(dirname(__DIR__) . '/../');
|
$basedir = BasePath::create(dirname(__DIR__) . '/../');
|
||||||
$configLoader = new Cache\ConfigCacheLoader($basedir);
|
$configLoader = new Cache\ConfigCacheLoader($basedir);
|
||||||
$configCache = Factory\ConfigFactory::createCache($configLoader);
|
$configCache = Factory\ConfigFactory::createCache($configLoader);
|
||||||
Factory\DBFactory::init($configCache, $_SERVER);
|
$profiler = Factory\ProfilerFactory::create($configCache);
|
||||||
|
Factory\DBFactory::init($configCache, $profiler, $_SERVER);
|
||||||
$config = Factory\ConfigFactory::createConfig($configCache);
|
$config = Factory\ConfigFactory::createConfig($configCache);
|
||||||
Factory\ConfigFactory::createPConfig($configCache);
|
Factory\ConfigFactory::createPConfig($configCache);
|
||||||
$logger = Factory\LoggerFactory::create('test', $config);
|
$logger = Factory\LoggerFactory::create('test', $config);
|
||||||
$profiler = Factory\ProfilerFactory::create($logger, $config);
|
|
||||||
$this->app = new App($config, $logger, $profiler, false);
|
$this->app = new App($config, $logger, $profiler, false);
|
||||||
$this->logOutput = FActory\LoggerFactory::enableTest($this->app->getLogger());
|
|
||||||
|
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
|
||||||
|
|
|
@ -16,13 +16,12 @@ class DBATest extends DatabaseTest
|
||||||
$basedir = BasePath::create(dirname(__DIR__) . '/../../');
|
$basedir = BasePath::create(dirname(__DIR__) . '/../../');
|
||||||
$configLoader = new Cache\ConfigCacheLoader($basedir);
|
$configLoader = new Cache\ConfigCacheLoader($basedir);
|
||||||
$configCache = Factory\ConfigFactory::createCache($configLoader);
|
$configCache = Factory\ConfigFactory::createCache($configLoader);
|
||||||
Factory\DBFactory::init($configCache, $_SERVER);
|
$profiler = Factory\ProfilerFactory::create($configCache);
|
||||||
|
Factory\DBFactory::init($configCache, $profiler, $_SERVER);
|
||||||
$config = Factory\ConfigFactory::createConfig($configCache);
|
$config = Factory\ConfigFactory::createConfig($configCache);
|
||||||
$pconfig = Factory\ConfigFactory::createPConfig($configCache);
|
Factory\ConfigFactory::createPConfig($configCache);
|
||||||
$logger = Factory\LoggerFactory::create('test', $config);
|
$logger = Factory\LoggerFactory::create('test', $config);
|
||||||
$profiler = Factory\ProfilerFactory::create($logger, $config);
|
|
||||||
$this->app = new App($config, $logger, $profiler, false);
|
$this->app = new App($config, $logger, $profiler, false);
|
||||||
$this->logOutput = FActory\LoggerFactory::enableTest($this->app->getLogger());
|
|
||||||
|
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
|
||||||
|
|
|
@ -16,13 +16,12 @@ class DBStructureTest extends DatabaseTest
|
||||||
$basedir = BasePath::create(dirname(__DIR__) . '/../../');
|
$basedir = BasePath::create(dirname(__DIR__) . '/../../');
|
||||||
$configLoader = new Cache\ConfigCacheLoader($basedir);
|
$configLoader = new Cache\ConfigCacheLoader($basedir);
|
||||||
$configCache = Factory\ConfigFactory::createCache($configLoader);
|
$configCache = Factory\ConfigFactory::createCache($configLoader);
|
||||||
Factory\DBFactory::init($configCache, $_SERVER);
|
$profiler = Factory\ProfilerFactory::create($configCache);
|
||||||
|
Factory\DBFactory::init($configCache, $profiler, $_SERVER);
|
||||||
$config = Factory\ConfigFactory::createConfig($configCache);
|
$config = Factory\ConfigFactory::createConfig($configCache);
|
||||||
$pconfig = Factory\ConfigFactory::createPConfig($configCache);
|
Factory\ConfigFactory::createPConfig($configCache);
|
||||||
$logger = Factory\LoggerFactory::create('test', $config);
|
$logger = Factory\LoggerFactory::create('test', $config);
|
||||||
$profiler = Factory\ProfilerFactory::create($logger, $config);
|
|
||||||
$this->app = new App($config, $logger, $profiler, false);
|
$this->app = new App($config, $logger, $profiler, false);
|
||||||
$this->logOutput = FActory\LoggerFactory::enableTest($this->app->getLogger());
|
|
||||||
|
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ class ProfilerTest extends MockedTest
|
||||||
*/
|
*/
|
||||||
public function testSetUp()
|
public function testSetUp()
|
||||||
{
|
{
|
||||||
$profiler = new Profiler($this->logger, true, true);
|
$profiler = new Profiler(true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -96,7 +96,7 @@ class ProfilerTest extends MockedTest
|
||||||
*/
|
*/
|
||||||
public function testSaveTimestamp($timestamp, $name, array $functions)
|
public function testSaveTimestamp($timestamp, $name, array $functions)
|
||||||
{
|
{
|
||||||
$profiler = new Profiler($this->logger, true, true);
|
$profiler = new Profiler(true, true);
|
||||||
|
|
||||||
foreach ($functions as $function) {
|
foreach ($functions as $function) {
|
||||||
$profiler->saveTimestamp($timestamp, $name, $function);
|
$profiler->saveTimestamp($timestamp, $name, $function);
|
||||||
|
@ -111,7 +111,7 @@ class ProfilerTest extends MockedTest
|
||||||
*/
|
*/
|
||||||
public function testReset($timestamp, $name, array $functions)
|
public function testReset($timestamp, $name, array $functions)
|
||||||
{
|
{
|
||||||
$profiler = new Profiler($this->logger, true, true);
|
$profiler = new Profiler(true, true);
|
||||||
|
|
||||||
$profiler->saveTimestamp($timestamp, $name);
|
$profiler->saveTimestamp($timestamp, $name);
|
||||||
$profiler->reset();
|
$profiler->reset();
|
||||||
|
@ -168,7 +168,7 @@ class ProfilerTest extends MockedTest
|
||||||
->shouldReceive('info')
|
->shouldReceive('info')
|
||||||
->once();
|
->once();
|
||||||
|
|
||||||
$profiler = new Profiler($this->logger, true, true);
|
$profiler = new Profiler(true, true);
|
||||||
|
|
||||||
foreach ($data as $perf => $items) {
|
foreach ($data as $perf => $items) {
|
||||||
foreach ($items['functions'] as $function) {
|
foreach ($items['functions'] as $function) {
|
||||||
|
@ -176,6 +176,6 @@ class ProfilerTest extends MockedTest
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$profiler->saveLog('test');
|
$profiler->saveLog($this->logger, 'test');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue