From fed99128f0b0fbec518ea60ffbc2d37825137557 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Wed, 15 Oct 2025 18:49:09 +0800 Subject: [PATCH 1/5] refactor(sentry): extract setup logic to dedicated listener - Move Sentry initialization logic from EventHandleListener to new SetupSentryListener - Remove BootApplication event handling and setupRequestLifecycle/setupRedisEventEnable methods from EventHandleListener - Add logs_channel_level configuration option to sentry.php config file - Register logs_channel_level in ClientBuilderFactory's user options - Simplify EventHandleListener by focusing only on runtime event handling This refactoring improves separation of concerns by moving one-time setup logic to a dedicated listener, making the code more maintainable and easier to understand. --- src/sentry/publish/sentry.php | 2 + .../src/Factory/ClientBuilderFactory.php | 1 + .../src/Listener/EventHandleListener.php | 104 ------------- .../src/Listener/SetupSentryListener.php | 141 ++++++++++++++++++ 4 files changed, 144 insertions(+), 104 deletions(-) create mode 100644 src/sentry/src/Listener/SetupSentryListener.php diff --git a/src/sentry/publish/sentry.php b/src/sentry/publish/sentry.php index f80883b41..1718ebb31 100644 --- a/src/sentry/publish/sentry.php +++ b/src/sentry/publish/sentry.php @@ -43,6 +43,8 @@ // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#enable_logs 'enable_logs' => env('SENTRY_ENABLE_LOGS', false), + 'logs_channel_level' => env('SENTRY_LOGS_CHANNEL_LEVEL', Sentry\Logs\LogLevel::debug()), + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#send_default_pii 'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false), diff --git a/src/sentry/src/Factory/ClientBuilderFactory.php b/src/sentry/src/Factory/ClientBuilderFactory.php index dacc35106..71cd4ac05 100644 --- a/src/sentry/src/Factory/ClientBuilderFactory.php +++ b/src/sentry/src/Factory/ClientBuilderFactory.php @@ -30,6 +30,7 @@ class ClientBuilderFactory 'integrations', 'http_chanel_size', // deprecated, will be removed in v3.2 'http_concurrent_limit', // deprecated, will be removed in v3.2 + 'logs_channel_level', 'transport_channel_size', 'transport_concurrent_limit', 'tracing', diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 616c9a09c..387450537 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -22,15 +22,11 @@ use Hyperf\Database\Events as DbEvent; use Hyperf\DbConnection\Pool\PoolFactory as DbPoolFactory; use Hyperf\Event\Contract\ListenerInterface; -use Hyperf\Framework\Event\BootApplication; use Hyperf\HttpServer\Event as HttpEvent; -use Hyperf\HttpServer\Server as HttpServer; use Hyperf\Kafka\Event as KafkaEvent; use Hyperf\Redis\Event as RedisEvent; use Hyperf\Redis\Pool\PoolFactory as RedisPoolFactory; use Hyperf\RpcServer\Event as RpcEvent; -use Hyperf\RpcServer\Server as RpcServer; -use Hyperf\Server\Event; use Psr\Container\ContainerInterface; use Sentry\Breadcrumb; use Sentry\SentrySdk; @@ -45,43 +41,6 @@ */ class EventHandleListener implements ListenerInterface { - protected array $missingKeys = [ - // Enable - 'sentry.enable.amqp', - 'sentry.enable.async_queue', - 'sentry.enable.command', - 'sentry.enable.crontab', - 'sentry.enable.kafka', - 'sentry.enable.request', - // Breadcrumbs - 'sentry.breadcrumbs.cache', - 'sentry.breadcrumbs.sql_queries', - 'sentry.breadcrumbs.sql_bindings', - 'sentry.breadcrumbs.sql_transaction', - 'sentry.breadcrumbs.redis', - 'sentry.breadcrumbs.guzzle', - 'sentry.breadcrumbs.logs', - // Tracing - 'sentry.enable_tracing', - // Enable for tracing integrations - 'sentry.tracing.enable.amqp', - 'sentry.tracing.enable.async_queue', - 'sentry.tracing.enable.cache', - 'sentry.tracing.enable.command', - 'sentry.tracing.enable.crontab', - 'sentry.tracing.enable.kafka', - 'sentry.tracing.enable.request', - // Enable for tracing Spans - 'sentry.tracing.spans.cache', - 'sentry.tracing.spans.coroutine', - 'sentry.tracing.spans.db', - 'sentry.tracing.spans.elasticsearch', - 'sentry.tracing.spans.guzzle', - 'sentry.tracing.spans.rpc', - 'sentry.tracing.spans.redis', - 'sentry.tracing.spans.sql_queries', - ]; - public function __construct( protected ContainerInterface $container, protected Feature $feature, @@ -93,9 +52,6 @@ public function __construct( public function listen(): array { return [ - // Framework events - BootApplication::class, - // Database events DbEvent\QueryExecuted::class, DbEvent\TransactionBeginning::class, @@ -142,9 +98,6 @@ public function listen(): array public function process(object $event): void { match ($event::class) { - // Boot application events - BootApplication::class => $this->handleBootApplication($event), - // Database events DbEvent\QueryExecuted::class => $this->handleDbQueryExecuted($event), DbEvent\TransactionBeginning::class, @@ -206,63 +159,6 @@ protected function captureException(?Throwable $throwable): void } } - /** - * @param BootApplication $event - */ - protected function handleBootApplication(object $event): void - { - $this->setupRequestLifecycle(); - $this->setupRedisEventEnable(); - } - - protected function setupRequestLifecycle(): void - { - foreach ($this->missingKeys as $key) { - if (! $this->config->has($key)) { - $this->config->set($key, true); - } - } - - if ( - ! $this->feature->isEnabled('request') - && ! $this->feature->isTracingEnabled('request') - ) { - return; - } - - $servers = $this->config->get('server.servers', []); - - foreach ($servers as &$server) { - $callbacks = $server['callbacks'] ?? []; - $handler = $callbacks[Event::ON_REQUEST][0] ?? $callbacks[Event::ON_RECEIVE][0] ?? null; - - if (! $handler) { - continue; - } - - if ( - is_a($handler, HttpServer::class, true) - || is_a($handler, RpcServer::class, true) - ) { - $server['options'] ??= []; - $server['options']['enable_request_lifecycle'] = true; - } - } - - $this->config->set('server.servers', $servers); - } - - protected function setupRedisEventEnable(): void - { - if (! $this->config->has('redis')) { - return; - } - - foreach ($this->config->get('redis', []) as $pool => $_) { - $this->config->set("redis.{$pool}.event.enable", true); - } - } - /** * @param DbEvent\QueryExecuted $event */ diff --git a/src/sentry/src/Listener/SetupSentryListener.php b/src/sentry/src/Listener/SetupSentryListener.php new file mode 100644 index 000000000..9ba7f99c0 --- /dev/null +++ b/src/sentry/src/Listener/SetupSentryListener.php @@ -0,0 +1,141 @@ +setupRequestLifecycle(); + $this->setupRedisEventEnable(); + $this->registerLoggerChannel(); + } + + protected function registerLoggerChannel(): void + { + if ($this->config->has('logger.sentry_logs')) { + return; + } + + $this->config->set('logger.sentry_logs', [ + 'handler' => LogsHandler::class, + 'constructor' => [ + 'group' => 'default', + 'logLevel' => $this->config->get('sentry.logs_channel_level'), + 'bubble' => true, + ], + 'formatter' => null, + 'processors' => [], + ]); + } + + protected function setupRequestLifecycle(): void + { + foreach (self::MISSING_KEYS as $key) { + if (! $this->config->has($key)) { + $this->config->set($key, true); + } + } + + if (! $this->feature->isEnabled('request') && ! $this->feature->isTracingEnabled('request')) { + return; + } + + $servers = $this->config->get('server.servers', []); + + foreach ($servers as &$server) { + $callbacks = $server['callbacks'] ?? []; + $handler = $callbacks[Event::ON_REQUEST][0] ?? $callbacks[Event::ON_RECEIVE][0] ?? null; + + if (! $handler) { + continue; + } + + if (is_a($handler, HttpServer::class, true) || is_a($handler, RpcServer::class, true)) { + $server['options'] ??= []; + $server['options']['enable_request_lifecycle'] = true; + } + } + + $this->config->set('server.servers', $servers); + } + + protected function setupRedisEventEnable(): void + { + if (! $this->config->has('redis')) { + return; + } + + foreach ($this->config->get('redis', []) as $pool => $_) { + $this->config->set("redis.{$pool}.event.enable", true); + } + } +} From 73b9f1f5809a645454c8418ff7f24c823bb4ea99 Mon Sep 17 00:00:00 2001 From: Deeka Wong Date: Thu, 16 Oct 2025 06:55:03 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20SetupSentryListener.ph?= =?UTF-8?q?p?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/SetupSentryListener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/src/Listener/SetupSentryListener.php b/src/sentry/src/Listener/SetupSentryListener.php index 9ba7f99c0..dadad16ea 100644 --- a/src/sentry/src/Listener/SetupSentryListener.php +++ b/src/sentry/src/Listener/SetupSentryListener.php @@ -88,7 +88,7 @@ protected function registerLoggerChannel(): void $this->config->set('logger.sentry_logs', [ 'handler' => LogsHandler::class, 'constructor' => [ - 'group' => 'default', + 'group' => 'sentry_logs', 'logLevel' => $this->config->get('sentry.logs_channel_level'), 'bubble' => true, ], From 90182327e21ab3642293cfb9284d753d41b7391a Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Thu, 16 Oct 2025 08:03:52 +0800 Subject: [PATCH 3/5] fix(sentry): update log channel registration condition to respect config setting --- src/sentry/src/Listener/SetupSentryListener.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sentry/src/Listener/SetupSentryListener.php b/src/sentry/src/Listener/SetupSentryListener.php index dadad16ea..77fb9f77c 100644 --- a/src/sentry/src/Listener/SetupSentryListener.php +++ b/src/sentry/src/Listener/SetupSentryListener.php @@ -81,7 +81,10 @@ public function process(object $event): void protected function registerLoggerChannel(): void { - if ($this->config->has('logger.sentry_logs')) { + if ( + ! $this->config->get('sentry.enable_logs', true) + || $this->config->has('logger.sentry_logs') + ) { return; } From f73c1bbd0a1e48a76e8a2419c9740e72ced83b1d Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Thu, 16 Oct 2025 08:05:10 +0800 Subject: [PATCH 4/5] refactor(sentry): improve readability of request feature check condition --- src/sentry/src/Listener/SetupSentryListener.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sentry/src/Listener/SetupSentryListener.php b/src/sentry/src/Listener/SetupSentryListener.php index 77fb9f77c..eac869bac 100644 --- a/src/sentry/src/Listener/SetupSentryListener.php +++ b/src/sentry/src/Listener/SetupSentryListener.php @@ -108,7 +108,10 @@ protected function setupRequestLifecycle(): void } } - if (! $this->feature->isEnabled('request') && ! $this->feature->isTracingEnabled('request')) { + if ( + ! $this->feature->isEnabled('request') + && ! $this->feature->isTracingEnabled('request') + ) { return; } From cc5ba2bc36b528ba4a426fc42d7ab88ea13cfe16 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Thu, 16 Oct 2025 09:18:33 +0800 Subject: [PATCH 5/5] fix(sentry): update logger configuration to use 'logger.sentry' instead of 'logger.sentry_logs' --- src/sentry/src/Listener/SetupSentryListener.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sentry/src/Listener/SetupSentryListener.php b/src/sentry/src/Listener/SetupSentryListener.php index eac869bac..00dd73000 100644 --- a/src/sentry/src/Listener/SetupSentryListener.php +++ b/src/sentry/src/Listener/SetupSentryListener.php @@ -83,15 +83,15 @@ protected function registerLoggerChannel(): void { if ( ! $this->config->get('sentry.enable_logs', true) - || $this->config->has('logger.sentry_logs') + || $this->config->has('logger.sentry') ) { return; } - $this->config->set('logger.sentry_logs', [ + $this->config->set('logger.sentry', [ 'handler' => LogsHandler::class, 'constructor' => [ - 'group' => 'sentry_logs', + 'group' => 'sentry', 'logLevel' => $this->config->get('sentry.logs_channel_level'), 'bubble' => true, ],