From 117ba9ff423b77bb0c6231fcdba29ed6d2d91593 Mon Sep 17 00:00:00 2001 From: jaugustin <564420+jaugustin@users.noreply.github.com> Date: Tue, 2 Sep 2025 09:38:58 +0200 Subject: [PATCH 1/2] feat(log): Improve error log in client Change log message to follow best practice of PSR3, Log Exception object to help debuging, when provider throw Exception Signed-off-by: jaugustin <564420+jaugustin@users.noreply.github.com> --- src/OpenFeatureClient.php | 12 ++++++------ tests/unit/OpenFeatureClientTest.php | 9 ++++++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/OpenFeatureClient.php b/src/OpenFeatureClient.php index 0f90aab..44d5d95 100644 --- a/src/OpenFeatureClient.php +++ b/src/OpenFeatureClient.php @@ -38,7 +38,6 @@ use function array_merge; use function array_reverse; -use function sprintf; class OpenFeatureClient implements Client, LoggerAwareInterface { @@ -365,11 +364,12 @@ private function evaluateFlag( $hookExecutor->afterHooks($flagValueType, $hookContext, $resolutionDetails, $mergedRemainingHooks, $hookHints); } catch (Throwable $err) { $this->getLogger()->error( - sprintf( - "An error occurred during feature flag evaluation of flag '%s': %s", - $flagKey, - $err->getMessage(), - ), + "An error occurred during feature flag evaluation of flag '{flagKey}': {errorMessage}", + [ + 'flagKey' => $flagKey, + 'errorMessage' => $err->getMessage(), + 'exception' => $err, + ], ); $error = $err instanceof ThrowableWithResolutionError ? $err->getResolutionError() : new ResolutionError(ErrorCode::GENERAL(), $err->getMessage()); diff --git a/tests/unit/OpenFeatureClientTest.php b/tests/unit/OpenFeatureClientTest.php index 996b005..bfc5929 100644 --- a/tests/unit/OpenFeatureClientTest.php +++ b/tests/unit/OpenFeatureClientTest.php @@ -556,7 +556,14 @@ public function testClientShouldLogInformativeErrorDuringAbnormalExecution(): vo /** @var LoggerInterface|MockInterface $mockLogger */ $mockLogger = $this->mockery(LoggerInterface::class); - $mockLogger->shouldReceive('error')->once(); + $mockLogger->shouldReceive('error')->with( + "An error occurred during feature flag evaluation of flag '{flagKey}': {errorMessage}", + Mockery::on(fn ($context) => isset($context['flagKey'], $context['errorMessage'], $context['exception']) && + $context['flagKey'] === 'flagKey' && + $context['errorMessage'] === 'NETWORK_ERROR' && + $context['exception'] instanceof Exception && + $context['exception']->getMessage() === 'NETWORK_ERROR'), + )->once(); $api->setLogger($mockLogger); $mockProvider = $this->getDefaultMockProvider(); From 913d4072564c2c04063f58d2efd8b4a36b3daca6 Mon Sep 17 00:00:00 2001 From: jaugustin <564420+jaugustin@users.noreply.github.com> Date: Wed, 3 Sep 2025 09:20:58 +0200 Subject: [PATCH 2/2] fix(log): improve assert in test following genmini suggestions Signed-off-by: jaugustin <564420+jaugustin@users.noreply.github.com> --- tests/unit/OpenFeatureClientTest.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tests/unit/OpenFeatureClientTest.php b/tests/unit/OpenFeatureClientTest.php index bfc5929..0ce38df 100644 --- a/tests/unit/OpenFeatureClientTest.php +++ b/tests/unit/OpenFeatureClientTest.php @@ -27,6 +27,7 @@ use OpenFeature\interfaces\provider\Provider; use Psr\Log\LoggerInterface; use ReflectionClass; +use Throwable; class OpenFeatureClientTest extends TestCase { @@ -558,11 +559,18 @@ public function testClientShouldLogInformativeErrorDuringAbnormalExecution(): vo $mockLogger = $this->mockery(LoggerInterface::class); $mockLogger->shouldReceive('error')->with( "An error occurred during feature flag evaluation of flag '{flagKey}': {errorMessage}", - Mockery::on(fn ($context) => isset($context['flagKey'], $context['errorMessage'], $context['exception']) && - $context['flagKey'] === 'flagKey' && - $context['errorMessage'] === 'NETWORK_ERROR' && - $context['exception'] instanceof Exception && - $context['exception']->getMessage() === 'NETWORK_ERROR'), + Mockery::on(function ($context) { + $this->assertIsArray($context); + $this->assertArrayHasKey('flagKey', $context); + $this->assertSame('flagKey', $context['flagKey']); + $this->assertArrayHasKey('errorMessage', $context); + $this->assertSame('NETWORK_ERROR', $context['errorMessage']); + $this->assertArrayHasKey('exception', $context); + $this->assertInstanceOf(Throwable::class, $context['exception']); + $this->assertSame('NETWORK_ERROR', $context['exception']->getMessage()); + + return true; + }), )->once(); $api->setLogger($mockLogger);