diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index ca10df03..b5fc72d0 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -33,6 +33,7 @@ jobs: - 5.* - 6.* - 7.* + - 8.0 dependencies: - highest exclude: @@ -54,6 +55,20 @@ jobs: symfony-version: 7.* - php: '8.4' symfony-version: 4.4.* + - php: '7.2' + symfony-version: 8.0 + - php: '7.3' + symfony-version: 8.0 + - php: '7.4' + symfony-version: 8.0 + - php: '8.0' + symfony-version: 8.0 + - php: '8.1' + symfony-version: 8.0 + - php: '8.2' + symfony-version: 8.0 + - php: '8.3' + symfony-version: 8.0 include: - php: '7.2' symfony-version: 4.4.* @@ -84,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 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 @@ -122,6 +143,7 @@ jobs: symfony-version: 4.4.* - php: '8.4' dependencies: highest + symfony-version: 8.0.*@dev steps: - name: Checkout @@ -140,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 beta + composer config prefer-stable true + - name: Install dependencies uses: ramsey/composer-install@v3 with: diff --git a/composer.json b/composer.json index 1413636e..11ea8a74 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": false, "license": "MIT", "authors": [ { @@ -15,19 +17,19 @@ "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", - "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", @@ -35,19 +37,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/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/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||^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", + "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/DependencyInjection/SentryExtension.php b/src/DependencyInjection/SentryExtension.php index 510638be..d752813c 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\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/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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 index e54808e2..fed6dcb8 100644 --- a/tests/DependencyInjection/XmlSentryExtensionTest.php +++ b/tests/DependencyInjection/XmlSentryExtensionTest.php @@ -12,6 +12,9 @@ final class XmlSentryExtensionTest extends SentryExtensionTest { protected function loadFixture(ContainerBuilder $container, string $fixtureFile): void { + if (!class_exists(XmlFileLoader::class)) { + $this->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'); } 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