Preventing breaking profiling messages when flushing (#18800)

This commit is contained in:
Bizley
2021-08-07 16:06:25 +02:00
committed by GitHub
parent c905c10c93
commit f35f53eaf8
4 changed files with 155 additions and 35 deletions

View File

@ -237,24 +237,108 @@ class TargetTest extends TestCase
$this->assertCount(6, static::$messages[1]);
}
public function testBreakProfilingWithFlush()
public function testBreakProfilingWithFlushWithProfilingDisabled()
{
$logger = new Logger();
new Dispatcher([
'logger' => $logger,
'targets' => [new TestTarget()],
$dispatcher = $this->getMockBuilder('yii\log\Dispatcher')
->setMethods(['dispatch'])
->getMock();
$dispatcher->expects($this->once())->method('dispatch')->with($this->callback(function ($messages) {
return count($messages) === 2
&& $messages[0][0] === 'token.a'
&& $messages[0][1] == Logger::LEVEL_PROFILE_BEGIN
&& $messages[1][0] === 'info';
}), false);
$logger = new Logger([
'dispatcher' => $dispatcher,
'flushInterval' => 2,
]);
$logger->log('token.a', Logger::LEVEL_PROFILE_BEGIN, 'category');
$logger->log('info', Logger::LEVEL_INFO, 'category');
$logger->log('token.a', Logger::LEVEL_PROFILE_END, 'category');
}
$timings = $logger->getProfiling(['category']);
public function testNotBreakProfilingWithFlushWithProfilingEnabled()
{
$dispatcher = $this->getMockBuilder('yii\log\Dispatcher')
->setMethods(['dispatch'])
->getMock();
$dispatcher->expects($this->exactly(2))->method('dispatch')->withConsecutive(
[
$this->callback(function ($messages) {
return count($messages) === 1 && $messages[0][0] === 'info';
}),
false
],
[
$this->callback(function ($messages) {
return count($messages) === 2
&& $messages[0][0] === 'token.a'
&& $messages[0][1] == Logger::LEVEL_PROFILE_BEGIN
&& $messages[1][0] === 'token.a'
&& $messages[1][1] == Logger::LEVEL_PROFILE_END;
}),
false
]
);
self::assertCount(1, $timings);
self::assertArrayHasKey('info', $timings[0]);
self::assertArrayHasKey('category', $timings[0]);
$logger = new Logger([
'profilingAware' => true,
'dispatcher' => $dispatcher,
'flushInterval' => 2,
]);
$logger->log('token.a', Logger::LEVEL_PROFILE_BEGIN, 'category');
$logger->log('info', Logger::LEVEL_INFO, 'category');
$logger->log('token.a', Logger::LEVEL_PROFILE_END, 'category');
}
public function testFlushingWithProfilingEnabledAndOverflow()
{
$dispatcher = $this->getMockBuilder('yii\log\Dispatcher')
->setMethods(['dispatch'])
->getMock();
$dispatcher->expects($this->exactly(3))->method('dispatch')->withConsecutive(
[
$this->callback(function ($messages) {
return count($messages) === 2
&& $messages[0][0] === 'token.a'
&& $messages[0][1] == Logger::LEVEL_PROFILE_BEGIN
&& $messages[1][0] === 'token.b'
&& $messages[1][1] == Logger::LEVEL_PROFILE_BEGIN;
}),
false
],
[
$this->callback(function ($messages) {
return count($messages) === 1
&& $messages[0][0] === 'Number of dangling profiling block messages reached flushInterval value and therefore these were flushed. Please consider setting higher flushInterval value or making profiling blocks shorter.';
}),
false
],
[
$this->callback(function ($messages) {
return count($messages) === 2
&& $messages[0][0] === 'token.b'
&& $messages[0][1] == Logger::LEVEL_PROFILE_END
&& $messages[1][0] === 'token.a'
&& $messages[1][1] == Logger::LEVEL_PROFILE_END;
}),
false
]
);
$logger = new Logger([
'profilingAware' => true,
'dispatcher' => $dispatcher,
'flushInterval' => 2,
]);
$logger->log('token.a', Logger::LEVEL_PROFILE_BEGIN, 'category');
$logger->log('token.b', Logger::LEVEL_PROFILE_BEGIN, 'category');
$logger->log('token.b', Logger::LEVEL_PROFILE_END, 'category');
$logger->log('token.a', Logger::LEVEL_PROFILE_END, 'category');
}
}