From 0d269d2981d3096a5fa7a497998448a15c42eca6 Mon Sep 17 00:00:00 2001 From: Mykhailo Shtanko Date: Fri, 5 Apr 2024 15:59:55 +0300 Subject: [PATCH] [MetricsPower] Fix consumer issue, when redis not available --- Handler/MetricsHandler.php | 3 ++- Helper/CounterHelper.php | 11 +++++++---- .../Resolver/PrometheusOptionsResolver.php | 8 ++------ .../Resolver/PrometheusOptionResolverTest.php | 16 ++++++++++++++++ 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Handler/MetricsHandler.php b/Handler/MetricsHandler.php index cbcca03..426f0e7 100644 --- a/Handler/MetricsHandler.php +++ b/Handler/MetricsHandler.php @@ -26,7 +26,8 @@ class MetricsHandler implements MetricsHandlerInterface { public function __construct( private readonly OptionsResolverLocatorInterface $locator, - ) {} + ) { + } public function handle(AbstractWorkerMessageEvent|SendMessageToTransportsEvent $event): void { diff --git a/Helper/CounterHelper.php b/Helper/CounterHelper.php index d2c01d4..694d74a 100644 --- a/Helper/CounterHelper.php +++ b/Helper/CounterHelper.php @@ -27,11 +27,14 @@ final class CounterHelper public static function makeName(PrometheusOptions $options, ?string $prefix = null, ?string $postfix = null): string { + $topic = StringHelper::toSnakeCase($options->topic); + $name = StringHelper::toSnakeCase($options->name); + return match (true) { - null !== $prefix && null !== $postfix => str_replace(self::REPLACE_FROM, self::REPLACE_TO, sprintf('%s_%s_%s_%s', $prefix, $options->topic, $options->name, $postfix)), - null !== $prefix => str_replace(self::REPLACE_FROM, self::REPLACE_TO, sprintf('%s_%s_%s', $prefix, $options->topic, $options->name)), - null !== $postfix => str_replace(self::REPLACE_FROM, self::REPLACE_TO, sprintf('%s_%s_%s', $options->topic, $options->name, $postfix)), - default => str_replace(self::REPLACE_FROM, self::REPLACE_TO, sprintf('%s_%s', $options->topic, $options->name)), + null !== $prefix && null !== $postfix => str_replace(self::REPLACE_FROM, self::REPLACE_TO, sprintf('%s_%s_%s_%s', $prefix, $topic, $name, $postfix)), + null !== $prefix => str_replace(self::REPLACE_FROM, self::REPLACE_TO, sprintf('%s_%s_%s', $prefix, $topic, $name)), + null !== $postfix => str_replace(self::REPLACE_FROM, self::REPLACE_TO, sprintf('%s_%s_%s', $topic, $name, $postfix)), + default => str_replace(self::REPLACE_FROM, self::REPLACE_TO, sprintf('%s_%s', $topic, $name)), }; } } diff --git a/OptionsResolver/Resolver/PrometheusOptionsResolver.php b/OptionsResolver/Resolver/PrometheusOptionsResolver.php index 9ed2520..e3af79f 100644 --- a/OptionsResolver/Resolver/PrometheusOptionsResolver.php +++ b/OptionsResolver/Resolver/PrometheusOptionsResolver.php @@ -20,10 +20,9 @@ use FRZB\Component\MetricsPower\Attribute\PrometheusOptions; use FRZB\Component\MetricsPower\Exception\MetricsRegistrationException; use FRZB\Component\MetricsPower\Helper\CounterHelper; -use FRZB\Component\MetricsPower\Logger\MetricsPowerLoggerInterface; use Prometheus\Exception\MetricsRegistrationException as BaseMetricsRegistrationException; +use Prometheus\Exception\StorageException; use Prometheus\RegistryInterface; -use Psr\Log\LoggerInterface; use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\Messenger\Event\AbstractWorkerMessageEvent; use Symfony\Component\Messenger\Event\SendMessageToTransportsEvent; @@ -39,7 +38,6 @@ public function __construct( #[Autowire(env: 'PROMETHEUS_NAMESPACE')] private readonly string $namespace, private readonly RegistryInterface $registry, - private readonly ?MetricsPowerLoggerInterface $logger = null, ) {} /** @throws MetricsRegistrationException */ @@ -59,9 +57,7 @@ public function resolve(AbstractWorkerMessageEvent|SendMessageToTransportsEvent ->inc($options->values); } catch (BaseMetricsRegistrationException $e) { throw MetricsRegistrationException::fromThrowable($e); - } catch (\Throwable $e) { - $this->logger?->error($event, $e); - } + } catch (StorageException $e) {} } public static function getType(): string diff --git a/Tests/Unit/OptionsResolver/Resolver/PrometheusOptionResolverTest.php b/Tests/Unit/OptionsResolver/Resolver/PrometheusOptionResolverTest.php index 7b31fb3..ae21dc2 100644 --- a/Tests/Unit/OptionsResolver/Resolver/PrometheusOptionResolverTest.php +++ b/Tests/Unit/OptionsResolver/Resolver/PrometheusOptionResolverTest.php @@ -23,6 +23,7 @@ use FRZB\Component\MetricsPower\Tests\Stub\TestConstants; use Prometheus\Counter; use Prometheus\Exception\MetricsRegistrationException as BaseMetricsRegistrationException; +use Prometheus\Exception\StorageException; use Prometheus\RegistryInterface; use Symfony\Component\Messenger\Event\AbstractWorkerMessageEvent; use Symfony\Component\Messenger\Event\SendMessageToTransportsEvent; @@ -101,3 +102,18 @@ $this->expectExceptionMessage('something goes wrong'); })->throws(MetricsRegistrationException::class); + +test('It can not throw when storage fails', function (): void { + $registry = \Mockery::mock(RegistryInterface::class); + $prometheusOptionResolver = new PrometheusOptionsResolver(TestConstants::DEFAULT_NAMESPACE, $registry); + + $event = new WorkerMessageFailedEvent(createTestEnvelope(), TestConstants::DEFAULT_RECEIVER_NAME, SomethingGoesWrongException::wrong()); + $options = new PrometheusOptions(TestConstants::DEFAULT_RECEIVER_NAME, 'test-name', 'test-help', ['type'], ['TestMessage']); + + $registry->expects('getOrRegisterCounter') + ->once() + ->andThrow(new StorageException('something goes wrong')); + + /** @noinspection PhpUnhandledExceptionInspection */ + $prometheusOptionResolver->resolve($event, $options); +}); \ No newline at end of file