From 69f74c6a089fb9b107bf7fb5ada478b4c22aa1fe Mon Sep 17 00:00:00 2001 From: spiralbot Date: Wed, 22 Jan 2025 15:17:07 +0000 Subject: [PATCH] prepare release --- composer.json | 4 +- src/AbstractTracer.php | 42 ++++--------------- src/Bootloader/TelemetryBootloader.php | 14 ++++--- src/LogTracerFactory.php | 2 +- src/NullTracerFactory.php | 2 +- tests/Clock/SystemClockTest.php | 2 +- tests/Config/TelemetryConfigTest.php | 8 ++-- tests/ConfigTracerFactoryProviderTest.php | 4 +- tests/LogTracerFactoryTest.php | 24 ++++++----- tests/LogTracerTest.php | 14 +++++-- tests/NullTracerFactoryTest.php | 12 ++++-- tests/NullTracerTest.php | 50 ++++------------------- tests/SpanTest.php | 26 ++++++------ 13 files changed, 77 insertions(+), 127 deletions(-) diff --git a/composer.json b/composer.json index b768a91..477630c 100644 --- a/composer.json +++ b/composer.json @@ -34,8 +34,8 @@ ], "require": { "php": ">=8.1", - "spiral/boot": "^3.15", - "spiral/core": "^3.15" + "spiral/boot": "^3.14.10", + "spiral/core": "^3.14.10" }, "require-dev": { "phpunit/phpunit": "^10.1", diff --git a/src/AbstractTracer.php b/src/AbstractTracer.php index e7972e2..fbb97bb 100644 --- a/src/AbstractTracer.php +++ b/src/AbstractTracer.php @@ -4,9 +4,8 @@ namespace Spiral\Telemetry; -use Spiral\Core\BinderInterface; +use Spiral\Core\Attribute\Proxy; use Spiral\Core\Container; -use Spiral\Core\ContainerScope; use Spiral\Core\InvokerInterface; use Spiral\Core\ScopeInterface; @@ -18,7 +17,7 @@ abstract class AbstractTracer implements TracerInterface { public function __construct( - private readonly ?ScopeInterface $scope = new Container(), + #[Proxy] private readonly ?ScopeInterface $scope = new Container(), ) { } @@ -27,37 +26,10 @@ public function __construct( */ final protected function runScope(SpanInterface $span, callable $callback): mixed { - $container = ContainerScope::getContainer(); - if ($container === null) { - return $this->scope->runScope([ - SpanInterface::class => $span, - TracerInterface::class => $this, - ], static fn (InvokerInterface $invoker): mixed => $invoker->invoke($callback)); - } - - if ($container instanceof Container) { - $invoker = $container; - $binder = $container; - } else { - /** @var InvokerInterface $invoker */ - $invoker = $container->get(InvokerInterface::class); - /** @var BinderInterface $binder */ - $binder = $container->get(BinderInterface::class); - } - - try { - $prevSpan = $container->get(SpanInterface::class); - } catch (\Throwable) { - $prevSpan = null; - } - - $binder->bindSingleton(SpanInterface::class, $span); - try { - return $invoker->invoke($callback); - } finally { - $prevSpan === null - ? $binder->removeBinding(SpanInterface::class) - : $binder->bindSingleton(SpanInterface::class, $prevSpan); - } + // TODO: Can we remove this scope? + return $this->scope->runScope([ + SpanInterface::class => $span, + TracerInterface::class => $this, + ], static fn (InvokerInterface $invoker): mixed => $invoker->invoke($callback)); } } diff --git a/src/Bootloader/TelemetryBootloader.php b/src/Bootloader/TelemetryBootloader.php index 2ceab13..d995cfe 100644 --- a/src/Bootloader/TelemetryBootloader.php +++ b/src/Bootloader/TelemetryBootloader.php @@ -14,11 +14,13 @@ use Spiral\Telemetry\Config\TelemetryConfig; use Spiral\Telemetry\ConfigTracerFactoryProvider; use Spiral\Telemetry\Exception\TracerException; +use Spiral\Telemetry\LogTracer; use Spiral\Telemetry\LogTracerFactory; +use Spiral\Telemetry\NullTracer; use Spiral\Telemetry\NullTracerFactory; use Spiral\Telemetry\TracerFactoryInterface; -use Spiral\Telemetry\TracerFactoryProviderInterface; use Spiral\Telemetry\TracerInterface; +use Spiral\Telemetry\TracerFactoryProviderInterface; final class TelemetryBootloader extends Bootloader { @@ -33,7 +35,7 @@ final class TelemetryBootloader extends Bootloader ]; public function __construct( - private readonly ConfiguratorInterface $config, + private readonly ConfiguratorInterface $config ) { } @@ -49,7 +51,7 @@ public function registerTracer(string $name, string|TracerFactoryInterface|Autow { $this->config->modify( TelemetryConfig::CONFIG, - new Append('drivers', $name, $driver), + new Append('drivers', $name, $driver) ); } @@ -57,7 +59,7 @@ public function registerTracer(string $name, string|TracerFactoryInterface|Autow * @throws TracerException */ public function initFactory( - TracerFactoryProviderInterface $tracerProvider, + TracerFactoryProviderInterface $tracerProvider ): TracerFactoryInterface { return $tracerProvider->getTracerFactory(); } @@ -66,7 +68,7 @@ public function initFactory( * @throws TracerException */ public function getTracer( - TracerFactoryInterface $tracerFactory, + TracerFactoryInterface $tracerFactory ): TracerInterface { return $tracerFactory->make(); } @@ -81,7 +83,7 @@ private function initConfig(EnvironmentInterface $env): void 'null' => NullTracerFactory::class, 'log' => LogTracerFactory::class, ], - ], + ] ); } } diff --git a/src/LogTracerFactory.php b/src/LogTracerFactory.php index c5e3b2e..4b63d1d 100644 --- a/src/LogTracerFactory.php +++ b/src/LogTracerFactory.php @@ -21,7 +21,7 @@ final class LogTracerFactory implements TracerFactoryInterface private readonly LoggerInterface $logger; public function __construct( - private readonly ScopeInterface $scope, + #[Proxy] private readonly ScopeInterface $scope, private readonly ClockInterface $clock, LogsInterface $logs, string $channel = self::LOG_CHANNEL diff --git a/src/NullTracerFactory.php b/src/NullTracerFactory.php index 1f0fd41..ee2f5f8 100644 --- a/src/NullTracerFactory.php +++ b/src/NullTracerFactory.php @@ -15,7 +15,7 @@ final class NullTracerFactory implements TracerFactoryInterface { public function __construct( - private readonly ?ScopeInterface $scope = new Container(), + #[Proxy] private readonly ?ScopeInterface $scope = new Container(), ) { } diff --git a/tests/Clock/SystemClockTest.php b/tests/Clock/SystemClockTest.php index f91ac51..89d2da4 100644 --- a/tests/Clock/SystemClockTest.php +++ b/tests/Clock/SystemClockTest.php @@ -13,6 +13,6 @@ public function testNow(): void { $clock = new SystemClock(); - self::assertIsInt($clock->now()); + $this->assertIsInt($clock->now()); } } diff --git a/tests/Config/TelemetryConfigTest.php b/tests/Config/TelemetryConfigTest.php index 450edf1..b15eacb 100644 --- a/tests/Config/TelemetryConfigTest.php +++ b/tests/Config/TelemetryConfigTest.php @@ -16,7 +16,7 @@ public function testGetsDefaultDriver(): void { $config = new TelemetryConfig(['default' => 'foo']); - self::assertSame('foo', $config->getDefaultDriver()); + $this->assertSame('foo', $config->getDefaultDriver()); } public function testGetsDriverConfigAsString(): void @@ -25,7 +25,7 @@ public function testGetsDriverConfigAsString(): void 'foo' => 'bar' ]]); - self::assertSame('bar', $config->getDriverConfig('foo')); + $this->assertSame('bar', $config->getDriverConfig('foo')); } public function testGetsDriverConfigAsAutowire(): void @@ -34,7 +34,7 @@ public function testGetsDriverConfigAsAutowire(): void 'foo' => $driver = new Autowire('bar') ]]); - self::assertSame($driver, $config->getDriverConfig('foo')); + $this->assertSame($driver, $config->getDriverConfig('foo')); } public function testGetsDriverConfigAsObject(): void @@ -43,6 +43,6 @@ public function testGetsDriverConfigAsObject(): void 'foo' => $driver = m::mock(TracerFactoryInterface::class) ]]); - self::assertSame($driver, $config->getDriverConfig('foo')); + $this->assertSame($driver, $config->getDriverConfig('foo')); } } diff --git a/tests/ConfigTracerFactoryProviderTest.php b/tests/ConfigTracerFactoryProviderTest.php index e6debc6..94f1041 100644 --- a/tests/ConfigTracerFactoryProviderTest.php +++ b/tests/ConfigTracerFactoryProviderTest.php @@ -28,7 +28,7 @@ public function testGetsTraceeFactory(): void ->with('bar') ->andReturn($f = \Mockery::mock(TracerFactoryInterface::class)); - self::assertSame($f, $provider->getTracerFactory('foo')); + $this->assertSame($f, $provider->getTracerFactory('foo')); } public function testGetsTraceeFactoryWithDefaultName(): void @@ -46,7 +46,7 @@ public function testGetsTraceeFactoryWithDefaultName(): void ->with('bar') ->andReturn($f = \Mockery::mock(TracerFactoryInterface::class)); - self::assertSame($f, $provider->getTracerFactory()); + $this->assertSame($f, $provider->getTracerFactory()); } public function testGetsTraceeFactoryWithNonExistName(): void diff --git a/tests/LogTracerFactoryTest.php b/tests/LogTracerFactoryTest.php index ff0a532..eb5a0a5 100644 --- a/tests/LogTracerFactoryTest.php +++ b/tests/LogTracerFactoryTest.php @@ -4,7 +4,7 @@ namespace Spiral\Tests\Telemetry; -use PHPUnit\Framework\Attributes\RunInSeparateProcess; +use Mockery as m; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Spiral\Core\ScopeInterface; @@ -15,28 +15,30 @@ final class LogTracerFactoryTest extends TestCase { + use m\Adapter\Phpunit\MockeryPHPUnitIntegration; + public function testMake(): void { - $logs = $this->createMock(LogsInterface::class); + $logs = m::mock(LogsInterface::class); - $logs->expects($this->once()) - ->method('getLogger') + $logs->shouldReceive('getLogger')->once() ->with('some-channel') - ->willReturn($logger = $this->createMock(LoggerInterface::class)); + ->andReturn($logger = m::mock(LoggerInterface::class)); $factory = new LogTracerFactory( - $scope = $this->createMock(ScopeInterface::class), - $clock = $this->createMock(ClockInterface::class), + $scope = m::mock(ScopeInterface::class), + $clock = m::mock(ClockInterface::class), $logs, 'some-channel' ); - $clock->method('now'); - $logger->expects($this->once())->method('debug'); + $clock->shouldReceive('now'); + $scope->shouldReceive('runScope')->once(); + $logger->shouldReceive('debug')->once(); - self::assertInstanceOf(LogTracer::class, $tracer = $factory->make()); + $this->assertInstanceOf(LogTracer::class, $tracer = $factory->make()); - $tracer->trace('foo', static fn(): string => 'hello'); + $tracer->trace('foo', fn() => 'hello'); } } diff --git a/tests/LogTracerTest.php b/tests/LogTracerTest.php index fb2f268..6df9904 100644 --- a/tests/LogTracerTest.php +++ b/tests/LogTracerTest.php @@ -32,7 +32,7 @@ public function testTrace(): void $uuid->shouldReceive('uuid4')->once()->andReturn($uuid = Uuid::uuid4()); - $callable = static fn(): string => 'hello'; + $callable = fn() => 'hello'; $invoker->shouldReceive('invoke') ->once() @@ -43,13 +43,19 @@ public function testTrace(): void $logger->shouldReceive('debug')->once(); $scope->shouldReceive('runScope') - ->withArgs(static fn(array $scope): bool => + ->withArgs(fn(array $scope) => $scope[SpanInterface::class] instanceof Span && $scope[SpanInterface::class]->getName() === 'foo' ) ->andReturnUsing(fn(array $scope, callable $callable) => $callable($invoker)); - self::assertSame('hello', $tracer->trace('foo', $callable, ['foo' => 'bar'])); - self::assertSame(['telemetry' => $uuid->toString()], $tracer->getContext()); + $this->assertSame( + 'hello', + $tracer->trace('foo', $callable, ['foo' => 'bar']) + ); + $this->assertSame( + ['telemetry' => $uuid->toString()], + $tracer->getContext() + ); } } diff --git a/tests/NullTracerFactoryTest.php b/tests/NullTracerFactoryTest.php index c386b35..1788210 100644 --- a/tests/NullTracerFactoryTest.php +++ b/tests/NullTracerFactoryTest.php @@ -5,7 +5,6 @@ namespace Spiral\Tests\Telemetry; use Mockery as m; -use PHPUnit\Framework\Attributes\RunInSeparateProcess; use PHPUnit\Framework\TestCase; use Spiral\Core\ScopeInterface; use Spiral\Telemetry\NullTracer; @@ -15,11 +14,16 @@ final class NullTracerFactoryTest extends TestCase { use m\Adapter\Phpunit\MockeryPHPUnitIntegration; - #[RunInSeparateProcess] public function testMake(): void { - $factory = new NullTracerFactory(m::mock(ScopeInterface::class)); + $factory = new NullTracerFactory( + $scope = m::mock(ScopeInterface::class) + ); - self::assertInstanceOf(NullTracer::class, $factory->make()); + $scope->shouldReceive('runScope')->once(); + + $this->assertInstanceOf(NullTracer::class, $tracer = $factory->make()); + + $tracer->trace('foo', fn() => 'hello'); } } diff --git a/tests/NullTracerTest.php b/tests/NullTracerTest.php index a1837f2..839470a 100644 --- a/tests/NullTracerTest.php +++ b/tests/NullTracerTest.php @@ -5,11 +5,7 @@ namespace Spiral\Tests\Telemetry; use Mockery as m; -use PHPUnit\Framework\Attributes\RunInSeparateProcess; use PHPUnit\Framework\TestCase; -use Psr\Container\ContainerInterface; -use Spiral\Core\BinderInterface; -use Spiral\Core\ContainerScope; use Spiral\Core\InvokerInterface; use Spiral\Core\ScopeInterface; use Spiral\Telemetry\NullTracer; @@ -20,8 +16,7 @@ final class NullTracerTest extends TestCase { use m\Adapter\Phpunit\MockeryPHPUnitIntegration; - #[RunInSeparateProcess] - public function testFallbackRunScope(): void + public function testTrace(): void { $tracer = new NullTracer( $scope = m::mock(ScopeInterface::class) @@ -29,7 +24,7 @@ public function testFallbackRunScope(): void $invoker = m::mock(InvokerInterface::class); - $callable = static fn(): string => 'hello'; + $callable = fn() => 'hello'; $invoker->shouldReceive('invoke') ->once() @@ -37,46 +32,15 @@ public function testFallbackRunScope(): void ->andReturn('hello'); $scope->shouldReceive('runScope') - ->withArgs(static fn(array $scope): bool => + ->withArgs(fn(array $scope) => $scope[SpanInterface::class] instanceof Span && $scope[SpanInterface::class]->getName() === 'foo' ) - ->andReturnUsing(static fn(array $scope, callable $callable) => $callable($invoker)); + ->andReturnUsing(fn(array $scope, callable $callable) => $callable($invoker)); - self::assertSame('hello', $tracer->trace('foo', $callable, ['foo' => 'bar'])); - } - - #[RunInSeparateProcess] - public function testWithScopedContainer(): void - { - $tracer = new NullTracer( - $scope = m::mock(ScopeInterface::class) + $this->assertSame( + 'hello', + $tracer->trace('foo', $callable, ['foo' => 'bar']) ); - - $invoker = m::mock(InvokerInterface::class); - $binder = m::mock(BinderInterface::class); - $container = m::mock(ContainerInterface::class); - $container->expects('get') - ->with(InvokerInterface::class) - ->andReturn($invoker); - $container->expects('get') - ->with(BinderInterface::class) - ->andReturn($binder); - - $callable = static fn(): string => 'hello'; - - $invoker->shouldReceive('invoke') - ->once() - ->with($callable) - ->andReturn('hello'); - $binder->shouldReceive('bindSingleton') - ->once(); - $binder->shouldReceive('removeBinding') - ->with(SpanInterface::class); - $scope->shouldNotReceive('runScope'); - - ContainerScope::runScope($container, function () use ($tracer, $callable): void { - self::assertSame('hello', $tracer->trace('foo', $callable, ['foo' => 'bar'])); - }); } } diff --git a/tests/SpanTest.php b/tests/SpanTest.php index 6e2b0a7..7baa3ec 100644 --- a/tests/SpanTest.php +++ b/tests/SpanTest.php @@ -13,22 +13,22 @@ public function testName(): void { $span = new Span('foo'); - self::assertSame('foo', $span->getName()); + $this->assertSame('foo', $span->getName()); $span->updateName('bar'); - self::assertSame('bar', $span->getName()); + $this->assertSame('bar', $span->getName()); } public function testConstructorWithoutAttributes(): void { $span = new Span('foo'); - self::assertSame([], $span->getAttributes()); + $this->assertSame([], $span->getAttributes()); } public function testConstructorWithAttributes(): void { $span = new Span('foo', ['baz' => 'bar']); - self::assertSame(['baz' => 'bar'], $span->getAttributes()); + $this->assertSame(['baz' => 'bar'], $span->getAttributes()); } public function testSetsAttributes(): void @@ -36,36 +36,36 @@ public function testSetsAttributes(): void $span = new Span('foo', ['baz' => 'bar']); $span->setAttribute('baf', 123); - self::assertSame(['baz' => 'bar', 'baf' => 123], $span->getAttributes()); + $this->assertSame(['baz' => 'bar', 'baf' => 123], $span->getAttributes()); $span->setAttributes(['foo' => 'bar']); - self::assertSame(['foo' => 'bar'], $span->getAttributes()); + $this->assertSame(['foo' => 'bar'], $span->getAttributes()); } public function testHasAttribute(): void { $span = new Span('foo', ['baz' => 'bar']); - self::assertTrue($span->hasAttribute('baz')); - self::assertFalse($span->hasAttribute('foo')); + $this->assertTrue($span->hasAttribute('baz')); + $this->assertFalse($span->hasAttribute('foo')); } public function testGetsAttribute(): void { $span = new Span('foo', ['baz' => 'bar']); - self::assertSame('bar', $span->getAttribute('baz')); - self::assertNull($span->getAttribute('baf')); + $this->assertSame('bar', $span->getAttribute('baz')); + $this->assertNull($span->getAttribute('baf')); } public function testSetsStatus(): void { $span = new Span('foo'); - self::assertNull($span->getStatus()); + $this->assertNull($span->getStatus()); $span->setStatus(404, 'Not found'); - self::assertSame(404, $span->getStatus()->code); - self::assertSame('Not found', $span->getStatus()->description); + $this->assertSame(404, $span->getStatus()->code); + $this->assertSame('Not found', $span->getStatus()->description); } }