8000 BAP-14658: LoggerDataCollector called over 500k times in dev mode (#1… · oroinc/platform@915723a · GitHub
[go: up one dir, main page]

Skip to content

Commit 915723a

Browse files
vtsykunMykhailo Sulyma
authored andcommitted
BAP-14658: LoggerDataCollector called over 500k times in dev mode (#11598)
- added local cache for a logger collector - overwrite symfony`s data_collector.logger class - added tests
1 parent 9e75789 commit 915723a

File tree

5 files changed

+123
-0
lines changed

5 files changed

+123
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace Oro\Bundle\LoggerBundle\DataCollector;
4+
5+
use Symfony\Component\HttpKernel\DataCollector\LoggerDataCollector as BaseDataCollector;
6+
7+
class LoggerDataCollector extends BaseDataCollector
8+
{
9+
/**
10+
* {@inheritdoc}
11+
*/
12+
public function lateCollect()
13+
{
14+
// On event kernel.terminate ProfilerListener save profile for each sub-request and calls method lateCollect,
15+
// but sets of logs for each sub-request and master-requests are same,
16+
// so here added local caching to prevent work on the same data and fix performance in dev mode
17+
static $localCache;
18+
19+
if ($localCache === null) {
20+
parent::lateCollect();
21+
$localCache = $this->data;
22+
} else {
23+
$this->data = $localCache;
24+
}
25+
}
26+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Oro\Bundle\LoggerBundle\DependencyInjection\Compiler;
4+
5+
use Oro\Bundle\LoggerBundle\DataCollector\LoggerDataCollector;
6+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
7+
use Symfony\Component\DependencyInjection\ContainerBuilder;
8+
9+
class LoggerCollectorPass implements CompilerPassInterface
10+
{
11+
/**
12+
* {@inheritdoc}
13+
*/
14+
public function process(ContainerBuilder $container)
15+
{
16+
if ($container->hasDefinition('data_collector.logger')) {
17+
$definition = $container->getDefinition('data_collector.logger');
18+
$definition->setClass(LoggerDataCollector::class);
19+
}
20+
}
21+
}

src/Oro/Bundle/LoggerBundle/OroLoggerBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Oro\Bundle\LoggerBundle;
44

5+
use Oro\Bundle\LoggerBundle\DependencyInjection\Compiler\LoggerCollectorPass;
56
use Symfony\Component\DependencyInjection\ContainerBuilder;
67
use Symfony\Component\HttpKernel\Bundle\Bundle;
78

@@ -19,5 +20,6 @@ public function build(ContainerBuilder $container)
1920

2021
$container->addCompilerPass(new DetailedLogsHandlerPass());
2122
$container->addCompilerPass(new SwiftMailerHandlerPass());
23+
$container->addCompilerPass(new LoggerCollectorPass());
2224
}
2325
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Oro\Bundle\LoggerBundle\Tests\Unit\DataCollector;
4+
5+
use Oro\Bundle\LoggerBundle\DataCollector\LoggerDataCollector;
6+
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
7+
8+
class LoggerDataCollectorTest extends \PHPUnit_Framework_TestCase
9+
{
10+
public function testLateCollect()
11+
{
12+
$logger = $this->createMock(DebugLoggerInterface::class);
13+
$logger->expects($this->once())
14+
->method('countErrors');
15+
$logger->expects($this->any())
16+
->method('getLogs')
17+
->willReturn([]);
18+
19+
$collector = new LoggerDataCollector($logger);
20+
$collector->lateCollect();
21+
$collector->lateCollect();
22+
}
23+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace Oro\Bundle\LoggerBundle\Tests\Unit\DependencyInjection\Compiler;
4+
5+
use Oro\Bundle\LoggerBundle\DependencyInjection\Compiler\LoggerCollectorPass;
6+
use Symfony\Component\DependencyInjection\ContainerBuilder;
7+
use Symfony\Component\DependencyInjection\Definition;
8+
9+
class LoggerCollectorPassTest extends \PHPUnit_Framework_TestCase
10+
{
11+
/**
12+
* @var LoggerCollectorPass
13+
*/
14+
protected $compilerPass;
15+
16+
/**
17+
* {@inheritdoc}
18+
*/
19+
protected function setUp()
20+
{
21+
$this->compilerPass = new LoggerCollectorPass();
22+
}
23+
24+
public function testProcessWhenServiceNotExist()
25+
{
26+
/** @var \PHPUnit_Framework_MockObject_MockObject|ContainerBuilder $containerBuilder */
27+
$containerBuilder = $this->createMock(ContainerBuilder::class);
28+
$containerBuilder->expects($this->any())
29+
->method('hasDefinition')
30+
->with('data_collector.logger')
31+
->willReturn(false);
32+
$containerBuilder->expects($this->never())->method('getDefinition');
33+
34+
$this->compilerPass->process($containerBuilder);
35+
}
36+
37+
public function testProcessWhenServiceExist()
38+
{
39+
/** @var \PHPUnit_Framework_MockObject_MockObject|ContainerBuilder $containerBuilder */
40+
$containerBuilder = $this->createMock(ContainerBuilder::class);
41+
$containerBuilder->expects($this->any())
42+
->method('hasDefinition')
43+
->with('data_collector.logger')
44+
->willReturn(true);
45+
$containerBuilder->expects($this->once())
46+
->method('getDefinition')
47+
->willReturn(new Definition());
48+
49+
$this->compilerPass->process($containerBuilder);
50+
}
51+
}

0 commit comments

Comments
 (0)
0