Refactored DependencyFactory for Profiler

This commit is contained in:
Philipp Holzer 2019-02-17 21:12:12 +01:00
parent cdcf1667d7
commit 5e5c39b0e1
No known key found for this signature in database
GPG key ID: 517BE60E2CE5C8A5
12 changed files with 65 additions and 47 deletions

View file

@ -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);

View file

@ -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) {
/* /*

View file

@ -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');

View file

@ -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);
} }

View file

@ -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);
} }
} }

View file

@ -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());
}
}
} }

View file

@ -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);
} }
} }

View file

@ -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 string $message Additional message for the log * @param LoggerInterface $logger The logger to save the current 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']);
} }
/** /**

View file

@ -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();

View file

@ -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();

View file

@ -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();
} }

View file

@ -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');
} }
} }