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

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)]);
$a->getProfiler()->saveLog(API_LOG_PREFIX . 'performance');
$a->getProfiler()->saveLog($a->getLogger(), API_LOG_PREFIX . 'performance');
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\Configuration;
use Friendica\Database\DBA;
use Friendica\Factory\ConfigFactory;
use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Util\Profiler;
use Psr\Log\LoggerInterface;
@ -114,6 +113,11 @@ class App
*/
private $config;
/**
* @var LoggerInterface The logger
*/
private $logger;
/**
* @var Profiler The profiler of this app
*/
@ -139,6 +143,16 @@ class App
return $this->basePath;
}
/**
* The Logger of this app
*
* @return LoggerInterface
*/
public function getLogger()
{
return $this->logger;
}
/**
* The profiler of this app
*
@ -192,7 +206,7 @@ class App
* @brief App constructor.
*
* @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 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)
{
$this->config = $config;
$this->logger = $logger;
$this->config = $config;
$this->profiler = $profiler;
$this->basePath = $this->config->get('system', 'basepath');

View File

@ -4,18 +4,20 @@ namespace Friendica\Factory;
use Friendica\Core\Config\Cache;
use Friendica\Database;
use Friendica\Util\Profiler;
class DBFactory
{
/**
* 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
*
* @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()) {
return;
@ -46,7 +48,7 @@ class DBFactory
$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
Database\DBStructure::definition($configCache->get('system', 'basepath'), false);
}

View File

@ -25,12 +25,13 @@ class DependencyFactory
$basedir = BasePath::create($directory, $_SERVER);
$configLoader = new Cache\ConfigCacheLoader($basedir);
$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);
// needed to call PConfig::init()
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) {
$loglevel = self::mapLegacyConfigDebugLevel((string)$level);
static::addStreamHandler($logger, $stream, $loglevel);
} else {
static::addVoidHandler($logger);
}
Logger::init($logger);
@ -153,4 +155,11 @@ class LoggerFactory
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;
use Friendica\Core\Config\ConfigCache;
use Friendica\Core\Config\Cache\IConfigCache;
use Friendica\Util\Profiler;
use Psr\Log\LoggerInterface;
class ProfilerFactory
{
/**
* Creates a Profiler for the current execution
*
* @param LoggerInterface $logger The logger for saving the profiling data
* @param ConfigCache $configCache The configuration cache
* @param IConfigCache $configCache The configuration cache
*
* @return Profiler
*/
public static function create(LoggerInterface $logger, ConfigCache $configCache)
public static function create(IConfigCache $configCache)
{
$enabled = $configCache->get('system', 'profiler', false);
$renderTime = $configCache->get('rendertime', 'callstack', false);
return new Profiler($logger, $enabled, $renderTime);
$enabled = $configCache->get('system', 'profiler');
$enabled = isset($enabled) && $enabled !== '!<unset>!';
$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;
/**
* @var LoggerInterface The profiler logger
*/
private $logger;
/**
* @param LoggerInterface $logger The profiler logger
* @param bool $enabled True, if the Profiler is enabled
* @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->rendertime = $renderTime;
$this->logger = $logger;
$this->reset();
}
@ -129,16 +122,17 @@ class Profiler implements ContainerInterface
/**
* 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
if (!$this->enabled) {
return;
}
$duration = microtime(true) - $this->get('start');
$this->logger->info(
$logger->info(
$message,
[
'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__) . '/../');
$configLoader = new Cache\ConfigCacheLoader($basedir);
$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);
Factory\ConfigFactory::createPConfig($configCache);
$logger = Factory\LoggerFactory::create('test', $config);
$profiler = Factory\ProfilerFactory::create($logger, $config);
$this->app = new App($config, $logger, $profiler, false);
$this->logOutput = FActory\LoggerFactory::enableTest($this->app->getLogger());
parent::setUp();

View File

@ -16,13 +16,12 @@ class DBATest extends DatabaseTest
$basedir = BasePath::create(dirname(__DIR__) . '/../../');
$configLoader = new Cache\ConfigCacheLoader($basedir);
$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);
$pconfig = Factory\ConfigFactory::createPConfig($configCache);
Factory\ConfigFactory::createPConfig($configCache);
$logger = Factory\LoggerFactory::create('test', $config);
$profiler = Factory\ProfilerFactory::create($logger, $config);
$this->app = new App($config, $logger, $profiler, false);
$this->logOutput = FActory\LoggerFactory::enableTest($this->app->getLogger());
parent::setUp();

View File

@ -16,13 +16,12 @@ class DBStructureTest extends DatabaseTest
$basedir = BasePath::create(dirname(__DIR__) . '/../../');
$configLoader = new Cache\ConfigCacheLoader($basedir);
$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);
$pconfig = Factory\ConfigFactory::createPConfig($configCache);
Factory\ConfigFactory::createPConfig($configCache);
$logger = Factory\LoggerFactory::create('test', $config);
$profiler = Factory\ProfilerFactory::create($logger, $config);
$this->app = new App($config, $logger, $profiler, false);
$this->logOutput = FActory\LoggerFactory::enableTest($this->app->getLogger());
parent::setUp();
}

View File

@ -26,7 +26,7 @@ class ProfilerTest extends MockedTest
*/
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)
{
$profiler = new Profiler($this->logger, true, true);
$profiler = new Profiler(true, true);
foreach ($functions as $function) {
$profiler->saveTimestamp($timestamp, $name, $function);
@ -111,7 +111,7 @@ class ProfilerTest extends MockedTest
*/
public function testReset($timestamp, $name, array $functions)
{
$profiler = new Profiler($this->logger, true, true);
$profiler = new Profiler(true, true);
$profiler->saveTimestamp($timestamp, $name);
$profiler->reset();
@ -168,7 +168,7 @@ class ProfilerTest extends MockedTest
->shouldReceive('info')
->once();
$profiler = new Profiler($this->logger, true, true);
$profiler = new Profiler(true, true);
foreach ($data as $perf => $items) {
foreach ($items['functions'] as $function) {
@ -176,6 +176,6 @@ class ProfilerTest extends MockedTest
}
}
$profiler->saveLog('test');
$profiler->saveLog($this->logger, 'test');
}
}