From a8e3a3a0edffedf86f7e4c57ae47e02fa551b353 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Fri, 31 Oct 2025 15:28:15 +0100 Subject: [PATCH 01/17] feat: add support for symfony 8 --- .github/workflows/tests.yaml | 1 + composer.json | 38 +++--- src/Resources/config/schema/sentry-1.0.xsd | 144 --------------------- src/Resources/config/services.php | 125 ++++++++++++++++++ src/Resources/config/services.xml | 144 --------------------- 5 files changed, 145 insertions(+), 307 deletions(-) delete mode 100644 src/Resources/config/schema/sentry-1.0.xsd create mode 100644 src/Resources/config/services.php delete mode 100644 src/Resources/config/services.xml diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index ca10df03..37fe3ddf 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -33,6 +33,7 @@ jobs: - 5.* - 6.* - 7.* + - 8.* dependencies: - highest exclude: diff --git a/composer.json b/composer.json index 1413636e..ad69d107 100644 --- a/composer.json +++ b/composer.json @@ -15,15 +15,15 @@ "php": "^7.2||^8.0", "guzzlehttp/psr7": "^2.1.1", "jean85/pretty-package-versions": "^1.5||^2.0", - "sentry/sentry": "^4.16.0", + "sentry/sentry": "dev-master", "symfony/cache-contracts": "^1.1||^2.4||^3.0", - "symfony/config": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/console": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/dependency-injection": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/event-dispatcher": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/http-kernel": "^4.4.20||^5.0.11||^6.0||^7.0", + "symfony/config": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/console": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/dependency-injection": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/event-dispatcher": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/http-kernel": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/polyfill-php80": "^1.22", - "symfony/psr-http-message-bridge": "^1.2||^2.0||^6.4||^7.0" + "symfony/psr-http-message-bridge": "^1.2||^2.0||^6.4||^7.0||^8.0" }, "require-dev": { "doctrine/dbal": "^2.13||^3.3||^4.0", @@ -35,19 +35,19 @@ "phpstan/phpstan-phpunit": "1.4.0", "phpstan/phpstan-symfony": "1.4.10", "phpunit/phpunit": "^8.5.40||^9.6.21", - "symfony/browser-kit": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/cache": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/dom-crawler": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/framework-bundle": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/http-client": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/messenger": "^4.4.20||^5.0.11||^6.0||^7.0", + "symfony/browser-kit": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/cache": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/dom-crawler": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/framework-bundle": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/http-client": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/messenger": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/monolog-bundle": "^3.4", - "symfony/phpunit-bridge": "^5.2.6||^6.0||^7.0", - "symfony/process": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/security-core": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/security-http": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/twig-bundle": "^4.4.20||^5.0.11||^6.0||^7.0", - "symfony/yaml": "^4.4.20||^5.0.11||^6.0||^7.0", + "symfony/phpunit-bridge": "^5.2.6||^6.0||^7.0||^8.0", + "symfony/process": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/security-core": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/security-http": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/twig-bundle": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", + "symfony/yaml": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "vimeo/psalm": "^4.3||^5.16.0" }, "suggest": { diff --git a/src/Resources/config/schema/sentry-1.0.xsd b/src/Resources/config/schema/sentry-1.0.xsd deleted file mode 100644 index 5d03008b..00000000 --- a/src/Resources/config/schema/sentry-1.0.xsd +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php new file mode 100644 index 00000000..b80d8f6d --- /dev/null +++ b/src/Resources/config/services.php @@ -0,0 +1,125 @@ +services(); + + $services->defaults() + ->private(); + + $services->alias('Sentry\ClientInterface', 'sentry.client'); + + $services->set('Sentry\State\HubInterface') + ->factory(['Sentry\State\HubAdapter', 'getInstance']) + ->call('bindClient', [service('Sentry\ClientInterface')]); + + $services->alias('Sentry\SentryBundle\EventListener\ConsoleCommandListener', 'Sentry\SentryBundle\EventListener\ConsoleListener'); + + $services->set('Sentry\SentryBundle\EventListener\ConsoleListener', 'Sentry\SentryBundle\EventListener\ConsoleListener') + ->args([service('Sentry\State\HubInterface')]) + ->tag('kernel.event_listener', ['event' => 'console.command', 'method' => 'handleConsoleCommandEvent', 'priority' => 128]) + ->tag('kernel.event_listener', ['event' => 'console.terminate', 'method' => 'handleConsoleTerminateEvent', 'priority' => -64]) + ->tag('kernel.event_listener', ['event' => 'console.error', 'method' => 'handleConsoleErrorEvent', 'priority' => -64]); + + $services->set('Sentry\SentryBundle\EventListener\ErrorListener', 'Sentry\SentryBundle\EventListener\ErrorListener') + ->args([service('Sentry\State\HubInterface')]) + ->tag('kernel.event_listener', ['event' => 'kernel.exception', 'method' => 'handleExceptionEvent', 'priority' => 128]); + + $services->set('Sentry\SentryBundle\EventListener\RequestListener', 'Sentry\SentryBundle\EventListener\RequestListener') + ->args([service('Sentry\State\HubInterface')]) + ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent', 'priority' => 5]) + ->tag('kernel.event_listener', ['event' => 'kernel.controller', 'method' => 'handleKernelControllerEvent', 'priority' => 10]); + + $services->set('Sentry\SentryBundle\EventListener\SubRequestListener', 'Sentry\SentryBundle\EventListener\SubRequestListener') + ->args([service('Sentry\State\HubInterface')]) + ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent', 'priority' => 3]) + ->tag('kernel.event_listener', ['event' => 'kernel.finish_request', 'method' => 'handleKernelFinishRequestEvent', 'priority' => 5]); + + $services->set('Sentry\SentryBundle\EventListener\TracingRequestListener', 'Sentry\SentryBundle\EventListener\TracingRequestListener') + ->args([ + service('Sentry\State\HubInterface'), + service('Sentry\Integration\RequestFetcherInterface'), + ]) + ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent', 'priority' => 4]) + ->tag('kernel.event_listener', ['event' => 'kernel.response', 'method' => 'handleKernelResponseEvent', 'priority' => 15]) + ->tag('kernel.event_listener', ['event' => 'kernel.terminate', 'method' => 'handleKernelTerminateEvent', 'priority' => 5]); + + $services->set('Sentry\SentryBundle\EventListener\TracingSubRequestListener', 'Sentry\SentryBundle\EventListener\TracingSubRequestListener') + ->args([service('Sentry\State\HubInterface')]) + ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent', 'priority' => 2]) + ->tag('kernel.event_listener', ['event' => 'kernel.finish_request', 'method' => 'handleKernelFinishRequestEvent', 'priority' => 10]) + ->tag('kernel.event_listener', ['event' => 'kernel.response', 'method' => 'handleKernelResponseEvent', 'priority' => 15]); + + $services->set('Sentry\SentryBundle\EventListener\TracingConsoleListener', 'Sentry\SentryBundle\EventListener\TracingConsoleListener') + ->args([ + service('Sentry\State\HubInterface'), + '', + ]) + ->tag('kernel.event_listener', ['event' => 'console.command', 'method' => 'handleConsoleCommandEvent', 'priority' => 118]) + ->tag('kernel.event_listener', ['event' => 'console.terminate', 'method' => 'handleConsoleTerminateEvent', 'priority' => -54]); + + $services->set('Sentry\SentryBundle\EventListener\MessengerListener', 'Sentry\SentryBundle\EventListener\MessengerListener') + ->args([service('Sentry\State\HubInterface')]) + ->tag('kernel.event_listener', ['event' => 'Symfony\Component\Messenger\Event\WorkerMessageFailedEvent', 'method' => 'handleWorkerMessageFailedEvent', 'priority' => 50]) + ->tag('kernel.event_listener', ['event' => 'Symfony\Component\Messenger\Event\WorkerMessageHandledEvent', 'method' => 'handleWorkerMessageHandledEvent', 'priority' => 50]) + ->tag('kernel.event_listener', ['event' => 'Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent', 'method' => 'handleWorkerMessageReceivedEvent', 'priority' => 50]); + + $services->set('Sentry\SentryBundle\EventListener\LoginListener', 'Sentry\SentryBundle\EventListener\LoginListener') + ->args([ + service('Sentry\State\HubInterface'), + service('security.token_storage')->ignoreOnInvalid(), + ]) + ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent']); + + $services->set('Sentry\SentryBundle\EventListener\LogRequestListener', 'Sentry\SentryBundle\EventListener\LogRequestListener') + ->tag('kernel.event_listener', ['event' => 'kernel.terminate', 'method' => 'handleKernelTerminateEvent', 'priority' => 10]); + + $services->set('Sentry\SentryBundle\Command\SentryTestCommand', 'Sentry\SentryBundle\Command\SentryTestCommand') + ->args([service('Sentry\State\HubInterface')]) + ->tag('console.command', ['command' => 'sentry:test']); + + $services->alias('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface', 'Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory'); + + $services->set('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory', 'Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory') + ->args([service('Sentry\State\HubInterface')]); + + $services->set('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware', 'Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware') + ->args([service('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface')]); + + $services->set('Sentry\SentryBundle\Tracing\Doctrine\DBAL\ConnectionConfigurator', 'Sentry\SentryBundle\Tracing\Doctrine\DBAL\ConnectionConfigurator') + ->args([service('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware')]); + + $services->set('Sentry\SentryBundle\Tracing\Twig\TwigTracingExtension', 'Sentry\SentryBundle\Tracing\Twig\TwigTracingExtension') + ->args([service('Sentry\State\HubInterface')]) + ->tag('twig.extension'); + + $services->set('sentry.tracing.traceable_cache_adapter', 'Sentry\SentryBundle\Tracing\Cache\TraceableCacheAdapter') + ->abstract() + ->args([ + service('Sentry\State\HubInterface'), + '', + ]); + + $services->set('sentry.tracing.traceable_tag_aware_cache_adapter', 'Sentry\SentryBundle\Tracing\Cache\TraceableTagAwareCacheAdapter') + ->abstract() + ->args([ + service('Sentry\State\HubInterface'), + '', + ]); + + $services->set('Sentry\SentryBundle\Integration\IntegrationConfigurator', 'Sentry\SentryBundle\Integration\IntegrationConfigurator') + ->args([ + [], + '', + ]); + + $services->set('Sentry\Integration\RequestFetcherInterface', 'Sentry\SentryBundle\Integration\RequestFetcher') + ->args([ + service('Symfony\Component\HttpFoundation\RequestStack'), + service('Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface')->nullOnInvalid(), + ]); + + $services->set('Sentry\SentryBundle\Twig\SentryExtension', 'Sentry\SentryBundle\Twig\SentryExtension') + ->tag('twig.extension'); +}; diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml deleted file mode 100644 index dae3e7df..00000000 --- a/src/Resources/config/services.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 42d52f4b73e4b9a2da1d847a14c15539c5865a80 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Fri, 31 Oct 2025 15:32:57 +0100 Subject: [PATCH 02/17] replace xml config with php --- src/DependencyInjection/SentryExtension.php | 10 +++++----- .../XmlSentryExtensionTest.php | 18 ------------------ 2 files changed, 5 insertions(+), 23 deletions(-) delete mode 100644 tests/DependencyInjection/XmlSentryExtensionTest.php diff --git a/src/DependencyInjection/SentryExtension.php b/src/DependencyInjection/SentryExtension.php index 510638be..8a2f0b2c 100644 --- a/src/DependencyInjection/SentryExtension.php +++ b/src/DependencyInjection/SentryExtension.php @@ -62,8 +62,8 @@ public function getNamespace(): string */ protected function loadInternal(array $mergedConfig, ContainerBuilder $container): void { - $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); - $loader->load('services.xml'); + $loader = new Loader\PhpFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); + $loader->load('services.php'); if (!$container->hasParameter('env(SENTRY_RELEASE)')) { $container->setParameter('env(SENTRY_RELEASE)', PrettyVersions::getRootPackageVersion()->getPrettyVersion()); @@ -298,7 +298,7 @@ private function registerHttpClientTracingConfiguration(ContainerBuilder $contai } /** - * @param string[] $integrations + * @param string[] $integrations * @param array $config * * @return array @@ -330,12 +330,12 @@ private function configureRequestIntegration(array $integrations, bool $useDefau /** * @param class-string $integrationClass - * @param array $integrations + * @param array $integrations */ private function isIntegrationEnabled(string $integrationClass, array $integrations): bool { foreach ($integrations as $integration) { - if ($integration instanceof Reference && $integrationClass === (string) $integration) { + if ($integration instanceof Reference && $integrationClass === (string)$integration) { return true; } diff --git a/tests/DependencyInjection/XmlSentryExtensionTest.php b/tests/DependencyInjection/XmlSentryExtensionTest.php deleted file mode 100644 index e54808e2..00000000 --- a/tests/DependencyInjection/XmlSentryExtensionTest.php +++ /dev/null @@ -1,18 +0,0 @@ -load($fixtureFile . '.xml'); - } -} From c34bd8151567e5e056fe379d951d2e4df8417b22 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Fri, 31 Oct 2025 15:52:46 +0100 Subject: [PATCH 03/17] restore XML tests, add yml instead of php config --- src/DependencyInjection/SentryExtension.php | 4 +- src/Resources/config/schema/sentry-1.0.xsd | 144 ++++++++++++++++++ src/Resources/config/services.php | 125 --------------- src/Resources/config/services.yaml | 123 +++++++++++++++ .../XmlSentryExtensionTest.php | 21 +++ 5 files changed, 290 insertions(+), 127 deletions(-) create mode 100644 src/Resources/config/schema/sentry-1.0.xsd delete mode 100644 src/Resources/config/services.php create mode 100644 src/Resources/config/services.yaml create mode 100644 tests/DependencyInjection/XmlSentryExtensionTest.php diff --git a/src/DependencyInjection/SentryExtension.php b/src/DependencyInjection/SentryExtension.php index 8a2f0b2c..61e58676 100644 --- a/src/DependencyInjection/SentryExtension.php +++ b/src/DependencyInjection/SentryExtension.php @@ -62,8 +62,8 @@ public function getNamespace(): string */ protected function loadInternal(array $mergedConfig, ContainerBuilder $container): void { - $loader = new Loader\PhpFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); - $loader->load('services.php'); + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); + $loader->load('services.yaml'); if (!$container->hasParameter('env(SENTRY_RELEASE)')) { $container->setParameter('env(SENTRY_RELEASE)', PrettyVersions::getRootPackageVersion()->getPrettyVersion()); diff --git a/src/Resources/config/schema/sentry-1.0.xsd b/src/Resources/config/schema/sentry-1.0.xsd new file mode 100644 index 00000000..5d03008b --- /dev/null +++ b/src/Resources/config/schema/sentry-1.0.xsd @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php deleted file mode 100644 index b80d8f6d..00000000 --- a/src/Resources/config/services.php +++ /dev/null @@ -1,125 +0,0 @@ -services(); - - $services->defaults() - ->private(); - - $services->alias('Sentry\ClientInterface', 'sentry.client'); - - $services->set('Sentry\State\HubInterface') - ->factory(['Sentry\State\HubAdapter', 'getInstance']) - ->call('bindClient', [service('Sentry\ClientInterface')]); - - $services->alias('Sentry\SentryBundle\EventListener\ConsoleCommandListener', 'Sentry\SentryBundle\EventListener\ConsoleListener'); - - $services->set('Sentry\SentryBundle\EventListener\ConsoleListener', 'Sentry\SentryBundle\EventListener\ConsoleListener') - ->args([service('Sentry\State\HubInterface')]) - ->tag('kernel.event_listener', ['event' => 'console.command', 'method' => 'handleConsoleCommandEvent', 'priority' => 128]) - ->tag('kernel.event_listener', ['event' => 'console.terminate', 'method' => 'handleConsoleTerminateEvent', 'priority' => -64]) - ->tag('kernel.event_listener', ['event' => 'console.error', 'method' => 'handleConsoleErrorEvent', 'priority' => -64]); - - $services->set('Sentry\SentryBundle\EventListener\ErrorListener', 'Sentry\SentryBundle\EventListener\ErrorListener') - ->args([service('Sentry\State\HubInterface')]) - ->tag('kernel.event_listener', ['event' => 'kernel.exception', 'method' => 'handleExceptionEvent', 'priority' => 128]); - - $services->set('Sentry\SentryBundle\EventListener\RequestListener', 'Sentry\SentryBundle\EventListener\RequestListener') - ->args([service('Sentry\State\HubInterface')]) - ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent', 'priority' => 5]) - ->tag('kernel.event_listener', ['event' => 'kernel.controller', 'method' => 'handleKernelControllerEvent', 'priority' => 10]); - - $services->set('Sentry\SentryBundle\EventListener\SubRequestListener', 'Sentry\SentryBundle\EventListener\SubRequestListener') - ->args([service('Sentry\State\HubInterface')]) - ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent', 'priority' => 3]) - ->tag('kernel.event_listener', ['event' => 'kernel.finish_request', 'method' => 'handleKernelFinishRequestEvent', 'priority' => 5]); - - $services->set('Sentry\SentryBundle\EventListener\TracingRequestListener', 'Sentry\SentryBundle\EventListener\TracingRequestListener') - ->args([ - service('Sentry\State\HubInterface'), - service('Sentry\Integration\RequestFetcherInterface'), - ]) - ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent', 'priority' => 4]) - ->tag('kernel.event_listener', ['event' => 'kernel.response', 'method' => 'handleKernelResponseEvent', 'priority' => 15]) - ->tag('kernel.event_listener', ['event' => 'kernel.terminate', 'method' => 'handleKernelTerminateEvent', 'priority' => 5]); - - $services->set('Sentry\SentryBundle\EventListener\TracingSubRequestListener', 'Sentry\SentryBundle\EventListener\TracingSubRequestListener') - ->args([service('Sentry\State\HubInterface')]) - ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent', 'priority' => 2]) - ->tag('kernel.event_listener', ['event' => 'kernel.finish_request', 'method' => 'handleKernelFinishRequestEvent', 'priority' => 10]) - ->tag('kernel.event_listener', ['event' => 'kernel.response', 'method' => 'handleKernelResponseEvent', 'priority' => 15]); - - $services->set('Sentry\SentryBundle\EventListener\TracingConsoleListener', 'Sentry\SentryBundle\EventListener\TracingConsoleListener') - ->args([ - service('Sentry\State\HubInterface'), - '', - ]) - ->tag('kernel.event_listener', ['event' => 'console.command', 'method' => 'handleConsoleCommandEvent', 'priority' => 118]) - ->tag('kernel.event_listener', ['event' => 'console.terminate', 'method' => 'handleConsoleTerminateEvent', 'priority' => -54]); - - $services->set('Sentry\SentryBundle\EventListener\MessengerListener', 'Sentry\SentryBundle\EventListener\MessengerListener') - ->args([service('Sentry\State\HubInterface')]) - ->tag('kernel.event_listener', ['event' => 'Symfony\Component\Messenger\Event\WorkerMessageFailedEvent', 'method' => 'handleWorkerMessageFailedEvent', 'priority' => 50]) - ->tag('kernel.event_listener', ['event' => 'Symfony\Component\Messenger\Event\WorkerMessageHandledEvent', 'method' => 'handleWorkerMessageHandledEvent', 'priority' => 50]) - ->tag('kernel.event_listener', ['event' => 'Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent', 'method' => 'handleWorkerMessageReceivedEvent', 'priority' => 50]); - - $services->set('Sentry\SentryBundle\EventListener\LoginListener', 'Sentry\SentryBundle\EventListener\LoginListener') - ->args([ - service('Sentry\State\HubInterface'), - service('security.token_storage')->ignoreOnInvalid(), - ]) - ->tag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'handleKernelRequestEvent']); - - $services->set('Sentry\SentryBundle\EventListener\LogRequestListener', 'Sentry\SentryBundle\EventListener\LogRequestListener') - ->tag('kernel.event_listener', ['event' => 'kernel.terminate', 'method' => 'handleKernelTerminateEvent', 'priority' => 10]); - - $services->set('Sentry\SentryBundle\Command\SentryTestCommand', 'Sentry\SentryBundle\Command\SentryTestCommand') - ->args([service('Sentry\State\HubInterface')]) - ->tag('console.command', ['command' => 'sentry:test']); - - $services->alias('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface', 'Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory'); - - $services->set('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory', 'Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory') - ->args([service('Sentry\State\HubInterface')]); - - $services->set('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware', 'Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware') - ->args([service('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface')]); - - $services->set('Sentry\SentryBundle\Tracing\Doctrine\DBAL\ConnectionConfigurator', 'Sentry\SentryBundle\Tracing\Doctrine\DBAL\ConnectionConfigurator') - ->args([service('Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware')]); - - $services->set('Sentry\SentryBundle\Tracing\Twig\TwigTracingExtension', 'Sentry\SentryBundle\Tracing\Twig\TwigTracingExtension') - ->args([service('Sentry\State\HubInterface')]) - ->tag('twig.extension'); - - $services->set('sentry.tracing.traceable_cache_adapter', 'Sentry\SentryBundle\Tracing\Cache\TraceableCacheAdapter') - ->abstract() - ->args([ - service('Sentry\State\HubInterface'), - '', - ]); - - $services->set('sentry.tracing.traceable_tag_aware_cache_adapter', 'Sentry\SentryBundle\Tracing\Cache\TraceableTagAwareCacheAdapter') - ->abstract() - ->args([ - service('Sentry\State\HubInterface'), - '', - ]); - - $services->set('Sentry\SentryBundle\Integration\IntegrationConfigurator', 'Sentry\SentryBundle\Integration\IntegrationConfigurator') - ->args([ - [], - '', - ]); - - $services->set('Sentry\Integration\RequestFetcherInterface', 'Sentry\SentryBundle\Integration\RequestFetcher') - ->args([ - service('Symfony\Component\HttpFoundation\RequestStack'), - service('Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface')->nullOnInvalid(), - ]); - - $services->set('Sentry\SentryBundle\Twig\SentryExtension', 'Sentry\SentryBundle\Twig\SentryExtension') - ->tag('twig.extension'); -}; diff --git a/src/Resources/config/services.yaml b/src/Resources/config/services.yaml new file mode 100644 index 00000000..548b3dd6 --- /dev/null +++ b/src/Resources/config/services.yaml @@ -0,0 +1,123 @@ +services: + _defaults: + public: false + + Sentry\ClientInterface: '@sentry.client' + Sentry\SentryBundle\EventListener\ConsoleCommandListener: '@Sentry\SentryBundle\EventListener\ConsoleListener' + Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface: '@Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory' + + Sentry\State\HubInterface: + factory: ['Sentry\State\HubAdapter', 'getInstance'] + calls: + - [bindClient, ['@Sentry\ClientInterface']] + + Sentry\SentryBundle\EventListener\ConsoleListener: + arguments: ['@Sentry\State\HubInterface'] + tags: + - { name: kernel.event_listener, event: console.command, method: handleConsoleCommandEvent, priority: 128 } + - { name: kernel.event_listener, event: console.terminate, method: handleConsoleTerminateEvent, priority: -64 } + - { name: kernel.event_listener, event: console.error, method: handleConsoleErrorEvent, priority: -64 } + + Sentry\SentryBundle\EventListener\ErrorListener: + arguments: ['@Sentry\State\HubInterface'] + tags: + - { name: kernel.event_listener, event: kernel.exception, method: handleExceptionEvent, priority: 128 } + + Sentry\SentryBundle\EventListener\RequestListener: + arguments: ['@Sentry\State\HubInterface'] + tags: + - { name: kernel.event_listener, event: kernel.request, method: handleKernelRequestEvent, priority: 5 } + - { name: kernel.event_listener, event: kernel.controller, method: handleKernelControllerEvent, priority: 10 } + + Sentry\SentryBundle\EventListener\SubRequestListener: + arguments: ['@Sentry\State\HubInterface'] + tags: + - { name: kernel.event_listener, event: kernel.request, method: handleKernelRequestEvent, priority: 3 } + - { name: kernel.event_listener, event: kernel.finish_request, method: handleKernelFinishRequestEvent, priority: 5 } + + Sentry\SentryBundle\EventListener\TracingRequestListener: + arguments: + - '@Sentry\State\HubInterface' + - '@Sentry\Integration\RequestFetcherInterface' + tags: + - { name: kernel.event_listener, event: kernel.request, method: handleKernelRequestEvent, priority: 4 } + - { name: kernel.event_listener, event: kernel.response, method: handleKernelResponseEvent, priority: 15 } + - { name: kernel.event_listener, event: kernel.terminate, method: handleKernelTerminateEvent, priority: 5 } + + Sentry\SentryBundle\EventListener\TracingSubRequestListener: + arguments: ['@Sentry\State\HubInterface'] + tags: + - { name: kernel.event_listener, event: kernel.request, method: handleKernelRequestEvent, priority: 2 } + - { name: kernel.event_listener, event: kernel.finish_request, method: handleKernelFinishRequestEvent, priority: 10 } + - { name: kernel.event_listener, event: kernel.response, method: handleKernelResponseEvent, priority: 15 } + + Sentry\SentryBundle\EventListener\TracingConsoleListener: + arguments: + - '@Sentry\State\HubInterface' + - '' + tags: + - { name: kernel.event_listener, event: console.command, method: handleConsoleCommandEvent, priority: 118 } + - { name: kernel.event_listener, event: console.terminate, method: handleConsoleTerminateEvent, priority: -54 } + + Sentry\SentryBundle\EventListener\MessengerListener: + arguments: ['@Sentry\State\HubInterface'] + tags: + - { name: kernel.event_listener, event: 'Symfony\Component\Messenger\Event\WorkerMessageFailedEvent', method: handleWorkerMessageFailedEvent, priority: 50 } + - { name: kernel.event_listener, event: 'Symfony\Component\Messenger\Event\WorkerMessageHandledEvent', method: handleWorkerMessageHandledEvent, priority: 50 } + - { name: kernel.event_listener, event: 'Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent', method: handleWorkerMessageReceivedEvent, priority: 50 } + + Sentry\SentryBundle\EventListener\LoginListener: + arguments: + - '@Sentry\State\HubInterface' + - '@?security.token_storage' + tags: + - { name: kernel.event_listener, event: kernel.request, method: handleKernelRequestEvent } + + Sentry\SentryBundle\EventListener\LogRequestListener: + tags: + - { name: kernel.event_listener, event: kernel.terminate, method: handleKernelTerminateEvent, priority: 10 } + + # Command + Sentry\SentryBundle\Command\SentryTestCommand: + arguments: ['@Sentry\State\HubInterface'] + tags: + - { name: console.command, command: 'sentry:test' } + + Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory: + arguments: ['@Sentry\State\HubInterface'] + + Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware: + arguments: ['@Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory'] + + Sentry\SentryBundle\Tracing\Doctrine\DBAL\ConnectionConfigurator: + arguments: ['@Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware'] + + Sentry\SentryBundle\Tracing\Twig\TwigTracingExtension: + arguments: ['@Sentry\State\HubInterface'] + tags: + - { name: twig.extension } + + sentry.tracing.traceable_cache_adapter: + class: Sentry\SentryBundle\Tracing\Cache\TraceableCacheAdapter + abstract: true + arguments: ['@Sentry\State\HubInterface', '' ] + + sentry.tracing.traceable_tag_aware_cache_adapter: + class: Sentry\SentryBundle\Tracing\Cache\TraceableTagAwareCacheAdapter + abstract: true + arguments: ['@Sentry\State\HubInterface', '' ] + + Sentry\SentryBundle\Integration\IntegrationConfigurator: + arguments: [ [], '' ] + + Sentry\Integration\RequestFetcherInterface: + class: Sentry\SentryBundle\Integration\RequestFetcher + arguments: + - '@Symfony\Component\HttpFoundation\RequestStack' + - '@?Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface' + + Sentry\SentryBundle\Twig\SentryExtension: + tags: + - { name: twig.extension } + + diff --git a/tests/DependencyInjection/XmlSentryExtensionTest.php b/tests/DependencyInjection/XmlSentryExtensionTest.php new file mode 100644 index 00000000..fed6dcb8 --- /dev/null +++ b/tests/DependencyInjection/XmlSentryExtensionTest.php @@ -0,0 +1,21 @@ +markTestSkipped('XML Config files are not supported in Symfony 8.x and above.'); + } + $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/Fixtures/xml')); + $loader->load($fixtureFile . '.xml'); + } +} From c9d26b6f3e92b5690d9d8b22603969c4fdb5f5b3 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Fri, 31 Oct 2025 16:12:54 +0100 Subject: [PATCH 04/17] pipeline --- .github/workflows/tests.yaml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 37fe3ddf..d1172beb 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -33,7 +33,7 @@ jobs: - 5.* - 6.* - 7.* - - 8.* + - 8.0.*@dev dependencies: - highest exclude: @@ -55,6 +55,20 @@ jobs: symfony-version: 7.* - php: '8.4' symfony-version: 4.4.* + - php: '7.2' + symfony-version: 8.0.*@dev + - php: '7.3' + symfony-version: 8.0.*@dev + - php: '7.4' + symfony-version: 8.0.*@dev + - php: '8.0' + symfony-version: 8.0.*@dev + - php: '8.1' + symfony-version: 8.0.*@dev + - php: '8.2' + symfony-version: 8.0.*@dev + - php: '8.3' + symfony-version: 8.0.*@dev include: - php: '7.2' symfony-version: 4.4.* @@ -123,6 +137,7 @@ jobs: symfony-version: 4.4.* - php: '8.4' dependencies: highest + symfony-version: 8.0.*@dev steps: - name: Checkout From 2852759e13e21e405cba835b24574783cbe51016 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Fri, 31 Oct 2025 17:35:55 +0100 Subject: [PATCH 05/17] wip --- .github/workflows/tests.yaml | 12 ++++++++++++ composer.json | 6 ++++-- tests/End2End/App/KernelForBufferTest.php | 6 ------ tests/End2End/App/config.yml | 1 - tests/End2End/App/config_buffer_test.yml | 10 ++++++++++ .../App/config_buffer_test_newer_versions.yml | 6 ------ tests/End2End/App/config_buffer_test_php72.yml | 13 ------------- 7 files changed, 26 insertions(+), 28 deletions(-) delete mode 100644 tests/End2End/App/config_buffer_test_newer_versions.yml delete mode 100644 tests/End2End/App/config_buffer_test_php72.yml diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index d1172beb..9a32a569 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -99,6 +99,12 @@ jobs: - name: Setup Problem Matchers for PHPUnit run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + - name: Allow Symfony 8 pre-releases + if: contains(matrix.symfony-version, '8.') + run: | + composer config minimum-stability dev + composer config prefer-stable true + # These dependencies are not used running the tests but can cause deprecation warnings so we remove them before running the tests - name: Remove unused dependencies run: composer remove vimeo/psalm phpstan/phpstan friendsofphp/php-cs-fixer --dev --no-interaction --no-update @@ -156,6 +162,12 @@ jobs: - name: Remove optional packages run: composer remove doctrine/dbal doctrine/doctrine-bundle symfony/messenger symfony/twig-bundle symfony/cache symfony/http-client --dev --no-update + - name: Allow Symfony 8 pre-releases + if: contains(matrix.symfony-version || '', '8.') + run: | + composer config minimum-stability dev + composer config prefer-stable true + - name: Install dependencies uses: ramsey/composer-install@v3 with: diff --git a/composer.json b/composer.json index ad69d107..c60dba78 100644 --- a/composer.json +++ b/composer.json @@ -4,6 +4,8 @@ "description": "Symfony integration for Sentry (http://getsentry.com)", "keywords": ["logging", "errors", "symfony", "sentry"], "homepage": "http://getsentry.com", + "minimum-stability": "dev", + "prefer-stable": true, "license": "MIT", "authors": [ { @@ -27,7 +29,7 @@ }, "require-dev": { "doctrine/dbal": "^2.13||^3.3||^4.0", - "doctrine/doctrine-bundle": "^2.6", + "doctrine/doctrine-bundle": "^2.6||^3.0", "friendsofphp/php-cs-fixer": "^2.19||^3.40", "masterminds/html5": "^2.8", "phpstan/extension-installer": "^1.0", @@ -41,7 +43,7 @@ "symfony/framework-bundle": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/http-client": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/messenger": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", - "symfony/monolog-bundle": "^3.4", + "symfony/monolog-bundle": "^3.4||^4.0", "symfony/phpunit-bridge": "^5.2.6||^6.0||^7.0||^8.0", "symfony/process": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/security-core": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", diff --git a/tests/End2End/App/KernelForBufferTest.php b/tests/End2End/App/KernelForBufferTest.php index c49a252e..c7aaae50 100644 --- a/tests/End2End/App/KernelForBufferTest.php +++ b/tests/End2End/App/KernelForBufferTest.php @@ -16,12 +16,6 @@ public function registerContainerConfiguration(LoaderInterface $loader): void { parent::registerContainerConfiguration($loader); $loader->load(__DIR__ . '/config_buffer_test.yml'); - - if ($this->supportsHubId()) { - $loader->load(__DIR__ . '/config_buffer_test_newer_versions.yml'); - } else { - $loader->load(__DIR__ . '/config_buffer_test_php72.yml'); - } } /** diff --git a/tests/End2End/App/config.yml b/tests/End2End/App/config.yml index af12f69e..453b050b 100644 --- a/tests/End2End/App/config.yml +++ b/tests/End2End/App/config.yml @@ -17,7 +17,6 @@ framework: router: { resource: "%routing_config_dir%/routing.yml" } secret: secret test: ~ - annotations: false php_errors: log: true # Use FS cache for testing diff --git a/tests/End2End/App/config_buffer_test.yml b/tests/End2End/App/config_buffer_test.yml index abd18707..a0e01826 100644 --- a/tests/End2End/App/config_buffer_test.yml +++ b/tests/End2End/App/config_buffer_test.yml @@ -4,6 +4,12 @@ services: - '@Sentry\State\HubInterface' - !php/const Monolog\Logger::WARNING + app.sentry.handler: + class: Sentry\Monolog\Handler + arguments: + - '@Sentry\State\HubInterface' + - !php/const Monolog\Logger::WARNING + Sentry\SentryBundle\Tests\End2End\App\Controller\BufferFlushController: autowire: true tags: @@ -31,6 +37,10 @@ services: monolog: handlers: + sentry: + type: service + id: app.sentry.handler + level: warning main: type: stream path: "%kernel.logs_dir%/%kernel.environment%.log" diff --git a/tests/End2End/App/config_buffer_test_newer_versions.yml b/tests/End2End/App/config_buffer_test_newer_versions.yml deleted file mode 100644 index aef316fb..00000000 --- a/tests/End2End/App/config_buffer_test_newer_versions.yml +++ /dev/null @@ -1,6 +0,0 @@ -monolog: - handlers: - sentry: - type: sentry - level: warning - hub_id: 'Sentry\State\HubInterface' diff --git a/tests/End2End/App/config_buffer_test_php72.yml b/tests/End2End/App/config_buffer_test_php72.yml deleted file mode 100644 index d4a64e2c..00000000 --- a/tests/End2End/App/config_buffer_test_php72.yml +++ /dev/null @@ -1,13 +0,0 @@ -services: - app.sentry.handler: - class: Sentry\Monolog\Handler - arguments: - - '@Sentry\State\HubInterface' - - !php/const Monolog\Logger::WARNING - -monolog: - handlers: - sentry: - type: service - id: app.sentry.handler - level: warning From e34686c85fd7e10d0e8a6d5a2a769d62ede8b3c1 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Mon, 3 Nov 2025 16:26:57 +0100 Subject: [PATCH 06/17] wip --- .github/workflows/tests.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 9a32a569..c69b038c 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -33,7 +33,7 @@ jobs: - 5.* - 6.* - 7.* - - 8.0.*@dev + - 8.0 dependencies: - highest exclude: @@ -56,19 +56,19 @@ jobs: - php: '8.4' symfony-version: 4.4.* - php: '7.2' - symfony-version: 8.0.*@dev + symfony-version: 8.0 - php: '7.3' - symfony-version: 8.0.*@dev + symfony-version: 8.0 - php: '7.4' - symfony-version: 8.0.*@dev + symfony-version: 8.0 - php: '8.0' - symfony-version: 8.0.*@dev + symfony-version: 8.0 - php: '8.1' - symfony-version: 8.0.*@dev + symfony-version: 8.0 - php: '8.2' - symfony-version: 8.0.*@dev + symfony-version: 8.0 - php: '8.3' - symfony-version: 8.0.*@dev + symfony-version: 8.0 include: - php: '7.2' symfony-version: 4.4.* @@ -102,7 +102,7 @@ jobs: - name: Allow Symfony 8 pre-releases if: contains(matrix.symfony-version, '8.') run: | - composer config minimum-stability dev + composer config minimum-stability beta composer config prefer-stable true # These dependencies are not used running the tests but can cause deprecation warnings so we remove them before running the tests @@ -165,7 +165,7 @@ jobs: - name: Allow Symfony 8 pre-releases if: contains(matrix.symfony-version || '', '8.') run: | - composer config minimum-stability dev + composer config minimum-stability beta composer config prefer-stable true - name: Install dependencies From 5e82e766371eab3cfbf8e0473d913b3e2cd66c69 Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Thu, 6 Nov 2025 15:14:14 +0100 Subject: [PATCH 07/17] CS --- src/DependencyInjection/SentryExtension.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DependencyInjection/SentryExtension.php b/src/DependencyInjection/SentryExtension.php index 61e58676..d752813c 100644 --- a/src/DependencyInjection/SentryExtension.php +++ b/src/DependencyInjection/SentryExtension.php @@ -298,7 +298,7 @@ private function registerHttpClientTracingConfiguration(ContainerBuilder $contai } /** - * @param string[] $integrations + * @param string[] $integrations * @param array $config * * @return array @@ -330,12 +330,12 @@ private function configureRequestIntegration(array $integrations, bool $useDefau /** * @param class-string $integrationClass - * @param array $integrations + * @param array $integrations */ private function isIntegrationEnabled(string $integrationClass, array $integrations): bool { foreach ($integrations as $integration) { - if ($integration instanceof Reference && $integrationClass === (string)$integration) { + if ($integration instanceof Reference && $integrationClass === (string) $integration) { return true; } From 6ed87a192fee038de6c681ba515dbc9f092cb6b4 Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Thu, 6 Nov 2025 15:23:01 +0100 Subject: [PATCH 08/17] wip --- .github/workflows/tests.yaml | 10 +++++----- composer.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index c69b038c..b5fc72d0 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -99,11 +99,11 @@ jobs: - name: Setup Problem Matchers for PHPUnit run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" - - name: Allow Symfony 8 pre-releases - if: contains(matrix.symfony-version, '8.') - run: | - composer config minimum-stability beta - composer config prefer-stable true + # - name: Allow Symfony 8 pre-releases + # if: contains(matrix.symfony-version, '8.') + # run: | + # composer config minimum-stability beta + # composer config prefer-stable true # These dependencies are not used running the tests but can cause deprecation warnings so we remove them before running the tests - name: Remove unused dependencies diff --git a/composer.json b/composer.json index c60dba78..11ea8a74 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "keywords": ["logging", "errors", "symfony", "sentry"], "homepage": "http://getsentry.com", "minimum-stability": "dev", - "prefer-stable": true, + "prefer-stable": false, "license": "MIT", "authors": [ { From fff4fd2f3a3bec330f706ae8a0e8257e7e718ae1 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 12 Nov 2025 11:18:07 +0100 Subject: [PATCH 09/17] wip --- .github/workflows/tests.yaml | 14 +------------- composer.json | 2 +- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index b5fc72d0..2dbe7fa5 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -99,12 +99,6 @@ jobs: - name: Setup Problem Matchers for PHPUnit run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" - # - name: Allow Symfony 8 pre-releases - # if: contains(matrix.symfony-version, '8.') - # run: | - # composer config minimum-stability beta - # composer config prefer-stable true - # These dependencies are not used running the tests but can cause deprecation warnings so we remove them before running the tests - name: Remove unused dependencies run: composer remove vimeo/psalm phpstan/phpstan friendsofphp/php-cs-fixer --dev --no-interaction --no-update @@ -143,7 +137,7 @@ jobs: symfony-version: 4.4.* - php: '8.4' dependencies: highest - symfony-version: 8.0.*@dev + symfony-version: 8.0 steps: - name: Checkout @@ -162,12 +156,6 @@ jobs: - name: Remove optional packages run: composer remove doctrine/dbal doctrine/doctrine-bundle symfony/messenger symfony/twig-bundle symfony/cache symfony/http-client --dev --no-update - - name: Allow Symfony 8 pre-releases - if: contains(matrix.symfony-version || '', '8.') - run: | - composer config minimum-stability beta - composer config prefer-stable true - - name: Install dependencies uses: ramsey/composer-install@v3 with: diff --git a/composer.json b/composer.json index 11ea8a74..f3e25d41 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "php": "^7.2||^8.0", "guzzlehttp/psr7": "^2.1.1", "jean85/pretty-package-versions": "^1.5||^2.0", - "sentry/sentry": "dev-master", + "sentry/sentry": "4.18.1", "symfony/cache-contracts": "^1.1||^2.4||^3.0", "symfony/config": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/console": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", From 91b44dd3fae512e3c670ccd8b9b908dd8bdf0bf2 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 12 Nov 2025 12:07:43 +0100 Subject: [PATCH 10/17] wip --- .github/workflows/tests.yaml | 18 +++++++++--------- composer.json | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 2dbe7fa5..7ad3442b 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -33,7 +33,7 @@ jobs: - 5.* - 6.* - 7.* - - 8.0 + - 8.0.*@beta dependencies: - highest exclude: @@ -56,19 +56,19 @@ jobs: - php: '8.4' symfony-version: 4.4.* - php: '7.2' - symfony-version: 8.0 + symfony-version: 8.0.*@beta - php: '7.3' - symfony-version: 8.0 + symfony-version: 8.0.*@beta - php: '7.4' - symfony-version: 8.0 + symfony-version: 8.0.*@beta - php: '8.0' - symfony-version: 8.0 + symfony-version: 8.0.*@beta - php: '8.1' - symfony-version: 8.0 + symfony-version: 8.0.*@beta - php: '8.2' - symfony-version: 8.0 + symfony-version: 8.0.*@beta - php: '8.3' - symfony-version: 8.0 + symfony-version: 8.0.*@beta include: - php: '7.2' symfony-version: 4.4.* @@ -137,7 +137,7 @@ jobs: symfony-version: 4.4.* - php: '8.4' dependencies: highest - symfony-version: 8.0 + symfony-version: 8.0.*@beta steps: - name: Checkout diff --git a/composer.json b/composer.json index f3e25d41..92730bd0 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "php": "^7.2||^8.0", "guzzlehttp/psr7": "^2.1.1", "jean85/pretty-package-versions": "^1.5||^2.0", - "sentry/sentry": "4.18.1", + "sentry/sentry": "4.18", "symfony/cache-contracts": "^1.1||^2.4||^3.0", "symfony/config": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/console": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", @@ -30,7 +30,7 @@ "require-dev": { "doctrine/dbal": "^2.13||^3.3||^4.0", "doctrine/doctrine-bundle": "^2.6||^3.0", - "friendsofphp/php-cs-fixer": "^2.19||^3.40", + "php-cs-fixer/shim": "^2.19||^3.40", "masterminds/html5": "^2.8", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "1.12.5", @@ -50,7 +50,7 @@ "symfony/security-http": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/twig-bundle": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/yaml": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", - "vimeo/psalm": "^4.3||^5.16.0" + "psalm/phar": "^4.3||^5.16.0" }, "suggest": { "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler.", From 9bd50a2deb22e4fad79b469cc58bfc4a09cf1679 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 12 Nov 2025 14:00:45 +0100 Subject: [PATCH 11/17] wip --- src/DependencyInjection/SentryExtension.php | 24 ++++++++++++++++++--- src/Resources/config/services.yaml | 8 ++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/DependencyInjection/SentryExtension.php b/src/DependencyInjection/SentryExtension.php index d752813c..3b8bcffd 100644 --- a/src/DependencyInjection/SentryExtension.php +++ b/src/DependencyInjection/SentryExtension.php @@ -69,6 +69,11 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container $container->setParameter('env(SENTRY_RELEASE)', PrettyVersions::getRootPackageVersion()->getPrettyVersion()); } + // Remove Twig extension service if Twig is not installed to avoid autoloading failures on Symfony 8 + if (!class_exists(\Twig\Extension\AbstractExtension::class)) { + $container->removeDefinition(\Sentry\SentryBundle\Twig\SentryExtension::class); + } + $this->registerConfiguration($container, $mergedConfig); $this->registerErrorListenerConfiguration($container, $mergedConfig); $this->registerMessengerListenerConfiguration($container, $mergedConfig['messenger']); @@ -244,6 +249,19 @@ private function registerDbalTracingConfiguration(ContainerBuilder $container, a $container->setParameter('sentry.tracing.dbal.enabled', $isConfigEnabled); $container->setParameter('sentry.tracing.dbal.connections', $isConfigEnabled ? $config['dbal']['connections'] : []); + $factoryServiceId = 'sentry.tracing.dbal.connection_factory'; + if ($container->hasDefinition($factoryServiceId)) { + $factoryClass = \Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryForV2V3::class; + + // On Symfony 8+, the container validates FQCN-like service IDs at compile time. Classes provided + // via aliases.php aren’t considered during this check, so FQCN IDs without loadable classes fail + if (class_exists(\Doctrine\DBAL\Result::class) && !interface_exists(\Doctrine\DBAL\VersionAwarePlatformDriver::class)) { + $factoryClass = \Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryForV4::class; + } + + $container->getDefinition($factoryServiceId)->setClass($factoryClass); + } + if (!$isConfigEnabled) { $container->removeDefinition(ConnectionConfigurator::class); $container->removeDefinition(TracingDriverMiddleware::class); @@ -298,7 +316,7 @@ private function registerHttpClientTracingConfiguration(ContainerBuilder $contai } /** - * @param string[] $integrations + * @param string[] $integrations * @param array $config * * @return array @@ -330,12 +348,12 @@ private function configureRequestIntegration(array $integrations, bool $useDefau /** * @param class-string $integrationClass - * @param array $integrations + * @param array $integrations */ private function isIntegrationEnabled(string $integrationClass, array $integrations): bool { foreach ($integrations as $integration) { - if ($integration instanceof Reference && $integrationClass === (string) $integration) { + if ($integration instanceof Reference && $integrationClass === (string)$integration) { return true; } diff --git a/src/Resources/config/services.yaml b/src/Resources/config/services.yaml index 548b3dd6..c4aba752 100644 --- a/src/Resources/config/services.yaml +++ b/src/Resources/config/services.yaml @@ -4,7 +4,8 @@ services: Sentry\ClientInterface: '@sentry.client' Sentry\SentryBundle\EventListener\ConsoleCommandListener: '@Sentry\SentryBundle\EventListener\ConsoleListener' - Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface: '@Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory' + Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface: '@sentry.tracing.dbal.connection_factory' + Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory: '@sentry.tracing.dbal.connection_factory' Sentry\State\HubInterface: factory: ['Sentry\State\HubAdapter', 'getInstance'] @@ -83,11 +84,12 @@ services: tags: - { name: console.command, command: 'sentry:test' } - Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory: + sentry.tracing.dbal.connection_factory: + class: Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryForV2V3 arguments: ['@Sentry\State\HubInterface'] Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware: - arguments: ['@Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactory'] + arguments: ['@Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverConnectionFactoryInterface'] Sentry\SentryBundle\Tracing\Doctrine\DBAL\ConnectionConfigurator: arguments: ['@Sentry\SentryBundle\Tracing\Doctrine\DBAL\TracingDriverMiddleware'] From bbf61c6963482f9d0709c21472b65c178983e8eb Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 12 Nov 2025 14:07:06 +0100 Subject: [PATCH 12/17] CS --- src/DependencyInjection/SentryExtension.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DependencyInjection/SentryExtension.php b/src/DependencyInjection/SentryExtension.php index 3b8bcffd..f64f2991 100644 --- a/src/DependencyInjection/SentryExtension.php +++ b/src/DependencyInjection/SentryExtension.php @@ -316,7 +316,7 @@ private function registerHttpClientTracingConfiguration(ContainerBuilder $contai } /** - * @param string[] $integrations + * @param string[] $integrations * @param array $config * * @return array @@ -348,12 +348,12 @@ private function configureRequestIntegration(array $integrations, bool $useDefau /** * @param class-string $integrationClass - * @param array $integrations + * @param array $integrations */ private function isIntegrationEnabled(string $integrationClass, array $integrations): bool { foreach ($integrations as $integration) { - if ($integration instanceof Reference && $integrationClass === (string)$integration) { + if ($integration instanceof Reference && $integrationClass === (string) $integration) { return true; } From 2b283f0fc3f10bb453ccf8e41e0bf1565222ec76 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 12 Nov 2025 14:35:58 +0100 Subject: [PATCH 13/17] wip --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 92730bd0..a6e14f91 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "require-dev": { "doctrine/dbal": "^2.13||^3.3||^4.0", "doctrine/doctrine-bundle": "^2.6||^3.0", - "php-cs-fixer/shim": "^2.19||^3.40", + "friendsofphp/php-cs-fixer": "^2.19||^3.40", "masterminds/html5": "^2.8", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "1.12.5", @@ -50,7 +50,7 @@ "symfony/security-http": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/twig-bundle": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/yaml": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", - "psalm/phar": "^4.3||^5.16.0" + "vimeo/psalm": "^4.3||^5.16.0" }, "suggest": { "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler.", From 71c0d1dcae3eb13fc8a53aa1f246343c3a8f366e Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 12 Nov 2025 14:38:53 +0100 Subject: [PATCH 14/17] wip --- .github/workflows/tests.yaml | 4 ++++ composer.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7ad3442b..f8d14763 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -153,6 +153,10 @@ jobs: - name: Setup Problem Matchers for PHPUnit run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + # These dependencies are not used running the tests but can cause deprecation warnings so we remove them before running the tests + - name: Remove unused dependencies + run: composer remove vimeo/psalm phpstan/phpstan friendsofphp/php-cs-fixer --dev --no-interaction --no-update + - name: Remove optional packages run: composer remove doctrine/dbal doctrine/doctrine-bundle symfony/messenger symfony/twig-bundle symfony/cache symfony/http-client --dev --no-update diff --git a/composer.json b/composer.json index a6e14f91..4caf0a1a 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "php": "^7.2||^8.0", "guzzlehttp/psr7": "^2.1.1", "jean85/pretty-package-versions": "^1.5||^2.0", - "sentry/sentry": "4.18", + "sentry/sentry": "^4.18", "symfony/cache-contracts": "^1.1||^2.4||^3.0", "symfony/config": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", "symfony/console": "^4.4.20||^5.0.11||^6.0||^7.0||^8.0", From e5197cbeaca0fad5f4e7b7939b729dd0e576f77f Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 12 Nov 2025 15:12:42 +0100 Subject: [PATCH 15/17] wip --- src/DependencyInjection/Configuration.php | 14 +++++++++++++- src/Tracing/Cache/TraceableCacheAdapterTrait.php | 7 ++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index d0282878..3719262e 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -9,6 +9,7 @@ use Symfony\Bundle\TwigBundle\TwigBundle; use Symfony\Component\Cache\CacheItem; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Builder\NodeParentInterface; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; use Symfony\Component\HttpClient\HttpClient; @@ -19,12 +20,14 @@ final class Configuration implements ConfigurationInterface { /** * {@inheritdoc} + * + * @phpstan-return TreeBuilder<'array'> */ public function getConfigTreeBuilder(): TreeBuilder { $treeBuilder = new TreeBuilder('sentry'); - /** @var ArrayNodeDefinition $rootNode */ + /** @phpstan-var ArrayNodeDefinition $rootNode */ $rootNode = method_exists(TreeBuilder::class, 'getRootNode') ? $treeBuilder->getRootNode() : $treeBuilder->root('sentry'); @@ -38,6 +41,7 @@ public function getConfigTreeBuilder(): TreeBuilder $inAppExcludes[] = '%kernel.build_dir%'; } + // @phpstan-ignore-next-line $rootNode ->children() ->scalarNode('dsn') @@ -176,8 +180,12 @@ public function getConfigTreeBuilder(): TreeBuilder return $treeBuilder; } + /** + * @phpstan-param ArrayNodeDefinition $rootNode + */ private function addMessengerSection(ArrayNodeDefinition $rootNode): void { + // @phpstan-ignore-next-line $rootNode ->children() ->arrayNode('messenger') @@ -190,8 +198,12 @@ private function addMessengerSection(ArrayNodeDefinition $rootNode): void ->end(); } + /** + * @phpstan-param ArrayNodeDefinition $rootNode + */ private function addDistributedTracingSection(ArrayNodeDefinition $rootNode): void { + // @phpstan-ignore-next-line $rootNode ->children() ->arrayNode('tracing') diff --git a/src/Tracing/Cache/TraceableCacheAdapterTrait.php b/src/Tracing/Cache/TraceableCacheAdapterTrait.php index 6e7274f0..1d838f20 100644 --- a/src/Tracing/Cache/TraceableCacheAdapterTrait.php +++ b/src/Tracing/Cache/TraceableCacheAdapterTrait.php @@ -46,6 +46,7 @@ public function getItem($key): CacheItem /** * {@inheritdoc} + * @return iterable */ public function getItems(array $keys = []): iterable { @@ -223,9 +224,9 @@ private function traceFunction(string $spanOperation, \Closure $callback, ?strin * * Use this method if you want to instrument {@see CacheInterface::get()}. * - * @param string $key - * @param callable $callback - * @param float|null $beta + * @param string $key + * @param callable $callback + * @param float|null $beta * @param array|null $metadata * * @return mixed From 9fe5d78ceb4037b8c3aee872be6d7cd395b32491 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 12 Nov 2025 15:14:59 +0100 Subject: [PATCH 16/17] wip --- src/Tracing/Cache/TraceableCacheAdapterTrait.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Tracing/Cache/TraceableCacheAdapterTrait.php b/src/Tracing/Cache/TraceableCacheAdapterTrait.php index 1d838f20..ce93ca13 100644 --- a/src/Tracing/Cache/TraceableCacheAdapterTrait.php +++ b/src/Tracing/Cache/TraceableCacheAdapterTrait.php @@ -46,10 +46,13 @@ public function getItem($key): CacheItem /** * {@inheritdoc} - * @return iterable + * + * @psalm-return iterable + * @phpstan-return iterable */ public function getItems(array $keys = []): iterable { + /** @psalm-return iterable */ return $this->traceFunction('cache.get', function () use ($keys): iterable { return $this->decoratedAdapter->getItems($keys); }); @@ -224,9 +227,9 @@ private function traceFunction(string $spanOperation, \Closure $callback, ?strin * * Use this method if you want to instrument {@see CacheInterface::get()}. * - * @param string $key - * @param callable $callback - * @param float|null $beta + * @param string $key + * @param callable $callback + * @param float|null $beta * @param array|null $metadata * * @return mixed From b2cc29360462c3e5f9e29bca6d88c722e52e2018 Mon Sep 17 00:00:00 2001 From: Martin Linzmayer Date: Wed, 12 Nov 2025 15:16:36 +0100 Subject: [PATCH 17/17] cs --- src/Tracing/Cache/TraceableCacheAdapterTrait.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Tracing/Cache/TraceableCacheAdapterTrait.php b/src/Tracing/Cache/TraceableCacheAdapterTrait.php index ce93ca13..42a80292 100644 --- a/src/Tracing/Cache/TraceableCacheAdapterTrait.php +++ b/src/Tracing/Cache/TraceableCacheAdapterTrait.php @@ -47,12 +47,13 @@ public function getItem($key): CacheItem /** * {@inheritdoc} * - * @psalm-return iterable - * @phpstan-return iterable + * @phpstan-return iterable + * + * @psalm-return iterable */ public function getItems(array $keys = []): iterable { - /** @psalm-return iterable */ + /** @psalm-return iterable */ return $this->traceFunction('cache.get', function () use ($keys): iterable { return $this->decoratedAdapter->getItems($keys); });