From d267cfc793affa05e43e3e09216e5883c6b2530b Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:04:06 +0800 Subject: [PATCH 01/29] refactor(sentry): consolidate event listeners into unified EventListener - Replace 11 separate listener classes with single EventListener class - Consolidate all event handling logic into centralized match statement - Merge functionality from deleted listeners: - AmqpExceptionListener, AsyncQueueExceptionListener - CaptureExceptionListener, CommandExceptionListener - CrontabExceptionListener, DbQueryListener - KafkaExceptionListener, RedisCommandExecutedListener - RequestExceptionListener, SetRedisEventEnableListener - SetRequestLifecycleListener - Improve code maintainability and reduce duplication - Preserve all existing functionality and event handling behavior --- src/sentry/src/ConfigProvider.php | 11 +- .../src/Listener/AmqpExceptionListener.php | 47 -- .../Listener/AsyncQueueExceptionListener.php | 50 -- .../src/Listener/CaptureExceptionListener.php | 69 --- .../src/Listener/CommandExceptionListener.php | 42 -- .../src/Listener/CrontabExceptionListener.php | 52 -- src/sentry/src/Listener/DbQueryListener.php | 102 ---- src/sentry/src/Listener/EventListener.php | 497 ++++++++++++++++++ .../src/Listener/KafkaExceptionListener.php | 47 -- .../Listener/RedisCommandExecutedListener.php | 57 -- .../src/Listener/RequestExceptionListener.php | 51 -- .../Listener/SetRedisEventEnableListener.php | 41 -- .../Listener/SetRequestLifecycleListener.php | 104 ---- 13 files changed, 498 insertions(+), 672 deletions(-) delete mode 100644 src/sentry/src/Listener/AmqpExceptionListener.php delete mode 100644 src/sentry/src/Listener/AsyncQueueExceptionListener.php delete mode 100644 src/sentry/src/Listener/CaptureExceptionListener.php delete mode 100644 src/sentry/src/Listener/CommandExceptionListener.php delete mode 100644 src/sentry/src/Listener/CrontabExceptionListener.php delete mode 100644 src/sentry/src/Listener/DbQueryListener.php create mode 100644 src/sentry/src/Listener/EventListener.php delete mode 100644 src/sentry/src/Listener/KafkaExceptionListener.php delete mode 100644 src/sentry/src/Listener/RedisCommandExecutedListener.php delete mode 100644 src/sentry/src/Listener/RequestExceptionListener.php delete mode 100644 src/sentry/src/Listener/SetRedisEventEnableListener.php delete mode 100644 src/sentry/src/Listener/SetRequestLifecycleListener.php diff --git a/src/sentry/src/ConfigProvider.php b/src/sentry/src/ConfigProvider.php index a56a7c2b2..644e4e59a 100644 --- a/src/sentry/src/ConfigProvider.php +++ b/src/sentry/src/ConfigProvider.php @@ -51,16 +51,7 @@ public function __invoke(): array \Sentry\Transport\TransportInterface::class => Transport\CoHttpTransport::class, ], 'listeners' => [ - Listener\AmqpExceptionListener::class, - Listener\AsyncQueueExceptionListener::class, - Listener\CommandExceptionListener::class, - Listener\CrontabExceptionListener::class, - Listener\DbQueryListener::class, - Listener\KafkaExceptionListener::class, - Listener\RedisCommandExecutedListener::class, - Listener\RequestExceptionListener::class, - Listener\SetRedisEventEnableListener::class, - Listener\SetRequestLifecycleListener::class, + Listener\EventListener::class, Crons\Listener\CronEventListener::class, Tracing\Listener\TracingAmqpListener::class, Tracing\Listener\TracingAsyncQueueListener::class, diff --git a/src/sentry/src/Listener/AmqpExceptionListener.php b/src/sentry/src/Listener/AmqpExceptionListener.php deleted file mode 100644 index 592e93703..000000000 --- a/src/sentry/src/Listener/AmqpExceptionListener.php +++ /dev/null @@ -1,47 +0,0 @@ -switcher->isEnable('amqp')) { - return; - } - - match ($event::class) { - Event\FailToConsume::class => $this->captureException($event->getThrowable()), - default => $this->setupSentrySdk(), - }; - - match ($event::class) { - Event\AfterConsume::class, - Event\FailToConsume::class => $this->flushEvents(), - default => null, - }; - } -} diff --git a/src/sentry/src/Listener/AsyncQueueExceptionListener.php b/src/sentry/src/Listener/AsyncQueueExceptionListener.php deleted file mode 100644 index ae0b1551b..000000000 --- a/src/sentry/src/Listener/AsyncQueueExceptionListener.php +++ /dev/null @@ -1,50 +0,0 @@ -switcher->isEnable('async_queue')) { - return; - } - - match ($event::class) { - Event\RetryHandle::class, - Event\FailedHandle::class => $this->captureException($event->getThrowable()), - default => $this->setupSentrySdk(), - }; - - match ($event::class) { - Event\AfterHandle::class, - Event\RetryHandle::class, - Event\FailedHandle::class => $this->flushEvents(), - default => null, - }; - } -} diff --git a/src/sentry/src/Listener/CaptureExceptionListener.php b/src/sentry/src/Listener/CaptureExceptionListener.php deleted file mode 100644 index 1f56dd7e3..000000000 --- a/src/sentry/src/Listener/CaptureExceptionListener.php +++ /dev/null @@ -1,69 +0,0 @@ -captureException($throwable); - } catch (Throwable $e) { - $this->container->get(StdoutLoggerInterface::class)->error((string) $e); - } finally { - $hub->getClient()?->flush(); - } - } - - protected function setupSentrySdk(): void - { - if (Context::has(static::SETUP)) { - if ($this->container->has(StdoutLoggerInterface::class)) { - $this->container->get(StdoutLoggerInterface::class)->warning('SentrySdk has been setup.'); - } - - return; - } - - SentrySdk::init(); - Context::set(static::SETUP, true); - } - - protected function flushEvents(): void - { - Integration::flushEvents(); - } -} diff --git a/src/sentry/src/Listener/CommandExceptionListener.php b/src/sentry/src/Listener/CommandExceptionListener.php deleted file mode 100644 index 76f186416..000000000 --- a/src/sentry/src/Listener/CommandExceptionListener.php +++ /dev/null @@ -1,42 +0,0 @@ -switcher->isEnable('command')) { - return; - } - - match ($event::class) { - Event\FailToHandle::class => $this->captureException($event->getThrowable()), - Event\AfterExecute::class => $this->flushEvents(), - default => $this->setupSentrySdk(), - }; - } -} diff --git a/src/sentry/src/Listener/CrontabExceptionListener.php b/src/sentry/src/Listener/CrontabExceptionListener.php deleted file mode 100644 index 0b09fcbe9..000000000 --- a/src/sentry/src/Listener/CrontabExceptionListener.php +++ /dev/null @@ -1,52 +0,0 @@ -switcher->isEnable('crontab')) { - return; - } - - match ($event::class) { - Event\FailToExecute::class => $this->captureException($event->throwable), - default => $this->setupSentrySdk(), - }; - - match ($event::class) { - Event\AfterExecute::class, - Event\FailToExecute::class => $this->flushEvents(), - default => null, - }; - } -} diff --git a/src/sentry/src/Listener/DbQueryListener.php b/src/sentry/src/Listener/DbQueryListener.php deleted file mode 100644 index b3ae769a9..000000000 --- a/src/sentry/src/Listener/DbQueryListener.php +++ /dev/null @@ -1,102 +0,0 @@ - $this->queryExecutedHandler($event), - $event instanceof TransactionBeginning => $this->transactionHandler($event), - $event instanceof TransactionCommitted => $this->transactionHandler($event), - $event instanceof TransactionRolledBack => $this->transactionHandler($event), - default => null - }; - } - - /** - * @param object|QueryExecuted $event - */ - protected function queryExecutedHandler(object $event): void - { - if (! $this->switcher->isBreadcrumbEnable('sql_queries')) { - return; - } - - $data = ['connectionName' => $event->connectionName]; - - if ($event->time !== null) { - $data['executionTimeMs'] = $event->time; - } - - if ($this->switcher->isBreadcrumbEnable('sql_bindings')) { - $data['bindings'] = $event->bindings; - } - - Integration::addBreadcrumb(new Breadcrumb( - Breadcrumb::LEVEL_INFO, - Breadcrumb::TYPE_DEFAULT, - 'sql.query', - $event->sql, - $data - )); - } - - /** - * @param ConnectionEvent|object $event - */ - protected function transactionHandler(object $event): void - { - if (! $this->switcher->isBreadcrumbEnable('sql_transaction')) { - return; - } - - $data = [ - 'connectionName' => $event->connectionName, - ]; - - Integration::addBreadcrumb(new Breadcrumb( - Breadcrumb::LEVEL_INFO, - Breadcrumb::TYPE_DEFAULT, - 'sql.transaction', - $event::class, - $data - )); - } -} diff --git a/src/sentry/src/Listener/EventListener.php b/src/sentry/src/Listener/EventListener.php new file mode 100644 index 000000000..878bbc629 --- /dev/null +++ b/src/sentry/src/Listener/EventListener.php @@ -0,0 +1,497 @@ + $this->handleBootApplication($event), + + // Database events + QueryExecuted::class => $this->handleDbQuery($event), + TransactionBeginning::class, + TransactionCommitted::class, + TransactionRolledBack::class => $this->handleDbTransaction($event), + + // Redis events + CommandExecuted::class => $this->handleRedisCommand($event), + + // Request events + RequestReceived::class, + RpcRequestReceived::class => $this->handleRequestReceived($event), + RequestTerminated::class, + RpcRequestTerminated::class => $this->handleRequestTerminated($event), + + // Command events + CommandEvent\BeforeHandle::class => $this->handleCommandBefore($event), + CommandEvent\FailToHandle::class => $this->handleCommandFail($event), + CommandEvent\AfterExecute::class => $this->handleCommandAfter($event), + + // Async Queue events + AsyncQueueEvent\BeforeHandle::class => $this->handleAsyncQueueBefore($event), + AsyncQueueEvent\AfterHandle::class => $this->handleAsyncQueueAfter($event), + AsyncQueueEvent\RetryHandle::class => $this->handleAsyncQueueRetry($event), + AsyncQueueEvent\FailedHandle::class => $this->handleAsyncQueueFailed($event), + + // Crontab events + CrontabEvent\BeforeExecute::class => $this->handleCrontabBefore($event), + CrontabEvent\AfterExecute::class => $this->handleCrontabAfter($event), + CrontabEvent\FailToExecute::class => $this->handleCrontabFail($event), + + // AMQP events + AmqpEvent\BeforeConsume::class => $this->handleAmqpBefore($event), + AmqpEvent\AfterConsume::class => $this->handleAmqpAfter($event), + AmqpEvent\FailToConsume::class => $this->handleAmqpFail($event), + + // Kafka events + KafkaEvent\BeforeConsume::class => $this->handleKafkaBefore($event), + KafkaEvent\AfterConsume::class => $this->handleKafkaAfter($event), + KafkaEvent\FailToConsume::class => $this->handleKafkaFail($event), + + default => null, + }; + } + + protected function captureException($throwable): void + { + if (! $throwable instanceof Throwable) { + return; + } + + $hub = SentrySdk::getCurrentHub(); + + try { + $hub->captureException($throwable); + } catch (Throwable $e) { + $this->container->get(StdoutLoggerInterface::class)->error((string) $e); + } finally { + $hub->getClient()?->flush(); + } + } + + protected function setupSentrySdk(): void + { + Context::getOrSet(static::SETUP, fn () => SentrySdk::init()); + } + + protected function flushEvents(): void + { + Integration::flushEvents(); + } + + protected function handleBootApplication(object $event): void + { + $this->setupRequestLifecycle(); + $this->setupRedisEventEnable(); + } + + protected function setupRequestLifecycle(): void + { + $keys = [ + 'sentry.enable.amqp', + 'sentry.enable.async_queue', + 'sentry.enable.command', + 'sentry.enable.crontab', + 'sentry.enable.kafka', + 'sentry.enable.request', + 'sentry.breadcrumbs.cache', + 'sentry.breadcrumbs.sql_queries', + 'sentry.breadcrumbs.sql_bindings', + 'sentry.breadcrumbs.sql_transaction', + 'sentry.breadcrumbs.redis', + 'sentry.breadcrumbs.guzzle', + 'sentry.breadcrumbs.logs', + 'sentry.enable_tracing', + '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', + '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', + ]; + + foreach ($keys as $key) { + if (! $this->config->has($key)) { + $this->config->set($key, true); + } + } + + if ( + ! $this->switcher->isEnable('request') + && ! $this->switcher->isTracingEnable('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); + } + } + + protected function handleDbQuery(object $event): void + { + if (! $this->switcher->isBreadcrumbEnable('sql_queries')) { + return; + } + + $data = ['connectionName' => $event->connectionName]; + + if ($event->time !== null) { + $data['executionTimeMs'] = $event->time; + } + + if ($this->switcher->isBreadcrumbEnable('sql_bindings')) { + $data['bindings'] = $event->bindings; + } + + Integration::addBreadcrumb(new Breadcrumb( + Breadcrumb::LEVEL_INFO, + Breadcrumb::TYPE_DEFAULT, + 'sql.query', + $event->sql, + $data + )); + } + + protected function handleDbTransaction(object $event): void + { + if (! $this->switcher->isBreadcrumbEnable('sql_transaction')) { + return; + } + + $data = ['connectionName' => $event->connectionName]; + + Integration::addBreadcrumb(new Breadcrumb( + Breadcrumb::LEVEL_INFO, + Breadcrumb::TYPE_DEFAULT, + 'sql.transaction', + $event::class, + $data + )); + } + + protected function handleRedisCommand(object $event): void + { + if ( + ! $this->switcher->isBreadcrumbEnable('redis') + || ! $event instanceof CommandExecuted + ) { + return; + } + + Integration::addBreadcrumb(new Breadcrumb( + Breadcrumb::LEVEL_INFO, + Breadcrumb::TYPE_DEFAULT, + 'redis', + $event->command, + [ + 'arguments' => $event->parameters, + 'result' => $event->result, + 'duration' => $event->time * 1000, + ] + )); + } + + protected function handleRequestReceived(object $event): void + { + if (! $this->switcher->isEnable('request')) { + return; + } + + $this->setupSentrySdk(); + } + + protected function handleRequestTerminated(object $event): void + { + if (! $this->switcher->isEnable('request')) { + return; + } + + $this->captureException($event->exception); + $this->flushEvents(); + } + + protected function handleCommandBefore(object $event): void + { + if (! $this->switcher->isEnable('command')) { + return; + } + + $this->setupSentrySdk(); + } + + protected function handleCommandFail(object $event): void + { + if (! $this->switcher->isEnable('command')) { + return; + } + + $this->captureException($event->getThrowable()); + } + + protected function handleCommandAfter(object $event): void + { + if (! $this->switcher->isEnable('command')) { + return; + } + + $this->flushEvents(); + } + + protected function handleAsyncQueueBefore(object $event): void + { + if (! $this->switcher->isEnable('async_queue')) { + return; + } + + $this->setupSentrySdk(); + } + + protected function handleAsyncQueueAfter(object $event): void + { + if (! $this->switcher->isEnable('async_queue')) { + return; + } + + $this->flushEvents(); + } + + protected function handleAsyncQueueRetry(object $event): void + { + if (! $this->switcher->isEnable('async_queue')) { + return; + } + + $this->captureException($event->getThrowable()); + $this->flushEvents(); + } + + protected function handleAsyncQueueFailed(object $event): void + { + if (! $this->switcher->isEnable('async_queue')) { + return; + } + + $this->captureException($event->getThrowable()); + $this->flushEvents(); + } + + protected function handleCrontabBefore(object $event): void + { + if (! $this->switcher->isEnable('crontab')) { + return; + } + + $this->setupSentrySdk(); + } + + protected function handleCrontabAfter(object $event): void + { + if (! $this->switcher->isEnable('crontab')) { + return; + } + + $this->flushEvents(); + } + + protected function handleCrontabFail(object $event): void + { + if (! $this->switcher->isEnable('crontab')) { + return; + } + + $this->captureException($event->throwable); + $this->flushEvents(); + } + + protected function handleAmqpBefore(object $event): void + { + if (! $this->switcher->isEnable('amqp')) { + return; + } + + $this->setupSentrySdk(); + } + + protected function handleAmqpAfter(object $event): void + { + if (! $this->switcher->isEnable('amqp')) { + return; + } + + $this->flushEvents(); + } + + protected function handleAmqpFail(object $event): void + { + if (! $this->switcher->isEnable('amqp')) { + return; + } + + $this->captureException($event->getThrowable()); + $this->flushEvents(); + } + + protected function handleKafkaBefore(object $event): void + { + if (! $this->switcher->isEnable('kafka')) { + return; + } + + $this->setupSentrySdk(); + } + + protected function handleKafkaAfter(object $event): void + { + if (! $this->switcher->isEnable('kafka')) { + return; + } + + $this->flushEvents(); + } + + protected function handleKafkaFail(object $event): void + { + if (! $this->switcher->isEnable('kafka')) { + return; + } + + $this->captureException($event->getThrowable()); + $this->flushEvents(); + } +} diff --git a/src/sentry/src/Listener/KafkaExceptionListener.php b/src/sentry/src/Listener/KafkaExceptionListener.php deleted file mode 100644 index 6a4f4a2b9..000000000 --- a/src/sentry/src/Listener/KafkaExceptionListener.php +++ /dev/null @@ -1,47 +0,0 @@ -switcher->isEnable('kafka')) { - return; - } - - match ($event::class) { - Event\FailToConsume::class => $this->captureException($event->getThrowable()), - default => $this->setupSentrySdk(), - }; - - match ($event::class) { - Event\AfterConsume::class, - Event\FailToConsume::class => $this->flushEvents(), - default => null, - }; - } -} diff --git a/src/sentry/src/Listener/RedisCommandExecutedListener.php b/src/sentry/src/Listener/RedisCommandExecutedListener.php deleted file mode 100644 index 218feec12..000000000 --- a/src/sentry/src/Listener/RedisCommandExecutedListener.php +++ /dev/null @@ -1,57 +0,0 @@ -switcher->isBreadcrumbEnable('redis') - || ! $event instanceof CommandExecuted - ) { - return; - } - - Integration::addBreadcrumb(new Breadcrumb( - Breadcrumb::LEVEL_INFO, - Breadcrumb::TYPE_DEFAULT, - 'redis', - $event->command, - [ - 'arguments' => $event->parameters, - 'result' => $event->result, - 'duration' => $event->time * 1000, - ] - )); - } -} diff --git a/src/sentry/src/Listener/RequestExceptionListener.php b/src/sentry/src/Listener/RequestExceptionListener.php deleted file mode 100644 index 58f82d4fa..000000000 --- a/src/sentry/src/Listener/RequestExceptionListener.php +++ /dev/null @@ -1,51 +0,0 @@ -switcher->isEnable('request')) { - return; - } - - match ($event::class) { - RequestTerminated::class, RpcRequestTerminated::class => $this->captureException($event->exception), - default => $this->setupSentrySdk(), - }; - - match ($event::class) { - RequestTerminated::class, - RpcRequestTerminated::class => $this->flushEvents(), - default => null, - }; - } -} diff --git a/src/sentry/src/Listener/SetRedisEventEnableListener.php b/src/sentry/src/Listener/SetRedisEventEnableListener.php deleted file mode 100644 index 14608ab72..000000000 --- a/src/sentry/src/Listener/SetRedisEventEnableListener.php +++ /dev/null @@ -1,41 +0,0 @@ -config->has('redis')) { - return; - } - - foreach ($this->config->get('redis', []) as $pool => $_) { - $this->config->set("redis.{$pool}.event.enable", true); - } - } -} diff --git a/src/sentry/src/Listener/SetRequestLifecycleListener.php b/src/sentry/src/Listener/SetRequestLifecycleListener.php deleted file mode 100644 index 680f4d6f0..000000000 --- a/src/sentry/src/Listener/SetRequestLifecycleListener.php +++ /dev/null @@ -1,104 +0,0 @@ -config->has($key)) { - $this->config->set($key, true); - } - } - - if ( - ! $this->switcher->isEnable('request') - && ! $this->switcher->isTracingEnable('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); - } -} From 30c241db0758060ce81ed89c5da9dd79e2f35ea0 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:08:12 +0800 Subject: [PATCH 02/29] feat(sentry): replace EventListener with EventHandleListener and update listener configuration --- src/sentry/src/ConfigProvider.php | 2 +- .../src/Listener/{EventListener.php => EventHandleListener.php} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/sentry/src/Listener/{EventListener.php => EventHandleListener.php} (99%) diff --git a/src/sentry/src/ConfigProvider.php b/src/sentry/src/ConfigProvider.php index 644e4e59a..8f9bd8562 100644 --- a/src/sentry/src/ConfigProvider.php +++ b/src/sentry/src/ConfigProvider.php @@ -51,7 +51,7 @@ public function __invoke(): array \Sentry\Transport\TransportInterface::class => Transport\CoHttpTransport::class, ], 'listeners' => [ - Listener\EventListener::class, + Listener\EventHandleListener::class, Crons\Listener\CronEventListener::class, Tracing\Listener\TracingAmqpListener::class, Tracing\Listener\TracingAsyncQueueListener::class, diff --git a/src/sentry/src/Listener/EventListener.php b/src/sentry/src/Listener/EventHandleListener.php similarity index 99% rename from src/sentry/src/Listener/EventListener.php rename to src/sentry/src/Listener/EventHandleListener.php index 878bbc629..9cba646ab 100644 --- a/src/sentry/src/Listener/EventListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -40,7 +40,7 @@ use Sentry\SentrySdk; use Throwable; -class EventListener implements ListenerInterface +class EventHandleListener implements ListenerInterface { public const SETUP = 'sentry.context.setup'; From 365a7beb325af14c867b44aa68c45cfc7561c087 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:10:18 +0800 Subject: [PATCH 03/29] feat(sentry): replace CronEventListener with EventHandleListener and update listener configuration --- src/sentry/src/ConfigProvider.php | 2 +- .../Listener/{CronEventListener.php => EventHandleListener.php} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/sentry/src/Crons/Listener/{CronEventListener.php => EventHandleListener.php} (98%) diff --git a/src/sentry/src/ConfigProvider.php b/src/sentry/src/ConfigProvider.php index 8f9bd8562..9379fe77b 100644 --- a/src/sentry/src/ConfigProvider.php +++ b/src/sentry/src/ConfigProvider.php @@ -52,7 +52,7 @@ public function __invoke(): array ], 'listeners' => [ Listener\EventHandleListener::class, - Crons\Listener\CronEventListener::class, + Crons\Listener\EventHandleListener::class, Tracing\Listener\TracingAmqpListener::class, Tracing\Listener\TracingAsyncQueueListener::class, Tracing\Listener\TracingCommandListener::class, diff --git a/src/sentry/src/Crons/Listener/CronEventListener.php b/src/sentry/src/Crons/Listener/EventHandleListener.php similarity index 98% rename from src/sentry/src/Crons/Listener/CronEventListener.php rename to src/sentry/src/Crons/Listener/EventHandleListener.php index b1d205b2e..b92a11d4d 100644 --- a/src/sentry/src/Crons/Listener/CronEventListener.php +++ b/src/sentry/src/Crons/Listener/EventHandleListener.php @@ -21,7 +21,7 @@ use Sentry\CheckInStatus; use Sentry\SentrySdk; -class CronEventListener implements ListenerInterface +class EventHandleListener implements ListenerInterface { public function __construct( protected ConfigInterface $config, From e22420d676a69090351900064c36d8d2b0431de3 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:18:04 +0800 Subject: [PATCH 04/29] feat(sentry): add EventHandleListener for unified event handling and remove deprecated listeners --- src/sentry/src/ConfigProvider.php | 9 +- .../Tracing/Listener/EventHandleListener.php | 728 ++++++++++++++++++ 2 files changed, 729 insertions(+), 8 deletions(-) create mode 100644 src/sentry/src/Tracing/Listener/EventHandleListener.php diff --git a/src/sentry/src/ConfigProvider.php b/src/sentry/src/ConfigProvider.php index 9379fe77b..6ca66ca3b 100644 --- a/src/sentry/src/ConfigProvider.php +++ b/src/sentry/src/ConfigProvider.php @@ -53,14 +53,7 @@ public function __invoke(): array 'listeners' => [ Listener\EventHandleListener::class, Crons\Listener\EventHandleListener::class, - Tracing\Listener\TracingAmqpListener::class, - Tracing\Listener\TracingAsyncQueueListener::class, - Tracing\Listener\TracingCommandListener::class, - Tracing\Listener\TracingCrontabListener::class, - Tracing\Listener\TracingDbQueryListener::class, - Tracing\Listener\TracingKafkaListener::class, - Tracing\Listener\TracingRedisListener::class, - Tracing\Listener\TracingRequestListener::class, + Tracing\Listener\EventHandleListener::class, ], 'annotations' => [ 'scan' => [ diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php new file mode 100644 index 000000000..588117870 --- /dev/null +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -0,0 +1,728 @@ +ignoreCommands = (array) $this->config->get('sentry.ignore_commands', []); + } + + public function listen(): array + { + return [ + // Database events + QueryExecuted::class, + + // Request events + RequestReceived::class, + RequestHandled::class, + RpcRequestReceived::class, + RpcRequestHandled::class, + + // Command events + CommandBeforeHandle::class, + AfterExecute::class, + + // Redis events + CommandExecuted::class, + + // Crontab events + BeforeExecute::class, + FailToExecute::class, + CrontabAfterExecute::class, + + // AMQP events + AmqpBeforeConsume::class, + AmqpAfterConsume::class, + AmqpFailToConsume::class, + + // Kafka events + KafkaBeforeConsume::class, + KafkaAfterConsume::class, + KafkaFailToConsume::class, + + // AsyncQueue events + AsyncQueueBeforeHandle::class, + AfterHandle::class, + RetryHandle::class, + FailedHandle::class, + ]; + } + + public function process(object $event): void + { + match ($event::class) { + // Database + QueryExecuted::class => $this->handleDatabaseQuery($event), + + // Request + RequestReceived::class, RpcRequestReceived::class => $this->handleRequestReceived($event), + RequestHandled::class, RpcRequestHandled::class => $this->handleRequestHandled($event), + + // Command + CommandBeforeHandle::class => $this->handleCommandStart($event), + AfterExecute::class => $this->handleCommandFinish($event), + + // Redis + CommandExecuted::class => $this->handleRedisCommand($event), + + // Crontab + BeforeExecute::class => $this->handleCrontabStart($event), + FailToExecute::class, CrontabAfterExecute::class => $this->handleCrontabFinish($event), + + // AMQP + AmqpBeforeConsume::class => $this->handleAmqpStart($event), + AmqpAfterConsume::class, AmqpFailToConsume::class => $this->handleAmqpFinish($event), + + // Kafka + KafkaBeforeConsume::class => $this->handleKafkaStart($event), + KafkaAfterConsume::class, KafkaFailToConsume::class => $this->handleKafkaFinish($event), + + // AsyncQueue + AsyncQueueBeforeHandle::class => $this->handleAsyncQueueStart($event), + RetryHandle::class, FailedHandle::class, AfterHandle::class => $this->handleAsyncQueueFinish($event), + + default => null, + }; + } + + private function handleDatabaseQuery(QueryExecuted $event): void + { + if (! $this->switcher->isTracingSpanEnable('sql_queries')) { + return; + } + if (! SentrySdk::getCurrentHub()->getSpan()) { + return; + } + + $data = [ + 'coroutine.id' => Coroutine::id(), + 'db.system' => $event->connection->getDriverName(), + 'db.name' => $event->connection->getDatabaseName(), + ]; + + $sqlParse = SqlParser::parse($event->sql); + if (! empty($sqlParse['operation'])) { + $data['db.operation.name'] = $sqlParse['operation']; + } + if (! empty($sqlParse['table'])) { + $data['db.collection.name'] = $sqlParse['table']; + } + foreach ($event->bindings as $key => $value) { + $data['db.parameter.' . $key] = $value; + } + + $pool = $this->container->get(PoolFactory::class)->getPool($event->connectionName); + $data += [ + 'db.pool.name' => $event->connectionName, + 'db.pool.max' => $pool->getOption()->getMaxConnections(), + 'db.pool.max_idle_time' => $pool->getOption()->getMaxIdleTime(), + 'db.pool.idle' => $pool->getConnectionsInChannel(), + 'db.pool.using' => $pool->getCurrentConnections(), + 'db.sql.bindings' => $event->bindings, + ]; + + $startTimestamp = microtime(true) - $event->time / 1000; + + $op = 'db.sql.query'; + $description = $event->sql; + + $this->startSpan( + op: $op, + description: $description, + origin: 'auto.db' + )?->setData($data) + ->setStartTimestamp($startTimestamp) + ->finish($startTimestamp + $event->time / 1000); + } + + private function handleRequestReceived(RequestReceived|RpcRequestReceived $event): void + { + if (! $this->switcher->isTracingEnable('request')) { + return; + } + + $request = $event->request; + /** @var Dispatched $dispatched */ + $dispatched = $request->getAttribute(Dispatched::class); + + if (! $dispatched->isFound() && ! $this->switcher->isTracingEnable('missing_routes')) { + return; + } + + $serverName = $dispatched->serverName ?? 'http'; + $path = $request->getUri()->getPath(); + $method = strtoupper($request->getMethod()); + + [$route, $routeParams, $routeCallback] = $this->parseRoute($dispatched); + + [$name, $source] = match (strtolower($this->source)) { + 'custom' => [$routeCallback, TransactionSource::custom()], + 'url' => [$path, TransactionSource::url()], + default => [$route, TransactionSource::route()], + }; + + $transaction = $this->startRequestTransaction( + request: $request, + name: $name, + op: sprintf('%s.server', $serverName), + description: sprintf('%s %s', $method, $path), + origin: 'auto.request', + source: $source, + ); + + if (! $transaction->getSampled()) { + return; + } + + $data = [ + 'url.scheme' => $request->getUri()->getScheme(), + 'url.path' => $path, + 'http.request.method' => $method, + 'http.route' => $route, + 'http.route.params' => $routeParams, + ]; + foreach ($request->getHeaders() as $key => $value) { + $data['http.request.header.' . $key] = implode(', ', $value); + } + if ($this->container->has(RpcContext::class)) { + $data['rpc.context'] = $this->container->get(RpcContext::class)->getData(); + } + + $transaction->setData($data); + + $span = $this->startSpan( + op: 'request.received', + description: 'request.received', + origin: 'auto.request.received', + asParent: true + ); + + defer(function () use ($transaction, $span) { + $span?->finish(); + + SentrySdk::getCurrentHub()->setSpan($transaction); + + $transaction->finish(); + }); + } + + private function handleRequestHandled(RequestHandled|RpcRequestHandled $event): void + { + $transaction = SentrySdk::getCurrentHub()->getTransaction(); + + if ( + ! $transaction + || ! $transaction->getSampled() + || ! $traceId = (string) $transaction->getTraceId() + ) { + return; + } + + if ($event instanceof RpcRequestHandled) { + $this->container->has(RpcContext::class) && $this->container->get(RpcContext::class)->set('sentry-trace-id', $traceId); + } elseif ($event->response instanceof ResponsePlusInterface) { + $event->response->setHeader('sentry-trace-id', $traceId); + } + + $transaction->setHttpStatus($event->response->getStatusCode()); + + if ($exception = $event->getThrowable()) { + $transaction->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.code' => $exception->getCode(), + 'exception.message' => $exception->getMessage(), + ]) + ->setData([ + 'exception.stack_trace' => (string) $exception, + ]); + } + } + + private function handleCommandStart(CommandBeforeHandle $event): void + { + if ( + ! $this->switcher->isTracingEnable('command') + || Str::is($this->ignoreCommands, $event->getCommand()->getName()) + ) { + return; + } + + $command = $event->getCommand(); + + $this->continueTrace( + name: $command->getName() ?: '', + op: 'console.command', + description: $command->getDescription(), + origin: 'auto.command', + source: TransactionSource::custom() + ); + } + + private function handleCommandFinish(AfterExecute $event): void + { + $transaction = SentrySdk::getCurrentHub()->getTransaction(); + + if (! $transaction || ! $transaction->getSampled()) { + return; + } + + $command = $event->getCommand(); + + $exitCode = (fn () => $this->exitCode ?? SymfonyCommand::SUCCESS)->call($command); + $data = [ + 'command.arguments' => (fn () => $this->input->getArguments())->call($command), + 'command.options' => (fn () => $this->input->getOptions())->call($command), + ]; + $tags = [ + 'command.exit_code' => $exitCode, + ]; + + if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { + $transaction->setStatus(SpanStatus::internalError()); + $tags = array_merge($tags, [ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); + if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { + $data['exception.stack_trace'] = (string) $exception; + } + } + + $transaction->setStatus($exitCode == SymfonyCommand::SUCCESS ? SpanStatus::ok() : SpanStatus::internalError()) + ->setData($data) + ->setTags($tags); + + SentrySdk::getCurrentHub()->setSpan($transaction); + + $transaction->finish(microtime(true)); + } + + private function handleRedisCommand(CommandExecuted $event): void + { + if (! $this->switcher->isTracingSpanEnable('redis')) { + return; + } + + $pool = $this->container->get(RedisPoolFactory::class)->getPool($event->connectionName); + $config = $this->config->get('redis.' . $event->connectionName, []); + $redisStatement = (string) new RedisCommand($event->command, $event->parameters); + + $data = [ + 'coroutine.id' => Coroutine::id(), + 'db.system' => 'redis', + 'db.statement' => $redisStatement, + 'db.redis.connection' => $event->connectionName, + 'db.redis.database_index' => $config['db'] ?? 0, + 'db.redis.parameters' => $event->parameters, + 'db.redis.pool.name' => $event->connectionName, + 'db.redis.pool.max' => $pool->getOption()->getMaxConnections(), + 'db.redis.pool.max_idle_time' => $pool->getOption()->getMaxIdleTime(), + 'db.redis.pool.idle' => $pool->getConnectionsInChannel(), + 'db.redis.pool.using' => $pool->getCurrentConnections(), + 'duration' => $event->time * 1000, + ]; + + $op = 'db.redis'; + $span = $this->startSpan( + op: $op, + description: $redisStatement, + origin: 'auto.cache.redis', + ); + + if (! $span) { + return; + } + + if ($this->switcher->isTracingExtraTagEnable('redis.result')) { + $data['db.redis.result'] = $event->result; + } + + if ($exception = $event->throwable) { + $span->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); + if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { + $data['exception.stack_trace'] = (string) $exception; + } + } + + $span->setData($data) + ->finish(); + } + + private function handleCrontabStart(BeforeExecute $event): void + { + if (! $this->switcher->isTracingEnable('crontab')) { + return; + } + + $crontab = $event->crontab; + + $this->continueTrace( + name: $crontab->getName() ?: '', + op: 'crontab.run', + description: $crontab->getMemo(), + origin: 'auto.crontab', + source: TransactionSource::task() + ); + } + + private function handleCrontabFinish(FailToExecute|CrontabAfterExecute $event): void + { + $transaction = SentrySdk::getCurrentHub()->getTransaction(); + + if (! $transaction || ! $transaction->getSampled()) { + return; + } + + $crontab = $event->crontab; + $data = []; + $tags = [ + 'crontab.rule' => $crontab->getRule(), + 'crontab.type' => $crontab->getType(), + 'crontab.options.is_single' => $crontab->isSingleton(), + 'crontab.options.is_on_one_server' => $crontab->isOnOneServer(), + ]; + + if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { + $transaction->setStatus(SpanStatus::internalError()); + $tags = array_merge($tags, [ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); + if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { + $data['exception.stack_trace'] = (string) $exception; + } + } + + $transaction->setData($data)->setTags($tags); + + SentrySdk::getCurrentHub()->setSpan($transaction); + + $transaction->finish(microtime(true)); + } + + private function handleAmqpStart(AmqpBeforeConsume $event): void + { + if (! $this->switcher->isTracingEnable('amqp')) { + return; + } + + $message = $event->getMessage(); + $carrier = null; + + if (method_exists($event, 'getAMQPMessage')) { + /** @var AMQPMessage $amqpMessage */ + $amqpMessage = $event->getAMQPMessage(); + /** @var null|AMQPTable $applicationHeaders */ + $applicationHeaders = $amqpMessage->has('application_headers') ? $amqpMessage->get('application_headers') : null; + if ($applicationHeaders && isset($applicationHeaders[Constants::TRACE_CARRIER])) { + $carrier = Carrier::fromJson($applicationHeaders[Constants::TRACE_CARRIER]); + Context::set(Constants::TRACE_CARRIER, $carrier); + } + } + + $this->continueTrace( + sentryTrace: $carrier?->getSentryTrace() ?? '', + baggage: $carrier?->getBaggage() ?? '', + name: $message::class, + op: 'queue.process', + description: $message::class, + origin: 'auto.amqp', + source: TransactionSource::custom() + )->setStartTimestamp(microtime(true)); + } + + private function handleAmqpFinish(AmqpAfterConsume|AmqpFailToConsume $event): void + { + $transaction = SentrySdk::getCurrentHub()->getTransaction(); + + if (! $transaction || ! $transaction->getSampled()) { + return; + } + + /** @var null|Carrier $carrier */ + $carrier = Context::get(Constants::TRACE_CARRIER); + + /** @var ConsumerMessage $message */ + $message = $event->getMessage(); + $data = [ + 'messaging.system' => 'amqp', + 'messaging.operation' => 'process', + 'messaging.message.id' => $carrier?->get('message_id'), + 'messaging.message.body.size' => $carrier?->get('body_size'), + 'messaging.message.receive.latency' => $carrier?->has('publish_time') ? (microtime(true) - $carrier->get('publish_time')) : null, + 'messaging.message.retry.count' => 0, + 'messaging.destination.name' => $carrier?->get('destination_name') ?: implode(', ', (array) $message->getRoutingKey()), + 'messaging.amqp.message.type' => $message->getTypeString(), + 'messaging.amqp.message.routing_key' => $message->getRoutingKey(), + 'messaging.amqp.message.exchange' => $message->getExchange(), + 'messaging.amqp.message.queue' => $message->getQueue(), + 'messaging.amqp.message.pool_name' => $message->getPoolName(), + 'messaging.amqp.message.result' => $event instanceof AmqpAfterConsume ? $event->getResult()->value : 'fail', + ]; + $tags = []; + + if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { + $transaction->setStatus(SpanStatus::internalError()); + $tags = array_merge($tags, [ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); + if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { + $data['exception.stack_trace'] = (string) $exception; + } + } + + $transaction->setData($data)->setTags($tags); + + SentrySdk::getCurrentHub()->setSpan($transaction); + + $transaction->finish(microtime(true)); + } + + private function handleKafkaStart(KafkaBeforeConsume $event): void + { + if (! $this->switcher->isTracingEnable('kafka')) { + return; + } + + $consumer = $event->getConsumer(); + $message = $event->getData(); + $carrier = null; + + if ($message instanceof ConsumeMessage) { + foreach ($message->getHeaders() as $header) { + if ($header->getHeaderKey() === Constants::TRACE_CARRIER) { + $carrier = Carrier::fromJson($header->getValue()); + Context::set(Constants::TRACE_CARRIER, $carrier); + break; + } + } + } + + $this->continueTrace( + sentryTrace: $carrier?->getSentryTrace() ?? '', + baggage: $carrier?->getBaggage() ?? '', + name: $consumer->getTopic() . ' process', + op: 'queue.process', + description: $consumer::class, + origin: 'auto.kafka', + source: TransactionSource::custom() + )->setStartTimestamp(microtime(true)); + } + + private function handleKafkaFinish(KafkaAfterConsume|KafkaFailToConsume $event): void + { + $transaction = SentrySdk::getCurrentHub()->getTransaction(); + + if (! $transaction || ! $transaction->getSampled()) { + return; + } + + /** @var null|Carrier $carrier */ + $carrier = Context::get(Constants::TRACE_CARRIER); + $consumer = $event->getConsumer(); + $tags = []; + $data = [ + 'messaging.system' => 'kafka', + 'messaging.operation' => 'process', + 'messaging.message.id' => $carrier?->get('message_id'), + 'messaging.message.body.size' => $carrier?->get('body_size'), + 'messaging.message.receive.latency' => $carrier?->has('publish_time') ? (microtime(true) - $carrier->get('publish_time')) : null, + 'messaging.message.retry.count' => 0, + 'messaging.destination.name' => $carrier?->get('destination_name') ?: (is_array($consumer->getTopic()) ? implode(',', $consumer->getTopic()) : $consumer->getTopic()), + 'messaging.kafka.consumer.group' => $consumer->getGroupId(), + 'messaging.kafka.consumer.pool' => $consumer->getPool(), + ]; + + if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { + $transaction->setStatus(SpanStatus::internalError()); + $tags = array_merge($tags, [ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); + if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { + $data['exception.stack_trace'] = (string) $exception; + } + } + + $transaction->setData($data)->setTags($tags); + + SentrySdk::getCurrentHub()->setSpan($transaction); + + $transaction->finish(microtime(true)); + } + + private function handleAsyncQueueStart(AsyncQueueBeforeHandle $event): void + { + if (! $this->switcher->isTracingEnable('async_queue')) { + return; + } + + /** @var null|Carrier $carrier */ + $carrier = Context::get(Constants::TRACE_CARRIER, null, Coroutine::parentId()); + + $job = $event->getMessage()->job(); + + $this->continueTrace( + sentryTrace: $carrier?->getSentryTrace() ?? '', + baggage: $carrier?->getBaggage() ?? '', + name: $job::class, + op: 'queue.process', + description: 'async_queue: ' . $job::class, + origin: 'auto.async_queue', + source: TransactionSource::custom() + )->setStartTimestamp(microtime(true)); + } + + private function handleAsyncQueueFinish(AfterHandle|RetryHandle|FailedHandle $event): void + { + $transaction = SentrySdk::getCurrentHub()->getTransaction(); + + if (! $transaction || ! $transaction->getSampled()) { + return; + } + + /** @var null|Carrier $carrier */ + $carrier = Context::get(Constants::TRACE_CARRIER, null, Coroutine::parentId()); + $data = [ + 'messaging.system' => 'async_queue', + 'messaging.operation' => 'process', + 'messaging.message.id' => $carrier?->get('message_id'), + 'messaging.message.body.size' => $carrier?->get('body_size'), + 'messaging.message.receive.latency' => $carrier?->has('publish_time') ? (microtime(true) - $carrier->get('publish_time')) : null, + 'messaging.message.retry.count' => $event->getMessage()->getAttempts(), + 'messaging.destination.name' => $carrier?->get('destination_name') ?: 'unknown queue', + ]; + $tags = []; + + if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { + $transaction->setStatus(SpanStatus::internalError()); + $tags = array_merge($tags, [ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); + if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { + $data['exception.stack_trace'] = (string) $exception; + } + } + + $transaction->setData($data)->setTags($tags); + + SentrySdk::getCurrentHub()->setSpan($transaction); + + $transaction->finish(microtime(true)); + } + + private function parseRoute(Dispatched $dispatched): array + { + $route = ''; + $params = []; + $callback = ''; + + if ($dispatched instanceof Dispatched && $dispatched->isFound()) { + $route = $dispatched->handler->route; + $params = $dispatched->params; + $callback = match (true) { + $dispatched->handler->callback instanceof Closure => 'closure', + is_array($dispatched->handler->callback) => implode('@', $dispatched->handler->callback), + is_string($dispatched->handler->callback) => $dispatched->handler->callback, + default => $callback, + }; + } + + return [$route, $params, $callback]; + } +} From 47f91055a853a32616f1fbcb97e653c18c394187 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:20:16 +0800 Subject: [PATCH 05/29] =?UTF-8?q?refactor(sentry):=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E8=BF=87=E6=97=B6=E7=9A=84=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=99=A8=E4=BB=A5=E7=AE=80=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tracing/Listener/TracingAmqpListener.php | 142 ------------ .../Listener/TracingAsyncQueueListener.php | 123 ----------- .../Listener/TracingCommandListener.php | 126 ----------- .../Listener/TracingCrontabListener.php | 107 ---------- .../Listener/TracingDbQueryListener.php | 116 ---------- .../Tracing/Listener/TracingKafkaListener.php | 134 ------------ .../Tracing/Listener/TracingRedisListener.php | 103 --------- .../Listener/TracingRequestListener.php | 202 ------------------ 8 files changed, 1053 deletions(-) delete mode 100644 src/sentry/src/Tracing/Listener/TracingAmqpListener.php delete mode 100644 src/sentry/src/Tracing/Listener/TracingAsyncQueueListener.php delete mode 100644 src/sentry/src/Tracing/Listener/TracingCommandListener.php delete mode 100644 src/sentry/src/Tracing/Listener/TracingCrontabListener.php delete mode 100644 src/sentry/src/Tracing/Listener/TracingDbQueryListener.php delete mode 100644 src/sentry/src/Tracing/Listener/TracingKafkaListener.php delete mode 100644 src/sentry/src/Tracing/Listener/TracingRedisListener.php delete mode 100644 src/sentry/src/Tracing/Listener/TracingRequestListener.php diff --git a/src/sentry/src/Tracing/Listener/TracingAmqpListener.php b/src/sentry/src/Tracing/Listener/TracingAmqpListener.php deleted file mode 100644 index 66801018e..000000000 --- a/src/sentry/src/Tracing/Listener/TracingAmqpListener.php +++ /dev/null @@ -1,142 +0,0 @@ -switcher->isTracingEnable('amqp')) { - return; - } - - match ($event::class) { - BeforeConsume::class => $this->startTransaction($event), - AfterConsume::class, FailToConsume::class => $this->finishTransaction($event), - default => null - }; - } - - protected function startTransaction(BeforeConsume $event): void - { - $message = $event->getMessage(); - $carrier = null; - - if (method_exists($event, 'getAMQPMessage')) { - /** @var AMQPMessage $amqpMessage */ - $amqpMessage = $event->getAMQPMessage(); - /** @var null|AMQPTable $applicationHeaders */ - $applicationHeaders = $amqpMessage->has('application_headers') ? $amqpMessage->get('application_headers') : null; - if ($applicationHeaders && isset($applicationHeaders[Constants::TRACE_CARRIER])) { - $carrier = Carrier::fromJson($applicationHeaders[Constants::TRACE_CARRIER]); - Context::set(Constants::TRACE_CARRIER, $carrier); - } - } - - $this->continueTrace( - sentryTrace: $carrier?->getSentryTrace() ?? '', - baggage: $carrier?->getBaggage() ?? '', - name: $message::class, - op: 'queue.process', - description: $message::class, - origin: 'auto.amqp', - source: TransactionSource::custom() - )->setStartTimestamp(microtime(true)); - } - - protected function finishTransaction(AfterConsume|FailToConsume $event): void - { - $transaction = SentrySdk::getCurrentHub()->getTransaction(); - - // If this transaction is not sampled, we can stop here to prevent doing work for nothing - if (! $transaction || ! $transaction->getSampled()) { - return; - } - - /** @var null|Carrier $carrier */ - $carrier = Context::get(Constants::TRACE_CARRIER); - - /** @var ConsumerMessage $message */ - $message = $event->getMessage(); - $data = [ - 'messaging.system' => 'amqp', - 'messaging.operation' => 'process', - 'messaging.message.id' => $carrier?->get('message_id'), - 'messaging.message.body.size' => $carrier?->get('body_size'), - 'messaging.message.receive.latency' => $carrier?->has('publish_time') ? (microtime(true) - $carrier->get('publish_time')) : null, - 'messaging.message.retry.count' => 0, - 'messaging.destination.name' => $carrier?->get('destination_name') ?: implode(', ', (array) $message->getRoutingKey()), - // for amqp - 'messaging.amqp.message.type' => $message->getTypeString(), - 'messaging.amqp.message.routing_key' => $message->getRoutingKey(), - 'messaging.amqp.message.exchange' => $message->getExchange(), - 'messaging.amqp.message.queue' => $message->getQueue(), - 'messaging.amqp.message.pool_name' => $message->getPoolName(), - 'messaging.amqp.message.result' => $event instanceof AfterConsume ? $event->getResult()->value : 'fail', - ]; - $tags = []; - - if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); - if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; - } - } - - $transaction->setData($data)->setTags($tags); - - SentrySdk::getCurrentHub()->setSpan($transaction); - - $transaction->finish(microtime(true)); - } -} diff --git a/src/sentry/src/Tracing/Listener/TracingAsyncQueueListener.php b/src/sentry/src/Tracing/Listener/TracingAsyncQueueListener.php deleted file mode 100644 index d86fb24be..000000000 --- a/src/sentry/src/Tracing/Listener/TracingAsyncQueueListener.php +++ /dev/null @@ -1,123 +0,0 @@ -switcher->isTracingEnable('async_queue')) { - return; - } - - match ($event::class) { - BeforeHandle::class => $this->startTransaction($event), - RetryHandle::class, FailedHandle::class, AfterHandle::class => $this->finishTransaction($event), - default => null, - }; - } - - protected function startTransaction(BeforeHandle $event): void - { - /** @var null|Carrier $carrier */ - $carrier = Context::get(Constants::TRACE_CARRIER, null, Coroutine::parentId()); - - $job = $event->getMessage()->job(); - - $this->continueTrace( - sentryTrace: $carrier?->getSentryTrace() ?? '', - baggage: $carrier?->getBaggage() ?? '', - name: $job::class, - op: 'queue.process', - description: 'async_queue: ' . $job::class, - origin: 'auto.async_queue', - source: TransactionSource::custom() - )->setStartTimestamp(microtime(true)); - } - - protected function finishTransaction(AfterHandle|RetryHandle|FailedHandle $event): void - { - $transaction = SentrySdk::getCurrentHub()->getTransaction(); - - // If this transaction is not sampled, we can stop here to prevent doing work for nothing - if (! $transaction || ! $transaction->getSampled()) { - return; - } - - /** @var null|Carrier $carrier */ - $carrier = Context::get(Constants::TRACE_CARRIER, null, Coroutine::parentId()); - $data = [ - 'messaging.system' => 'async_queue', - 'messaging.operation' => 'process', - 'messaging.message.id' => $carrier?->get('message_id'), - 'messaging.message.body.size' => $carrier?->get('body_size'), - 'messaging.message.receive.latency' => $carrier?->has('publish_time') ? (microtime(true) - $carrier->get('publish_time')) : null, - 'messaging.message.retry.count' => $event->getMessage()->getAttempts(), - 'messaging.destination.name' => $carrier?->get('destination_name') ?: 'unknown queue', - ]; - $tags = []; - - if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); - if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; - } - } - - $transaction->setData($data)->setTags($tags); - - SentrySdk::getCurrentHub()->setSpan($transaction); - - $transaction->finish(microtime(true)); - } -} diff --git a/src/sentry/src/Tracing/Listener/TracingCommandListener.php b/src/sentry/src/Tracing/Listener/TracingCommandListener.php deleted file mode 100644 index 3d6b5f516..000000000 --- a/src/sentry/src/Tracing/Listener/TracingCommandListener.php +++ /dev/null @@ -1,126 +0,0 @@ -ignoreCommands = (array) $config->get('sentry.ignore_commands', []); - } - - public function listen(): array - { - return [ - BeforeHandle::class, - AfterExecute::class, - ]; - } - - /** - * @param BeforeHandle|AfterExecute|object $event - */ - public function process(object $event): void - { - if ( - ! $this->switcher->isTracingEnable('command') - || Str::is($this->ignoreCommands, $event->getCommand()->getName()) - ) { - return; - } - - match ($event::class) { - BeforeHandle::class => $this->startTransaction($event), - AfterExecute::class => $this->finishTransaction($event), - default => null, - }; - } - - protected function startTransaction(BeforeHandle $event): void - { - $command = $event->getCommand(); - - $this->continueTrace( - name: $command->getName() ?: '', - op: 'console.command', - description: $command->getDescription(), - origin: 'auto.command', - source: TransactionSource::custom() - ); - } - - protected function finishTransaction(AfterExecute $event): void - { - $transaction = SentrySdk::getCurrentHub()->getTransaction(); - - // If this transaction is not sampled, we can stop here to prevent doing work for nothing - if (! $transaction || ! $transaction->getSampled()) { - return; - } - $command = $event->getCommand(); - - $exitCode = (fn () => $this->exitCode ?? SymfonyCommand::SUCCESS)->call($command); - $data = [ - 'command.arguments' => (fn () => $this->input->getArguments())->call($command), - 'command.options' => (fn () => $this->input->getOptions())->call($command), - ]; - $tags = [ - 'command.exit_code' => $exitCode, - ]; - - if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); - if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; - } - } - - $transaction->setStatus($exitCode == SymfonyCommand::SUCCESS ? SpanStatus::ok() : SpanStatus::internalError()) - ->setData($data) - ->setTags($tags); - - SentrySdk::getCurrentHub()->setSpan($transaction); - - $transaction->finish(microtime(true)); - } -} diff --git a/src/sentry/src/Tracing/Listener/TracingCrontabListener.php b/src/sentry/src/Tracing/Listener/TracingCrontabListener.php deleted file mode 100644 index 7d305ea2d..000000000 --- a/src/sentry/src/Tracing/Listener/TracingCrontabListener.php +++ /dev/null @@ -1,107 +0,0 @@ -switcher->isTracingEnable('crontab')) { - return; - } - - match ($event::class) { - BeforeExecute::class => $this->startTransaction($event), - AfterExecute::class, FailToExecute::class => $this->finishTransaction($event), - default => null, - }; - } - - protected function startTransaction(BeforeExecute $event): void - { - $crontab = $event->crontab; - - $this->continueTrace( - name: $crontab->getName() ?: '', - op: 'crontab.run', - description: $crontab->getMemo(), - origin: 'auto.crontab', - source: TransactionSource::task() - ); - } - - protected function finishTransaction(AfterExecute|FailToExecute $event): void - { - $transaction = SentrySdk::getCurrentHub()->getTransaction(); - - // If this transaction is not sampled, we can stop here to prevent doing work for nothing - if (! $transaction || ! $transaction->getSampled()) { - return; - } - - $crontab = $event->crontab; - $data = []; - $tags = [ - 'crontab.rule' => $crontab->getRule(), - 'crontab.type' => $crontab->getType(), - 'crontab.options.is_single' => $crontab->isSingleton(), - 'crontab.options.is_on_one_server' => $crontab->isOnOneServer(), - ]; - - if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); - if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; - } - } - - $transaction->setData($data)->setTags($tags); - - SentrySdk::getCurrentHub()->setSpan($transaction); - - $transaction->finish(microtime(true)); - } -} diff --git a/src/sentry/src/Tracing/Listener/TracingDbQueryListener.php b/src/sentry/src/Tracing/Listener/TracingDbQueryListener.php deleted file mode 100644 index 453e84efb..000000000 --- a/src/sentry/src/Tracing/Listener/TracingDbQueryListener.php +++ /dev/null @@ -1,116 +0,0 @@ - $this->queryExecutedHandler($event), - default => null - }; - } - - /** - * @param object|QueryExecuted $event - */ - protected function queryExecutedHandler(object $event): void - { - if (! $this->switcher->isTracingSpanEnable('sql_queries')) { - return; - } - if (! SentrySdk::getCurrentHub()->getSpan()) { - return; - } - - $data = [ - 'coroutine.id' => Coroutine::id(), - 'db.system' => $event->connection->getDriverName(), - 'db.name' => $event->connection->getDatabaseName(), - ]; - - $sqlParse = SqlParser::parse($event->sql); - if (! empty($sqlParse['operation'])) { - $data['db.operation.name'] = $sqlParse['operation']; - } - if (! empty($sqlParse['table'])) { - $data['db.collection.name'] = $sqlParse['table']; - } - foreach ($event->bindings as $key => $value) { - $data['db.parameter.' . $key] = $value; - } - - $pool = $this->container->get(PoolFactory::class)->getPool($event->connectionName); - $data += [ - 'db.pool.name' => $event->connectionName, - 'db.pool.max' => $pool->getOption()->getMaxConnections(), - 'db.pool.max_idle_time' => $pool->getOption()->getMaxIdleTime(), - 'db.pool.idle' => $pool->getConnectionsInChannel(), - 'db.pool.using' => $pool->getCurrentConnections(), - // 'server.host' => $event->connection->getConfig('host') ?? '', - // 'server.port' => $event->connection->getConfig('port') ?? '', - 'db.sql.bindings' => $event->bindings, - ]; - - $startTimestamp = microtime(true) - $event->time / 1000; - - // rule: operate db.table - // $op = sprintf( - // '%s%s', - // $sqlParse['operation'] ? $sqlParse['operation'] . ' ' : '', - // implode('.', array_filter([$event->connection->getDatabaseName(), $sqlParse['table']])) - // ); - $op = 'db.sql.query'; - $description = $event->sql; - - // Already check in the previous context - $this->startSpan( - op: $op, - description: $description, - origin: 'auto.db' - )?->setData($data) - ->setStartTimestamp($startTimestamp) - ->finish($startTimestamp + $event->time / 1000); - } -} diff --git a/src/sentry/src/Tracing/Listener/TracingKafkaListener.php b/src/sentry/src/Tracing/Listener/TracingKafkaListener.php deleted file mode 100644 index d9f09baa5..000000000 --- a/src/sentry/src/Tracing/Listener/TracingKafkaListener.php +++ /dev/null @@ -1,134 +0,0 @@ -switcher->isTracingEnable('kafka')) { - return; - } - - match ($event::class) { - BeforeConsume::class => $this->startTransaction($event), - AfterConsume::class, FailToConsume::class => $this->finishTransaction($event), - default => null, - }; - } - - protected function startTransaction(BeforeConsume $event): void - { - $consumer = $event->getConsumer(); - $message = $event->getData(); - $carrier = null; - - if ($message instanceof ConsumeMessage) { - foreach ($message->getHeaders() as $header) { - if ($header->getHeaderKey() === Constants::TRACE_CARRIER) { - $carrier = Carrier::fromJson($header->getValue()); - Context::set(Constants::TRACE_CARRIER, $carrier); - break; - } - } - } - - $this->continueTrace( - sentryTrace: $carrier?->getSentryTrace() ?? '', - baggage: $carrier?->getBaggage() ?? '', - name: $consumer->getTopic() . ' process', - op: 'queue.process', - description: $consumer::class, - origin: 'auto.kafka', - source: TransactionSource::custom() - )->setStartTimestamp(microtime(true)); - } - - protected function finishTransaction(AfterConsume|FailToConsume $event): void - { - $transaction = SentrySdk::getCurrentHub()->getTransaction(); - - // If this transaction is not sampled, we can stop here to prevent doing work for nothing - if (! $transaction || ! $transaction->getSampled()) { - return; - } - - /** @var null|Carrier $carrier */ - $carrier = Context::get(Constants::TRACE_CARRIER); - $consumer = $event->getConsumer(); - $tags = []; - $data = [ - 'messaging.system' => 'kafka', - 'messaging.operation' => 'process', - 'messaging.message.id' => $carrier?->get('message_id'), - 'messaging.message.body.size' => $carrier?->get('body_size'), - 'messaging.message.receive.latency' => $carrier?->has('publish_time') ? (microtime(true) - $carrier->get('publish_time')) : null, - 'messaging.message.retry.count' => 0, - 'messaging.destination.name' => $carrier?->get('destination_name') ?: (is_array($consumer->getTopic()) ? implode(',', $consumer->getTopic()) : $consumer->getTopic()), - // for kafka - 'messaging.kafka.consumer.group' => $consumer->getGroupId(), - 'messaging.kafka.consumer.pool' => $consumer->getPool(), - ]; - - if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); - if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; - } - } - - $transaction->setData($data)->setTags($tags); - - SentrySdk::getCurrentHub()->setSpan($transaction); - - $transaction->finish(microtime(true)); - } -} diff --git a/src/sentry/src/Tracing/Listener/TracingRedisListener.php b/src/sentry/src/Tracing/Listener/TracingRedisListener.php deleted file mode 100644 index bbd09190a..000000000 --- a/src/sentry/src/Tracing/Listener/TracingRedisListener.php +++ /dev/null @@ -1,103 +0,0 @@ -switcher->isTracingSpanEnable('redis')) { - return; - } - - $pool = $this->container->get(PoolFactory::class)->getPool($event->connectionName); - $config = $this->config->get('redis.' . $event->connectionName, []); - $redisStatement = (string) new RedisCommand($event->command, $event->parameters); - - $data = [ - 'coroutine.id' => Coroutine::id(), - 'db.system' => 'redis', - 'db.statement' => $redisStatement, - 'db.redis.connection' => $event->connectionName, - 'db.redis.database_index' => $config['db'] ?? 0, - 'db.redis.parameters' => $event->parameters, - 'db.redis.pool.name' => $event->connectionName, - 'db.redis.pool.max' => $pool->getOption()->getMaxConnections(), - 'db.redis.pool.max_idle_time' => $pool->getOption()->getMaxIdleTime(), - 'db.redis.pool.idle' => $pool->getConnectionsInChannel(), - 'db.redis.pool.using' => $pool->getCurrentConnections(), - 'duration' => $event->time * 1000, - ]; - - // rule: operation db.table - $op = 'db.redis'; - $span = $this->startSpan( - op: $op, - description: $redisStatement, - origin: 'auto.cache.redis', - ); - - if (! $span) { - return; - } - - if ($this->switcher->isTracingExtraTagEnable('redis.result')) { - $data['db.redis.result'] = $event->result; - } - - if ($exception = $event->throwable) { - $span->setStatus(SpanStatus::internalError()) - ->setTags([ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); - if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; - } - } - - $span->setData($data) - ->finish(); - } -} diff --git a/src/sentry/src/Tracing/Listener/TracingRequestListener.php b/src/sentry/src/Tracing/Listener/TracingRequestListener.php deleted file mode 100644 index ff5f99d7d..000000000 --- a/src/sentry/src/Tracing/Listener/TracingRequestListener.php +++ /dev/null @@ -1,202 +0,0 @@ -switcher->isTracingEnable('request')) { - return; - } - - match ($event::class) { - RequestReceived::class, RpcRequestReceived::class => $this->startTransaction($event), - RequestHandled::class, RpcRequestHandled::class => $this->setTraceIdAndException($event), - default => null, - }; - } - - private function startTransaction(RequestReceived|RpcRequestReceived $event): void - { - $request = $event->request; - /** @var Dispatched $dispatched */ - $dispatched = $request->getAttribute(Dispatched::class); - - if (! $dispatched->isFound() && ! $this->switcher->isTracingEnable('missing_routes')) { - return; - } - - $serverName = $dispatched->serverName ?? 'http'; - $path = $request->getUri()->getPath(); - $method = strtoupper($request->getMethod()); - - /** - * @var string $route - * @var array $routeParams - * @var string $routeCallback - */ - [$route, $routeParams, $routeCallback] = $this->parseRoute($dispatched); - - /** - * @var string $name - * @var TransactionSource $source - */ - [$name, $source] = match (strtolower($this->source)) { - 'custom' => [$routeCallback, TransactionSource::custom()], - 'url' => [$path, TransactionSource::url()], - default => [$route, TransactionSource::route()], - }; - - // Get sentry-trace and baggage - $transaction = $this->startRequestTransaction( - request: $request, - name: $name, - op: sprintf('%s.server', $serverName), - description: sprintf('%s %s', $method, $path), - origin: 'auto.request', - source: $source, - ); - - if (! $transaction->getSampled()) { - return; - } - - // Set data - $data = [ - 'url.scheme' => $request->getUri()->getScheme(), - 'url.path' => $path, - 'http.request.method' => $method, - 'http.route' => $route, - 'http.route.params' => $routeParams, - ]; - foreach ($request->getHeaders() as $key => $value) { - $data['http.request.header.' . $key] = implode(', ', $value); - } - if ($this->container->has(RpcContext::class)) { - $data['rpc.context'] = $this->container->get(RpcContext::class)->getData(); - } - - $transaction->setData($data); - - $span = $this->startSpan( - op: 'request.received', - description: 'request.received', - origin: 'auto.request.received', - asParent: true - ); - - defer(function () use ($transaction, $span) { - $span?->finish(); - - SentrySdk::getCurrentHub()->setSpan($transaction); - - $transaction->finish(); - }); - } - - private function setTraceIdAndException(RequestHandled|RpcRequestHandled $event): void - { - $transaction = SentrySdk::getCurrentHub()->getTransaction(); - - if ( - ! $transaction - || ! $transaction->getSampled() - || ! $traceId = (string) $transaction->getTraceId() - ) { - return; - } - - if ($event instanceof RpcRequestHandled) { - $this->container->has(RpcContext::class) && $this->container->get(RpcContext::class)->set('sentry-trace-id', $traceId); - } elseif ($event->response instanceof ResponsePlusInterface) { - $event->response->setHeader('sentry-trace-id', $traceId); - } - - // Set http status code - $transaction->setHttpStatus($event->response->getStatusCode()); - - if ($exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()) - ->setTags([ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.code' => $exception->getCode(), - 'exception.message' => $exception->getMessage(), - ]) - ->setData([ - 'exception.stack_trace' => (string) $exception, - ]); - } - } - - private function parseRoute(Dispatched $dispatched): array - { - $route = ''; - $params = []; - $callback = ''; - - if ($dispatched instanceof Dispatched && $dispatched->isFound()) { - $route = $dispatched->handler->route; - $params = $dispatched->params; - $callback = match (true) { - $dispatched->handler->callback instanceof Closure => 'closure', - is_array($dispatched->handler->callback) => implode('@', $dispatched->handler->callback), - is_string($dispatched->handler->callback) => $dispatched->handler->callback, - default => $callback, - }; - } - - return [$route, $params, $callback]; - } -} From 0c0d8c9d817a3d009031fb38c51d332d27301252 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:21:46 +0800 Subject: [PATCH 06/29] =?UTF-8?q?fix(sentry):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E4=BB=A5=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=20flushEvents=20=E6=96=B9=E6=B3=95=E4=B8=AD=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 9cba646ab..91229806a 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -175,7 +175,11 @@ protected function setupSentrySdk(): void protected function flushEvents(): void { - Integration::flushEvents(); + try { + Integration::flushEvents(); + } catch (Throwable $e) { + $this->container->get(StdoutLoggerInterface::class)->error((string) $e); + } } protected function handleBootApplication(object $event): void From d5ba2e0b56579e41921a9e8b995c5e7a12412d73 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:23:28 +0800 Subject: [PATCH 07/29] =?UTF-8?q?feat(sentry):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E8=BF=BD=E8=B8=AA=E9=80=89=E9=A1=B9=E4=BB=A5?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E6=80=A7=E8=83=BD=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 91229806a..49bd9e38e 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -212,6 +212,7 @@ protected function setupRequestLifecycle(): void 'sentry.tracing.enable.crontab', 'sentry.tracing.enable.kafka', 'sentry.tracing.enable.request', + 'sentry.tracing.spans.cache', 'sentry.tracing.spans.coroutine', 'sentry.tracing.spans.db', 'sentry.tracing.spans.elasticsearch', From 1b4391b410401f3431d7129b781ae0ac6c1174b7 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:38:17 +0800 Subject: [PATCH 08/29] =?UTF-8?q?refactor(sentry):=20=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E9=98=9F=E5=88=97=E9=87=8D=E8=AF=95=E5=92=8C?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=A4=84=E7=90=86=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=B7=BB=E5=8A=A0=E4=BA=8B=E4=BB=B6=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Listener/EventHandleListener.php | 84 +++++++++++++++---- 1 file changed, 67 insertions(+), 17 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 49bd9e38e..721f785d8 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -129,8 +129,8 @@ public function process(object $event): void // Async Queue events AsyncQueueEvent\BeforeHandle::class => $this->handleAsyncQueueBefore($event), AsyncQueueEvent\AfterHandle::class => $this->handleAsyncQueueAfter($event), - AsyncQueueEvent\RetryHandle::class => $this->handleAsyncQueueRetry($event), - AsyncQueueEvent\FailedHandle::class => $this->handleAsyncQueueFailed($event), + AsyncQueueEvent\RetryHandle::class, + AsyncQueueEvent\FailedHandle::class => $this->handleAsyncQueueRetryOrFailed($event), // Crontab events CrontabEvent\BeforeExecute::class => $this->handleCrontabBefore($event), @@ -182,6 +182,9 @@ protected function flushEvents(): void } } + /** + * @param BootApplication $event + */ protected function handleBootApplication(object $event): void { $this->setupRequestLifecycle(); @@ -268,6 +271,9 @@ protected function setupRedisEventEnable(): void } } + /** + * @param QueryExecuted $event + */ protected function handleDbQuery(object $event): void { if (! $this->switcher->isBreadcrumbEnable('sql_queries')) { @@ -293,6 +299,9 @@ protected function handleDbQuery(object $event): void )); } + /** + * @param TransactionBeginning|TransactionCommitted|TransactionRolledBack $event + */ protected function handleDbTransaction(object $event): void { if (! $this->switcher->isBreadcrumbEnable('sql_transaction')) { @@ -310,12 +319,12 @@ protected function handleDbTransaction(object $event): void )); } + /** + * @param CommandExecuted $event + */ protected function handleRedisCommand(object $event): void { - if ( - ! $this->switcher->isBreadcrumbEnable('redis') - || ! $event instanceof CommandExecuted - ) { + if (! $this->switcher->isBreadcrumbEnable('redis')) { return; } @@ -332,6 +341,9 @@ protected function handleRedisCommand(object $event): void )); } + /** + * @param RequestReceived|RpcRequestReceived $event + */ protected function handleRequestReceived(object $event): void { if (! $this->switcher->isEnable('request')) { @@ -341,6 +353,9 @@ protected function handleRequestReceived(object $event): void $this->setupSentrySdk(); } + /** + * @param RequestTerminated|RpcRequestTerminated $event + */ protected function handleRequestTerminated(object $event): void { if (! $this->switcher->isEnable('request')) { @@ -351,6 +366,9 @@ protected function handleRequestTerminated(object $event): void $this->flushEvents(); } + /** + * @param CommandEvent\BeforeHandle $event + */ protected function handleCommandBefore(object $event): void { if (! $this->switcher->isEnable('command')) { @@ -360,6 +378,9 @@ protected function handleCommandBefore(object $event): void $this->setupSentrySdk(); } + /** + * @param CommandEvent\FailToHandle $event + */ protected function handleCommandFail(object $event): void { if (! $this->switcher->isEnable('command')) { @@ -369,6 +390,9 @@ protected function handleCommandFail(object $event): void $this->captureException($event->getThrowable()); } + /** + * @param CommandEvent\AfterExecute $event + */ protected function handleCommandAfter(object $event): void { if (! $this->switcher->isEnable('command')) { @@ -378,6 +402,9 @@ protected function handleCommandAfter(object $event): void $this->flushEvents(); } + /** + * @param AsyncQueueEvent\BeforeHandle $event + */ protected function handleAsyncQueueBefore(object $event): void { if (! $this->switcher->isEnable('async_queue')) { @@ -387,6 +414,9 @@ protected function handleAsyncQueueBefore(object $event): void $this->setupSentrySdk(); } + /** + * @param AsyncQueueEvent\AfterHandle $event + */ protected function handleAsyncQueueAfter(object $event): void { if (! $this->switcher->isEnable('async_queue')) { @@ -396,17 +426,10 @@ protected function handleAsyncQueueAfter(object $event): void $this->flushEvents(); } - protected function handleAsyncQueueRetry(object $event): void - { - if (! $this->switcher->isEnable('async_queue')) { - return; - } - - $this->captureException($event->getThrowable()); - $this->flushEvents(); - } - - protected function handleAsyncQueueFailed(object $event): void + /** + * @param AsyncQueueEvent\RetryHandle|AsyncQueueEvent\FailedHandle $event + */ + protected function handleAsyncQueueRetryOrFailed(object $event): void { if (! $this->switcher->isEnable('async_queue')) { return; @@ -416,6 +439,9 @@ protected function handleAsyncQueueFailed(object $event): void $this->flushEvents(); } + /** + * @param CrontabEvent\BeforeExecute $event + */ protected function handleCrontabBefore(object $event): void { if (! $this->switcher->isEnable('crontab')) { @@ -425,6 +451,9 @@ protected function handleCrontabBefore(object $event): void $this->setupSentrySdk(); } + /** + * @param CrontabEvent\AfterExecute $event + */ protected function handleCrontabAfter(object $event): void { if (! $this->switcher->isEnable('crontab')) { @@ -434,6 +463,9 @@ protected function handleCrontabAfter(object $event): void $this->flushEvents(); } + /** + * @param CrontabEvent\FailToExecute $event + */ protected function handleCrontabFail(object $event): void { if (! $this->switcher->isEnable('crontab')) { @@ -444,6 +476,9 @@ protected function handleCrontabFail(object $event): void $this->flushEvents(); } + /** + * @param AmqpEvent\BeforeConsume $event + */ protected function handleAmqpBefore(object $event): void { if (! $this->switcher->isEnable('amqp')) { @@ -453,6 +488,9 @@ protected function handleAmqpBefore(object $event): void $this->setupSentrySdk(); } + /** + * @param AmqpEvent\AfterConsume $event + */ protected function handleAmqpAfter(object $event): void { if (! $this->switcher->isEnable('amqp')) { @@ -462,6 +500,9 @@ protected function handleAmqpAfter(object $event): void $this->flushEvents(); } + /** + * @param AmqpEvent\FailToConsume $event + */ protected function handleAmqpFail(object $event): void { if (! $this->switcher->isEnable('amqp')) { @@ -472,6 +513,9 @@ protected function handleAmqpFail(object $event): void $this->flushEvents(); } + /** + * @param KafkaEvent\BeforeConsume $event + */ protected function handleKafkaBefore(object $event): void { if (! $this->switcher->isEnable('kafka')) { @@ -481,6 +525,9 @@ protected function handleKafkaBefore(object $event): void $this->setupSentrySdk(); } + /** + * @param KafkaEvent\AfterConsume $event + */ protected function handleKafkaAfter(object $event): void { if (! $this->switcher->isEnable('kafka')) { @@ -490,6 +537,9 @@ protected function handleKafkaAfter(object $event): void $this->flushEvents(); } + /** + * @param KafkaEvent\FailToConsume $event + */ protected function handleKafkaFail(object $event): void { if (! $this->switcher->isEnable('kafka')) { From 477d303a62c52c7be8737db247570bc8a94722fb Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:39:04 +0800 Subject: [PATCH 09/29] =?UTF-8?q?refactor(sentry):=20=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E5=A4=84=E7=90=86=20Redis=20=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95=E4=BB=A5=E6=8F=90=E9=AB=98=E5=8F=AF?= =?UTF-8?q?=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 721f785d8..2af4683c5 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -113,7 +113,7 @@ public function process(object $event): void TransactionRolledBack::class => $this->handleDbTransaction($event), // Redis events - CommandExecuted::class => $this->handleRedisCommand($event), + CommandExecuted::class => $this->handleRedisCommandExecuted($event), // Request events RequestReceived::class, @@ -322,7 +322,7 @@ protected function handleDbTransaction(object $event): void /** * @param CommandExecuted $event */ - protected function handleRedisCommand(object $event): void + protected function handleRedisCommandExecuted(object $event): void { if (! $this->switcher->isBreadcrumbEnable('redis')) { return; From a95a00a96ecc8dd5a2de7a92e491b36c8d89ff5b Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:41:45 +0800 Subject: [PATCH 10/29] =?UTF-8?q?refactor(sentry):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=B8=B8=E9=87=8F=E5=90=8D=E7=A7=B0=E4=BB=A5=E5=8F=8D=E6=98=A0?= =?UTF-8?q?=20Sentry=20Hub=20=E7=9A=84=E4=B8=8A=E4=B8=8B=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 2af4683c5..43a2842b6 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -42,7 +42,7 @@ class EventHandleListener implements ListenerInterface { - public const SETUP = 'sentry.context.setup'; + public const HUB = 'sentry.context.hub'; public function __construct( protected ContainerInterface $container, @@ -170,7 +170,7 @@ protected function captureException($throwable): void protected function setupSentrySdk(): void { - Context::getOrSet(static::SETUP, fn () => SentrySdk::init()); + Context::getOrSet(static::HUB, fn () => SentrySdk::init()); } protected function flushEvents(): void From 0b727b542075ee8a1bb23a6bae179b5936aeff35 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:42:44 +0800 Subject: [PATCH 11/29] =?UTF-8?q?fix(sentry):=20=E5=9C=A8=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=BC=82=E5=B8=B8=E6=97=B6=E6=B7=BB=E5=8A=A0=20flushE?= =?UTF-8?q?vents=20=E6=96=B9=E6=B3=95=E8=B0=83=E7=94=A8=E4=BB=A5=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E4=BA=8B=E4=BB=B6=E8=A2=AB=E6=AD=A3=E7=A1=AE=E5=88=B7?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 43a2842b6..107cb39b9 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -388,6 +388,7 @@ protected function handleCommandFail(object $event): void } $this->captureException($event->getThrowable()); + $this->flushEvents(); } /** From 67d1f1f344f88a379cbf9e6db3268c6f10add768 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:47:40 +0800 Subject: [PATCH 12/29] =?UTF-8?q?fix(sentry):=20=E5=9C=A8=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86=E6=97=B6=E6=A0=B9=E6=8D=AE=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=9D=A1=E4=BB=B6=E6=B7=BB=E5=8A=A0=E5=A0=86=E6=A0=88?= =?UTF-8?q?=E8=B7=9F=E8=B8=AA=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Tracing/Listener/EventHandleListener.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 588117870..feba27bed 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -308,10 +308,12 @@ private function handleRequestHandled(RequestHandled|RpcRequestHandled $event): 'exception.class' => $exception::class, 'exception.code' => $exception->getCode(), 'exception.message' => $exception->getMessage(), - ]) - ->setData([ + ]); + if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { + $transaction->setData([ 'exception.stack_trace' => (string) $exception, ]); + } } } From 9a77ca8b589b6f6ee461a1a56170085904400074 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:50:12 +0800 Subject: [PATCH 13/29] =?UTF-8?q?refactor(sentry):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=8B=E5=8A=A1=E6=95=B0=E6=8D=AE=E5=92=8C=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E7=9A=84=E8=AE=BE=E7=BD=AE=E9=80=BB=E8=BE=91=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E4=BB=A3=E7=A0=81=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tracing/Listener/EventHandleListener.php | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index feba27bed..960b8dcc2 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -348,30 +348,32 @@ private function handleCommandFinish(AfterExecute $event): void $command = $event->getCommand(); $exitCode = (fn () => $this->exitCode ?? SymfonyCommand::SUCCESS)->call($command); - $data = [ + $transaction->setData([ 'command.arguments' => (fn () => $this->input->getArguments())->call($command), 'command.options' => (fn () => $this->input->getOptions())->call($command), - ]; - $tags = [ + ]); + $transaction->setTags([ 'command.exit_code' => $exitCode, - ]; + ]); if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); + $transaction->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; + $transaction->setData([ + 'exception.stack_trace' => (string) $exception, + ]); } } - $transaction->setStatus($exitCode == SymfonyCommand::SUCCESS ? SpanStatus::ok() : SpanStatus::internalError()) - ->setData($data) - ->setTags($tags); + $transaction->setStatus( + $exitCode == SymfonyCommand::SUCCESS ? SpanStatus::ok() : SpanStatus::internalError() + ); SentrySdk::getCurrentHub()->setSpan($transaction); From 862386dd87f453415b77b91dd286fc35915f3df6 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 16:51:03 +0800 Subject: [PATCH 14/29] =?UTF-8?q?refactor(sentry):=20=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=BA=8B=E5=8A=A1=E6=95=B0=E6=8D=AE=E5=92=8C?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E7=9A=84=E9=80=BB=E8=BE=91=E4=BB=A5=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E4=BB=A3=E7=A0=81=E7=AE=80=E6=B4=81=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Tracing/Listener/EventHandleListener.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 960b8dcc2..7aef249d1 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -351,8 +351,7 @@ private function handleCommandFinish(AfterExecute $event): void $transaction->setData([ 'command.arguments' => (fn () => $this->input->getArguments())->call($command), 'command.options' => (fn () => $this->input->getOptions())->call($command), - ]); - $transaction->setTags([ + ])->setTags([ 'command.exit_code' => $exitCode, ]); From 4b98d58b8e4370403ac0b0c654f39a4eece6a032 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:00:02 +0800 Subject: [PATCH 15/29] =?UTF-8?q?refactor(sentry):=20=E7=AE=80=E5=8C=96=20?= =?UTF-8?q?Redis=20=E5=92=8C=20AMQP=20=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=95=B0=E6=8D=AE=E8=AE=BE=E7=BD=AE=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81=E5=8F=AF?= =?UTF-8?q?=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tracing/Listener/EventHandleListener.php | 133 ++++++++---------- 1 file changed, 59 insertions(+), 74 deletions(-) diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 7aef249d1..ebef98f8b 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -346,8 +346,8 @@ private function handleCommandFinish(AfterExecute $event): void } $command = $event->getCommand(); - $exitCode = (fn () => $this->exitCode ?? SymfonyCommand::SUCCESS)->call($command); + $transaction->setData([ 'command.arguments' => (fn () => $this->input->getArguments())->call($command), 'command.options' => (fn () => $this->input->getOptions())->call($command), @@ -389,7 +389,17 @@ private function handleRedisCommand(CommandExecuted $event): void $config = $this->config->get('redis.' . $event->connectionName, []); $redisStatement = (string) new RedisCommand($event->command, $event->parameters); - $data = [ + $span = $this->startSpan( + op: 'db.redis', + description: $redisStatement, + origin: 'auto.cache.redis', + ); + + if (! $span) { + return; + } + + $span->setData([ 'coroutine.id' => Coroutine::id(), 'db.system' => 'redis', 'db.statement' => $redisStatement, @@ -402,21 +412,10 @@ private function handleRedisCommand(CommandExecuted $event): void 'db.redis.pool.idle' => $pool->getConnectionsInChannel(), 'db.redis.pool.using' => $pool->getCurrentConnections(), 'duration' => $event->time * 1000, - ]; - - $op = 'db.redis'; - $span = $this->startSpan( - op: $op, - description: $redisStatement, - origin: 'auto.cache.redis', - ); - - if (! $span) { - return; - } + ]); if ($this->switcher->isTracingExtraTagEnable('redis.result')) { - $data['db.redis.result'] = $event->result; + $span->setData(['db.redis.result' => $event->result]); } if ($exception = $event->throwable) { @@ -428,12 +427,11 @@ private function handleRedisCommand(CommandExecuted $event): void 'exception.code' => $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; + $span->setData(['exception.stack_trace' => (string) $exception]); } } - $span->setData($data) - ->finish(); + $span->finish(); } private function handleCrontabStart(BeforeExecute $event): void @@ -462,29 +460,26 @@ private function handleCrontabFinish(FailToExecute|CrontabAfterExecute $event): } $crontab = $event->crontab; - $data = []; - $tags = [ + $transaction->setTags([ 'crontab.rule' => $crontab->getRule(), 'crontab.type' => $crontab->getType(), 'crontab.options.is_single' => $crontab->isSingleton(), 'crontab.options.is_on_one_server' => $crontab->isOnOneServer(), - ]; + ]); if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); + $transaction->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; + $transaction->setData(['exception.stack_trace' => (string) $exception]); } } - $transaction->setData($data)->setTags($tags); - SentrySdk::getCurrentHub()->setSpan($transaction); $transaction->finish(microtime(true)); @@ -518,7 +513,7 @@ private function handleAmqpStart(AmqpBeforeConsume $event): void description: $message::class, origin: 'auto.amqp', source: TransactionSource::custom() - )->setStartTimestamp(microtime(true)); + ); } private function handleAmqpFinish(AmqpAfterConsume|AmqpFailToConsume $event): void @@ -534,7 +529,7 @@ private function handleAmqpFinish(AmqpAfterConsume|AmqpFailToConsume $event): vo /** @var ConsumerMessage $message */ $message = $event->getMessage(); - $data = [ + $transaction->setData([ 'messaging.system' => 'amqp', 'messaging.operation' => 'process', 'messaging.message.id' => $carrier?->get('message_id'), @@ -548,24 +543,21 @@ private function handleAmqpFinish(AmqpAfterConsume|AmqpFailToConsume $event): vo 'messaging.amqp.message.queue' => $message->getQueue(), 'messaging.amqp.message.pool_name' => $message->getPoolName(), 'messaging.amqp.message.result' => $event instanceof AmqpAfterConsume ? $event->getResult()->value : 'fail', - ]; - $tags = []; + ]); if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); + $transaction->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; + $transaction->setData(['exception.stack_trace' => (string) $exception]); } } - $transaction->setData($data)->setTags($tags); - SentrySdk::getCurrentHub()->setSpan($transaction); $transaction->finish(microtime(true)); @@ -599,7 +591,7 @@ private function handleKafkaStart(KafkaBeforeConsume $event): void description: $consumer::class, origin: 'auto.kafka', source: TransactionSource::custom() - )->setStartTimestamp(microtime(true)); + ); } private function handleKafkaFinish(KafkaAfterConsume|KafkaFailToConsume $event): void @@ -613,8 +605,7 @@ private function handleKafkaFinish(KafkaAfterConsume|KafkaFailToConsume $event): /** @var null|Carrier $carrier */ $carrier = Context::get(Constants::TRACE_CARRIER); $consumer = $event->getConsumer(); - $tags = []; - $data = [ + $transaction->setData([ 'messaging.system' => 'kafka', 'messaging.operation' => 'process', 'messaging.message.id' => $carrier?->get('message_id'), @@ -624,23 +615,21 @@ private function handleKafkaFinish(KafkaAfterConsume|KafkaFailToConsume $event): 'messaging.destination.name' => $carrier?->get('destination_name') ?: (is_array($consumer->getTopic()) ? implode(',', $consumer->getTopic()) : $consumer->getTopic()), 'messaging.kafka.consumer.group' => $consumer->getGroupId(), 'messaging.kafka.consumer.pool' => $consumer->getPool(), - ]; + ]); if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); + $transaction->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; + $transaction->setData(['exception.stack_trace' => (string) $exception]); } } - $transaction->setData($data)->setTags($tags); - SentrySdk::getCurrentHub()->setSpan($transaction); $transaction->finish(microtime(true)); @@ -654,7 +643,6 @@ private function handleAsyncQueueStart(AsyncQueueBeforeHandle $event): void /** @var null|Carrier $carrier */ $carrier = Context::get(Constants::TRACE_CARRIER, null, Coroutine::parentId()); - $job = $event->getMessage()->job(); $this->continueTrace( @@ -665,7 +653,7 @@ private function handleAsyncQueueStart(AsyncQueueBeforeHandle $event): void description: 'async_queue: ' . $job::class, origin: 'auto.async_queue', source: TransactionSource::custom() - )->setStartTimestamp(microtime(true)); + ); } private function handleAsyncQueueFinish(AfterHandle|RetryHandle|FailedHandle $event): void @@ -678,7 +666,7 @@ private function handleAsyncQueueFinish(AfterHandle|RetryHandle|FailedHandle $ev /** @var null|Carrier $carrier */ $carrier = Context::get(Constants::TRACE_CARRIER, null, Coroutine::parentId()); - $data = [ + $transaction->setData([ 'messaging.system' => 'async_queue', 'messaging.operation' => 'process', 'messaging.message.id' => $carrier?->get('message_id'), @@ -686,24 +674,21 @@ private function handleAsyncQueueFinish(AfterHandle|RetryHandle|FailedHandle $ev 'messaging.message.receive.latency' => $carrier?->has('publish_time') ? (microtime(true) - $carrier->get('publish_time')) : null, 'messaging.message.retry.count' => $event->getMessage()->getAttempts(), 'messaging.destination.name' => $carrier?->get('destination_name') ?: 'unknown queue', - ]; - $tags = []; + ]); if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { - $transaction->setStatus(SpanStatus::internalError()); - $tags = array_merge($tags, [ - 'error' => true, - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), - ]); + $transaction->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => true, + 'exception.class' => $exception::class, + 'exception.message' => $exception->getMessage(), + 'exception.code' => $exception->getCode(), + ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; + $transaction->setData(['exception.stack_trace' => (string) $exception]); } } - $transaction->setData($data)->setTags($tags); - SentrySdk::getCurrentHub()->setSpan($transaction); $transaction->finish(microtime(true)); From d1567d0b20e8a8e27815337c652986b3f092d365 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:23:17 +0800 Subject: [PATCH 16/29] =?UTF-8?q?refactor(sentry):=20=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=BB=A5=E6=8F=90=E9=AB=98=E5=8F=AF=E8=AF=BB=E6=80=A7=E5=92=8C?= =?UTF-8?q?=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Listener/EventHandleListener.php | 60 +++++++++---------- .../Tracing/Listener/EventHandleListener.php | 44 +++++++------- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 107cb39b9..290f9e320 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -122,30 +122,30 @@ public function process(object $event): void RpcRequestTerminated::class => $this->handleRequestTerminated($event), // Command events - CommandEvent\BeforeHandle::class => $this->handleCommandBefore($event), - CommandEvent\FailToHandle::class => $this->handleCommandFail($event), - CommandEvent\AfterExecute::class => $this->handleCommandAfter($event), + CommandEvent\BeforeHandle::class => $this->handleCommandStarting($event), + CommandEvent\FailToHandle::class => $this->handleCommandFailed($event), + CommandEvent\AfterExecute::class => $this->handleCommandFinished($event), // Async Queue events - AsyncQueueEvent\BeforeHandle::class => $this->handleAsyncQueueBefore($event), - AsyncQueueEvent\AfterHandle::class => $this->handleAsyncQueueAfter($event), + AsyncQueueEvent\BeforeHandle::class => $this->handleAsyncQueueJobProcessing($event), + AsyncQueueEvent\AfterHandle::class => $this->handleAsyncQueueJobProcessed($event), AsyncQueueEvent\RetryHandle::class, - AsyncQueueEvent\FailedHandle::class => $this->handleAsyncQueueRetryOrFailed($event), + AsyncQueueEvent\FailedHandle::class => $this->handleAsyncQueueJobRetryOrFailed($event), // Crontab events - CrontabEvent\BeforeExecute::class => $this->handleCrontabBefore($event), - CrontabEvent\AfterExecute::class => $this->handleCrontabAfter($event), - CrontabEvent\FailToExecute::class => $this->handleCrontabFail($event), + CrontabEvent\BeforeExecute::class => $this->handleCrontabTaskStarting($event), + CrontabEvent\AfterExecute::class => $this->handleCrontabTaskFinished($event), + CrontabEvent\FailToExecute::class => $this->handleCrontabTaskFailed($event), // AMQP events - AmqpEvent\BeforeConsume::class => $this->handleAmqpBefore($event), - AmqpEvent\AfterConsume::class => $this->handleAmqpAfter($event), - AmqpEvent\FailToConsume::class => $this->handleAmqpFail($event), + AmqpEvent\BeforeConsume::class => $this->handleAmqpMessageProcessing($event), + AmqpEvent\AfterConsume::class => $this->handleAmqpMessageProcessed($event), + AmqpEvent\FailToConsume::class => $this->handleAmqpMessageFailed($event), // Kafka events - KafkaEvent\BeforeConsume::class => $this->handleKafkaBefore($event), - KafkaEvent\AfterConsume::class => $this->handleKafkaAfter($event), - KafkaEvent\FailToConsume::class => $this->handleKafkaFail($event), + KafkaEvent\BeforeConsume::class => $this->handleKafkaMessageProcessing($event), + KafkaEvent\AfterConsume::class => $this->handleKafkaMessageProcessed($event), + KafkaEvent\FailToConsume::class => $this->handleKafkaMessageFailed($event), default => null, }; @@ -369,7 +369,7 @@ protected function handleRequestTerminated(object $event): void /** * @param CommandEvent\BeforeHandle $event */ - protected function handleCommandBefore(object $event): void + protected function handleCommandStarting(object $event): void { if (! $this->switcher->isEnable('command')) { return; @@ -381,7 +381,7 @@ protected function handleCommandBefore(object $event): void /** * @param CommandEvent\FailToHandle $event */ - protected function handleCommandFail(object $event): void + protected function handleCommandFailed(object $event): void { if (! $this->switcher->isEnable('command')) { return; @@ -394,7 +394,7 @@ protected function handleCommandFail(object $event): void /** * @param CommandEvent\AfterExecute $event */ - protected function handleCommandAfter(object $event): void + protected function handleCommandFinished(object $event): void { if (! $this->switcher->isEnable('command')) { return; @@ -406,7 +406,7 @@ protected function handleCommandAfter(object $event): void /** * @param AsyncQueueEvent\BeforeHandle $event */ - protected function handleAsyncQueueBefore(object $event): void + protected function handleAsyncQueueJobProcessing(object $event): void { if (! $this->switcher->isEnable('async_queue')) { return; @@ -418,7 +418,7 @@ protected function handleAsyncQueueBefore(object $event): void /** * @param AsyncQueueEvent\AfterHandle $event */ - protected function handleAsyncQueueAfter(object $event): void + protected function handleAsyncQueueJobProcessed(object $event): void { if (! $this->switcher->isEnable('async_queue')) { return; @@ -430,7 +430,7 @@ protected function handleAsyncQueueAfter(object $event): void /** * @param AsyncQueueEvent\RetryHandle|AsyncQueueEvent\FailedHandle $event */ - protected function handleAsyncQueueRetryOrFailed(object $event): void + protected function handleAsyncQueueJobRetryOrFailed(object $event): void { if (! $this->switcher->isEnable('async_queue')) { return; @@ -443,7 +443,7 @@ protected function handleAsyncQueueRetryOrFailed(object $event): void /** * @param CrontabEvent\BeforeExecute $event */ - protected function handleCrontabBefore(object $event): void + protected function handleCrontabTaskStarting(object $event): void { if (! $this->switcher->isEnable('crontab')) { return; @@ -455,7 +455,7 @@ protected function handleCrontabBefore(object $event): void /** * @param CrontabEvent\AfterExecute $event */ - protected function handleCrontabAfter(object $event): void + protected function handleCrontabTaskFinished(object $event): void { if (! $this->switcher->isEnable('crontab')) { return; @@ -467,7 +467,7 @@ protected function handleCrontabAfter(object $event): void /** * @param CrontabEvent\FailToExecute $event */ - protected function handleCrontabFail(object $event): void + protected function handleCrontabTaskFailed(object $event): void { if (! $this->switcher->isEnable('crontab')) { return; @@ -480,7 +480,7 @@ protected function handleCrontabFail(object $event): void /** * @param AmqpEvent\BeforeConsume $event */ - protected function handleAmqpBefore(object $event): void + protected function handleAmqpMessageProcessing(object $event): void { if (! $this->switcher->isEnable('amqp')) { return; @@ -492,7 +492,7 @@ protected function handleAmqpBefore(object $event): void /** * @param AmqpEvent\AfterConsume $event */ - protected function handleAmqpAfter(object $event): void + protected function handleAmqpMessageProcessed(object $event): void { if (! $this->switcher->isEnable('amqp')) { return; @@ -504,7 +504,7 @@ protected function handleAmqpAfter(object $event): void /** * @param AmqpEvent\FailToConsume $event */ - protected function handleAmqpFail(object $event): void + protected function handleAmqpMessageFailed(object $event): void { if (! $this->switcher->isEnable('amqp')) { return; @@ -517,7 +517,7 @@ protected function handleAmqpFail(object $event): void /** * @param KafkaEvent\BeforeConsume $event */ - protected function handleKafkaBefore(object $event): void + protected function handleKafkaMessageProcessing(object $event): void { if (! $this->switcher->isEnable('kafka')) { return; @@ -529,7 +529,7 @@ protected function handleKafkaBefore(object $event): void /** * @param KafkaEvent\AfterConsume $event */ - protected function handleKafkaAfter(object $event): void + protected function handleKafkaMessageProcessed(object $event): void { if (! $this->switcher->isEnable('kafka')) { return; @@ -541,7 +541,7 @@ protected function handleKafkaAfter(object $event): void /** * @param KafkaEvent\FailToConsume $event */ - protected function handleKafkaFail(object $event): void + protected function handleKafkaMessageFailed(object $event): void { if (! $this->switcher->isEnable('kafka')) { return; diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index ebef98f8b..45c04579e 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -134,27 +134,27 @@ public function process(object $event): void RequestHandled::class, RpcRequestHandled::class => $this->handleRequestHandled($event), // Command - CommandBeforeHandle::class => $this->handleCommandStart($event), - AfterExecute::class => $this->handleCommandFinish($event), + CommandBeforeHandle::class => $this->handleCommandStarting($event), + AfterExecute::class => $this->handleCommandFinished($event), // Redis - CommandExecuted::class => $this->handleRedisCommand($event), + CommandExecuted::class => $this->handleRedisCommandExecuted($event), // Crontab - BeforeExecute::class => $this->handleCrontabStart($event), - FailToExecute::class, CrontabAfterExecute::class => $this->handleCrontabFinish($event), + BeforeExecute::class => $this->handleCrontabTaskStarting($event), + FailToExecute::class, CrontabAfterExecute::class => $this->handleCrontabTaskFinished($event), // AMQP - AmqpBeforeConsume::class => $this->handleAmqpStart($event), - AmqpAfterConsume::class, AmqpFailToConsume::class => $this->handleAmqpFinish($event), + AmqpBeforeConsume::class => $this->handleAmqpMessageProcessing($event), + AmqpAfterConsume::class, AmqpFailToConsume::class => $this->handleAmqpMessageProcessed($event), // Kafka - KafkaBeforeConsume::class => $this->handleKafkaStart($event), - KafkaAfterConsume::class, KafkaFailToConsume::class => $this->handleKafkaFinish($event), + KafkaBeforeConsume::class => $this->handleKafkaMessageProcessing($event), + KafkaAfterConsume::class, KafkaFailToConsume::class => $this->handleKafkaMessageProcessed($event), // AsyncQueue - AsyncQueueBeforeHandle::class => $this->handleAsyncQueueStart($event), - RetryHandle::class, FailedHandle::class, AfterHandle::class => $this->handleAsyncQueueFinish($event), + AsyncQueueBeforeHandle::class => $this->handleAsyncQueueJobProcessing($event), + RetryHandle::class, FailedHandle::class, AfterHandle::class => $this->handleAsyncQueueJobProcessed($event), default => null, }; @@ -317,7 +317,7 @@ private function handleRequestHandled(RequestHandled|RpcRequestHandled $event): } } - private function handleCommandStart(CommandBeforeHandle $event): void + private function handleCommandStarting(CommandBeforeHandle $event): void { if ( ! $this->switcher->isTracingEnable('command') @@ -337,7 +337,7 @@ private function handleCommandStart(CommandBeforeHandle $event): void ); } - private function handleCommandFinish(AfterExecute $event): void + private function handleCommandFinished(AfterExecute $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); @@ -379,7 +379,7 @@ private function handleCommandFinish(AfterExecute $event): void $transaction->finish(microtime(true)); } - private function handleRedisCommand(CommandExecuted $event): void + private function handleRedisCommandExecuted(CommandExecuted $event): void { if (! $this->switcher->isTracingSpanEnable('redis')) { return; @@ -434,7 +434,7 @@ private function handleRedisCommand(CommandExecuted $event): void $span->finish(); } - private function handleCrontabStart(BeforeExecute $event): void + private function handleCrontabTaskStarting(BeforeExecute $event): void { if (! $this->switcher->isTracingEnable('crontab')) { return; @@ -451,7 +451,7 @@ private function handleCrontabStart(BeforeExecute $event): void ); } - private function handleCrontabFinish(FailToExecute|CrontabAfterExecute $event): void + private function handleCrontabTaskFinished(FailToExecute|CrontabAfterExecute $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); @@ -485,7 +485,7 @@ private function handleCrontabFinish(FailToExecute|CrontabAfterExecute $event): $transaction->finish(microtime(true)); } - private function handleAmqpStart(AmqpBeforeConsume $event): void + private function handleAmqpMessageProcessing(AmqpBeforeConsume $event): void { if (! $this->switcher->isTracingEnable('amqp')) { return; @@ -516,7 +516,7 @@ private function handleAmqpStart(AmqpBeforeConsume $event): void ); } - private function handleAmqpFinish(AmqpAfterConsume|AmqpFailToConsume $event): void + private function handleAmqpMessageProcessed(AmqpAfterConsume|AmqpFailToConsume $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); @@ -563,7 +563,7 @@ private function handleAmqpFinish(AmqpAfterConsume|AmqpFailToConsume $event): vo $transaction->finish(microtime(true)); } - private function handleKafkaStart(KafkaBeforeConsume $event): void + private function handleKafkaMessageProcessing(KafkaBeforeConsume $event): void { if (! $this->switcher->isTracingEnable('kafka')) { return; @@ -594,7 +594,7 @@ private function handleKafkaStart(KafkaBeforeConsume $event): void ); } - private function handleKafkaFinish(KafkaAfterConsume|KafkaFailToConsume $event): void + private function handleKafkaMessageProcessed(KafkaAfterConsume|KafkaFailToConsume $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); @@ -635,7 +635,7 @@ private function handleKafkaFinish(KafkaAfterConsume|KafkaFailToConsume $event): $transaction->finish(microtime(true)); } - private function handleAsyncQueueStart(AsyncQueueBeforeHandle $event): void + private function handleAsyncQueueJobProcessing(AsyncQueueBeforeHandle $event): void { if (! $this->switcher->isTracingEnable('async_queue')) { return; @@ -656,7 +656,7 @@ private function handleAsyncQueueStart(AsyncQueueBeforeHandle $event): void ); } - private function handleAsyncQueueFinish(AfterHandle|RetryHandle|FailedHandle $event): void + private function handleAsyncQueueJobProcessed(AfterHandle|RetryHandle|FailedHandle $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); From 03e3ba6a8cff9ff360f9b3ea72cc8bfaa036b1cf Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:30:39 +0800 Subject: [PATCH 17/29] =?UTF-8?q?refactor(sentry):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E5=8F=96=E4=BB=BB=E5=8A=A1=E5=A4=84=E7=90=86=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=BB=A5=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81=E5=8F=AF?= =?UTF-8?q?=E8=AF=BB=E6=80=A7=E5=92=8C=E7=BB=B4=E6=8A=A4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Crons/Listener/EventHandleListener.php | 159 ++++++++++-------- 1 file changed, 90 insertions(+), 69 deletions(-) diff --git a/src/sentry/src/Crons/Listener/EventHandleListener.php b/src/sentry/src/Crons/Listener/EventHandleListener.php index b92a11d4d..583708c37 100644 --- a/src/sentry/src/Crons/Listener/EventHandleListener.php +++ b/src/sentry/src/Crons/Listener/EventHandleListener.php @@ -48,10 +48,7 @@ public function process(object $event): void return; } - $hub = SentrySdk::getCurrentHub(); - $slug = $event->crontab->getName(); $options = []; - if (method_exists($event->crontab, 'getOptions')) { $options = $event->crontab->getOptions(); } @@ -60,76 +57,100 @@ public function process(object $event): void return; } - // Notify Sentry your job is running - if ($event instanceof Event\BeforeExecute) { - $rule = $event->crontab->getRule(); - $rules = explode(' ', $rule); - - if (count($rules) > 5) { - $this->logger->warning(sprintf('Crontab rule %s is not supported by sentry', $rule)); - return; - } - - $updateMonitorConfig = (bool) ($options['update_monitor_config'] ?? true); - $monitorConfig = null; - - if ($updateMonitorConfig) { - $monitorSchedule = \Sentry\MonitorSchedule::crontab($rule); - $checkinMargin = (int) ($options['checkin_margin'] ?? $this->config->get('sentry.crons.checkin_margin', 5)); - $maxRuntime = (int) ($options['max_runtime'] ?? $this->config->get('sentry.crons.max_runtime', 15)); - $timezone = null; - if (method_exists($event->crontab, 'getTimezone')) { - $timezone = $event->crontab->getTimezone(); - } - $timezone ??= $this->config->get('sentry.crons.timezone', date_default_timezone_get()); - $failureIssueThreshold = isset($options['failure_issue_threshold']) ? (int) $options['failure_issue_threshold'] : null; - $recoveryThreshold = isset($options['recovery_threshold']) ? (int) $options['recovery_threshold'] : null; - - $monitorConfig = new \Sentry\MonitorConfig( - schedule: $monitorSchedule, - checkinMargin: $checkinMargin, - maxRuntime: $maxRuntime, - timezone: $timezone, - failureIssueThreshold: $failureIssueThreshold, - recoveryThreshold: $recoveryThreshold, - ); - } - - $checkInId = $hub->captureCheckIn( - slug: $slug, - status: CheckInStatus::inProgress(), - monitorConfig: $monitorConfig, - ); - - Context::set(Constants::CRON_CHECKIN_ID, $checkInId); + match ($event::class) { + Event\BeforeExecute::class => $this->handleCrontabTaskStarting($event, $options), + Event\AfterExecute::class => $this->handleCrontabTaskFinished($event), + Event\FailToExecute::class => $this->handleCrontabTaskFailed($event), + default => null, + }; + } + + protected function handleCrontabTaskStarting(Event\BeforeExecute $event, array $options): void + { + $hub = SentrySdk::getCurrentHub(); + $slug = $event->crontab->getName(); + $rule = $event->crontab->getRule(); + $rules = explode(' ', $rule); + + if (count($rules) > 5) { + $this->logger->warning(sprintf('Crontab rule %s is not supported by sentry', $rule)); + return; + } + + $updateMonitorConfig = (bool) ($options['update_monitor_config'] ?? true); + $monitorConfig = null; + + if ($updateMonitorConfig) { + $monitorConfig = $this->createMonitorConfig($event, $options, $rule); + } + + $checkInId = $hub->captureCheckIn( + slug: $slug, + status: CheckInStatus::inProgress(), + monitorConfig: $monitorConfig, + ); + + Context::set(Constants::CRON_CHECKIN_ID, $checkInId); + } + + protected function handleCrontabTaskFinished(Event\AfterExecute $event): void + { + /** @var string $checkInId */ + $checkInId = Context::get(Constants::CRON_CHECKIN_ID); + if (! $checkInId) { + return; } - // Notify Sentry your job has completed successfully - if ($event instanceof Event\AfterExecute) { - /** @var string $checkInId */ - $checkInId = Context::get(Constants::CRON_CHECKIN_ID); - if (! $checkInId) { - return; - } - $hub->captureCheckIn( - slug: $slug, - status: CheckInStatus::ok(), - checkInId: $checkInId, - ); + $hub = SentrySdk::getCurrentHub(); + $slug = $event->crontab->getName(); + + $hub->captureCheckIn( + slug: $slug, + status: CheckInStatus::ok(), + checkInId: $checkInId, + ); + } + + protected function handleCrontabTaskFailed(Event\FailToExecute $event): void + { + /** @var string $checkInId */ + $checkInId = Context::get(Constants::CRON_CHECKIN_ID); + if (! $checkInId) { + return; } - // Notify Sentry your job has failed - if ($event instanceof Event\FailToExecute) { - /** @var string $checkInId */ - $checkInId = Context::get(Constants::CRON_CHECKIN_ID); - if (! $checkInId) { - return; - } - $hub->captureCheckIn( - slug: $slug, - status: CheckInStatus::error(), - checkInId: $checkInId, - ); + $hub = SentrySdk::getCurrentHub(); + $slug = $event->crontab->getName(); + + $hub->captureCheckIn( + slug: $slug, + status: CheckInStatus::error(), + checkInId: $checkInId, + ); + } + + protected function createMonitorConfig(Event\BeforeExecute $event, array $options, string $rule): \Sentry\MonitorConfig + { + $monitorSchedule = \Sentry\MonitorSchedule::crontab($rule); + $checkinMargin = (int) ($options['checkin_margin'] ?? $this->config->get('sentry.crons.checkin_margin', 5)); + $maxRuntime = (int) ($options['max_runtime'] ?? $this->config->get('sentry.crons.max_runtime', 15)); + + $timezone = null; + if (method_exists($event->crontab, 'getTimezone')) { + $timezone = $event->crontab->getTimezone(); } + $timezone ??= $this->config->get('sentry.crons.timezone', date_default_timezone_get()); + + $failureIssueThreshold = isset($options['failure_issue_threshold']) ? (int) $options['failure_issue_threshold'] : null; + $recoveryThreshold = isset($options['recovery_threshold']) ? (int) $options['recovery_threshold'] : null; + + return new \Sentry\MonitorConfig( + schedule: $monitorSchedule, + checkinMargin: $checkinMargin, + maxRuntime: $maxRuntime, + timezone: $timezone, + failureIssueThreshold: $failureIssueThreshold, + recoveryThreshold: $recoveryThreshold, + ); } } From 93fca7f32ac2ee9cf674a0c8d136e8b67d05fee4 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:35:42 +0800 Subject: [PATCH 18/29] =?UTF-8?q?fix(EventHandleListener):=20=E5=B0=86?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E9=80=80=E5=87=BA=E4=BB=A3=E7=A0=81=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E4=B8=BA=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=BB=A5=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Tracing/Listener/EventHandleListener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 45c04579e..25480c796 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -352,7 +352,7 @@ private function handleCommandFinished(AfterExecute $event): void 'command.arguments' => (fn () => $this->input->getArguments())->call($command), 'command.options' => (fn () => $this->input->getOptions())->call($command), ])->setTags([ - 'command.exit_code' => $exitCode, + 'command.exit_code' => (string) $exitCode, ]); if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { From 10325eb2e2e15bfa78fac6ad3ba31ee5708f66da Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:38:20 +0800 Subject: [PATCH 19/29] =?UTF-8?q?refactor(sentry):=20=E5=B0=86=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=A0=87=E8=AE=B0=E7=9A=84=E5=B8=83=E5=B0=94=E5=80=BC?= =?UTF-8?q?=E4=BB=8E=20true=20=E8=BD=AC=E6=8D=A2=E4=B8=BA=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=20'true'=20=E4=BB=A5=E7=A1=AE=E4=BF=9D?= =?UTF-8?q?=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Tracing/Aspect/CoordinatorAspect.php | 2 +- src/sentry/src/Tracing/Aspect/CoroutineAspect.php | 2 +- src/sentry/src/Tracing/Aspect/DbAspect.php | 2 +- .../src/Tracing/Aspect/ElasticsearchAspect.php | 2 +- src/sentry/src/Tracing/Aspect/GrpcAspect.php | 2 +- .../src/Tracing/Aspect/GuzzleHttpClientAspect.php | 4 ++-- src/sentry/src/Tracing/Aspect/RedisAspect.php | 2 +- src/sentry/src/Tracing/Aspect/RpcAspect.php | 2 +- .../src/Tracing/Aspect/TraceAnnotationAspect.php | 2 +- .../src/Tracing/Listener/EventHandleListener.php | 14 +++++++------- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php b/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php index 13b8b111f..97ae0a7af 100644 --- a/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php +++ b/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php @@ -52,7 +52,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } catch (Throwable $exception) { $span?->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), diff --git a/src/sentry/src/Tracing/Aspect/CoroutineAspect.php b/src/sentry/src/Tracing/Aspect/CoroutineAspect.php index 4eba1167f..21e3fd5fc 100644 --- a/src/sentry/src/Tracing/Aspect/CoroutineAspect.php +++ b/src/sentry/src/Tracing/Aspect/CoroutineAspect.php @@ -85,7 +85,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } catch (Throwable $exception) { $transaction->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), diff --git a/src/sentry/src/Tracing/Aspect/DbAspect.php b/src/sentry/src/Tracing/Aspect/DbAspect.php index dbb7dd08a..29ab62d05 100644 --- a/src/sentry/src/Tracing/Aspect/DbAspect.php +++ b/src/sentry/src/Tracing/Aspect/DbAspect.php @@ -114,7 +114,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } catch (Throwable $exception) { $span?->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), diff --git a/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php b/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php index a157d9f65..ae8bce3b8 100644 --- a/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php +++ b/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php @@ -96,7 +96,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } catch (Throwable $exception) { $span->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), diff --git a/src/sentry/src/Tracing/Aspect/GrpcAspect.php b/src/sentry/src/Tracing/Aspect/GrpcAspect.php index b2eeecac9..218b150b8 100644 --- a/src/sentry/src/Tracing/Aspect/GrpcAspect.php +++ b/src/sentry/src/Tracing/Aspect/GrpcAspect.php @@ -84,7 +84,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } catch (Throwable $exception) { $span?->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), diff --git a/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php b/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php index 67637e3c4..6fdfa85f1 100644 --- a/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php +++ b/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php @@ -146,7 +146,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) if ($response->getStatusCode() >= 400 && $response->getStatusCode() < 600) { $span->setTags([ - 'error' => true, + 'error' => 'true', 'http.response.reason' => $response->getReasonPhrase(), ]); } @@ -156,7 +156,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) $span->setStatus(SpanStatus::internalError()); $exception = $stats->getHandlerErrorData() instanceof Throwable ? $stats->getHandlerErrorData() : new Error(); $span->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.code' => $exception->getCode(), ]); diff --git a/src/sentry/src/Tracing/Aspect/RedisAspect.php b/src/sentry/src/Tracing/Aspect/RedisAspect.php index e8037037f..488a5cb1a 100644 --- a/src/sentry/src/Tracing/Aspect/RedisAspect.php +++ b/src/sentry/src/Tracing/Aspect/RedisAspect.php @@ -106,7 +106,7 @@ class_exists(CommandExecuted::class) } $span?->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), diff --git a/src/sentry/src/Tracing/Aspect/RpcAspect.php b/src/sentry/src/Tracing/Aspect/RpcAspect.php index 53a6e95fa..47f10aee7 100644 --- a/src/sentry/src/Tracing/Aspect/RpcAspect.php +++ b/src/sentry/src/Tracing/Aspect/RpcAspect.php @@ -136,7 +136,7 @@ private function handleSend(ProceedingJoinPoint $proceedingJoinPoint) } catch (Throwable $exception) { $span?->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), diff --git a/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php b/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php index 1f4f9b4ac..7f9edea1e 100644 --- a/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php +++ b/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php @@ -78,7 +78,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } catch (Throwable $exception) { $span->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 25480c796..15d9c164c 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -304,7 +304,7 @@ private function handleRequestHandled(RequestHandled|RpcRequestHandled $event): if ($exception = $event->getThrowable()) { $transaction->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.code' => $exception->getCode(), 'exception.message' => $exception->getMessage(), @@ -358,7 +358,7 @@ private function handleCommandFinished(AfterExecute $event): void if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { $transaction->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), @@ -421,7 +421,7 @@ private function handleRedisCommandExecuted(CommandExecuted $event): void if ($exception = $event->throwable) { $span->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), @@ -470,7 +470,7 @@ private function handleCrontabTaskFinished(FailToExecute|CrontabAfterExecute $ev if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { $transaction->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), @@ -548,7 +548,7 @@ private function handleAmqpMessageProcessed(AmqpAfterConsume|AmqpFailToConsume $ if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { $transaction->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), @@ -620,7 +620,7 @@ private function handleKafkaMessageProcessed(KafkaAfterConsume|KafkaFailToConsum if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { $transaction->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), @@ -679,7 +679,7 @@ private function handleAsyncQueueJobProcessed(AfterHandle|RetryHandle|FailedHand if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { $transaction->setStatus(SpanStatus::internalError()) ->setTags([ - 'error' => true, + 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), 'exception.code' => $exception->getCode(), From 82f56dc4fc86e2ca86bf88c305729a7989195092 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:39:26 +0800 Subject: [PATCH 20/29] =?UTF-8?q?fix:=20=E5=B0=86=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=BD=AC=E6=8D=A2=E4=B8=BA=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E4=BB=A5=E7=A1=AE=E4=BF=9D=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Tracing/Aspect/CoordinatorAspect.php | 2 +- src/sentry/src/Tracing/Aspect/CoroutineAspect.php | 2 +- src/sentry/src/Tracing/Aspect/DbAspect.php | 2 +- .../src/Tracing/Aspect/ElasticsearchAspect.php | 2 +- src/sentry/src/Tracing/Aspect/GrpcAspect.php | 2 +- .../src/Tracing/Aspect/GuzzleHttpClientAspect.php | 2 +- src/sentry/src/Tracing/Aspect/RedisAspect.php | 2 +- src/sentry/src/Tracing/Aspect/RpcAspect.php | 2 +- .../src/Tracing/Aspect/TraceAnnotationAspect.php | 2 +- .../src/Tracing/Listener/EventHandleListener.php | 14 +++++++------- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php b/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php index 97ae0a7af..921294829 100644 --- a/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php +++ b/src/sentry/src/Tracing/Aspect/CoordinatorAspect.php @@ -55,7 +55,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $span?->setData([ diff --git a/src/sentry/src/Tracing/Aspect/CoroutineAspect.php b/src/sentry/src/Tracing/Aspect/CoroutineAspect.php index 21e3fd5fc..9f475af0d 100644 --- a/src/sentry/src/Tracing/Aspect/CoroutineAspect.php +++ b/src/sentry/src/Tracing/Aspect/CoroutineAspect.php @@ -88,7 +88,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $transaction->setData([ diff --git a/src/sentry/src/Tracing/Aspect/DbAspect.php b/src/sentry/src/Tracing/Aspect/DbAspect.php index 29ab62d05..e27362352 100644 --- a/src/sentry/src/Tracing/Aspect/DbAspect.php +++ b/src/sentry/src/Tracing/Aspect/DbAspect.php @@ -117,7 +117,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $span?->setData([ diff --git a/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php b/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php index ae8bce3b8..995b771b2 100644 --- a/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php +++ b/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php @@ -99,7 +99,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $span->setData([ diff --git a/src/sentry/src/Tracing/Aspect/GrpcAspect.php b/src/sentry/src/Tracing/Aspect/GrpcAspect.php index 218b150b8..2354508ec 100644 --- a/src/sentry/src/Tracing/Aspect/GrpcAspect.php +++ b/src/sentry/src/Tracing/Aspect/GrpcAspect.php @@ -87,7 +87,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); $this->switcher->isTracingExtraTagEnable('exception.stack_trace') && $span?->setData([ 'exception.stack_trace' => (string) $exception, diff --git a/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php b/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php index 6fdfa85f1..a74363417 100644 --- a/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php +++ b/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php @@ -158,7 +158,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) $span->setTags([ 'error' => 'true', 'exception.class' => $exception::class, - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $data = array_merge($data, [ diff --git a/src/sentry/src/Tracing/Aspect/RedisAspect.php b/src/sentry/src/Tracing/Aspect/RedisAspect.php index 488a5cb1a..2bd27d952 100644 --- a/src/sentry/src/Tracing/Aspect/RedisAspect.php +++ b/src/sentry/src/Tracing/Aspect/RedisAspect.php @@ -109,7 +109,7 @@ class_exists(CommandExecuted::class) 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); throw $exception; diff --git a/src/sentry/src/Tracing/Aspect/RpcAspect.php b/src/sentry/src/Tracing/Aspect/RpcAspect.php index 47f10aee7..5a1e0fcf6 100644 --- a/src/sentry/src/Tracing/Aspect/RpcAspect.php +++ b/src/sentry/src/Tracing/Aspect/RpcAspect.php @@ -139,7 +139,7 @@ private function handleSend(ProceedingJoinPoint $proceedingJoinPoint) 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $data['exception.stack_trace'] = (string) $exception; diff --git a/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php b/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php index 7f9edea1e..1c1dd1816 100644 --- a/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php +++ b/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php @@ -81,7 +81,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $data['exception.stack_trace'] = (string) $exception; diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 15d9c164c..85a802722 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -306,7 +306,7 @@ private function handleRequestHandled(RequestHandled|RpcRequestHandled $event): ->setTags([ 'error' => 'true', 'exception.class' => $exception::class, - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), 'exception.message' => $exception->getMessage(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { @@ -361,7 +361,7 @@ private function handleCommandFinished(AfterExecute $event): void 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $transaction->setData([ @@ -424,7 +424,7 @@ private function handleRedisCommandExecuted(CommandExecuted $event): void 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $span->setData(['exception.stack_trace' => (string) $exception]); @@ -473,7 +473,7 @@ private function handleCrontabTaskFinished(FailToExecute|CrontabAfterExecute $ev 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $transaction->setData(['exception.stack_trace' => (string) $exception]); @@ -551,7 +551,7 @@ private function handleAmqpMessageProcessed(AmqpAfterConsume|AmqpFailToConsume $ 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $transaction->setData(['exception.stack_trace' => (string) $exception]); @@ -623,7 +623,7 @@ private function handleKafkaMessageProcessed(KafkaAfterConsume|KafkaFailToConsum 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $transaction->setData(['exception.stack_trace' => (string) $exception]); @@ -682,7 +682,7 @@ private function handleAsyncQueueJobProcessed(AfterHandle|RetryHandle|FailedHand 'error' => 'true', 'exception.class' => $exception::class, 'exception.message' => $exception->getMessage(), - 'exception.code' => $exception->getCode(), + 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { $transaction->setData(['exception.stack_trace' => (string) $exception]); From 7c1f50ed80fa28474978cb4925bc1feacc40b9fd Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:46:59 +0800 Subject: [PATCH 21/29] =?UTF-8?q?refactor(sentry):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E8=AE=BE=E7=BD=AE=E5=92=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E4=BB=A5=E6=8F=90?= =?UTF-8?q?=E9=AB=98=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Aspect/AsyncQueueJobMessageAspect.php | 18 +++++++++--------- .../src/Tracing/Aspect/ElasticsearchAspect.php | 6 ++---- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/sentry/src/Tracing/Aspect/AsyncQueueJobMessageAspect.php b/src/sentry/src/Tracing/Aspect/AsyncQueueJobMessageAspect.php index c2682623f..c96d72b50 100644 --- a/src/sentry/src/Tracing/Aspect/AsyncQueueJobMessageAspect.php +++ b/src/sentry/src/Tracing/Aspect/AsyncQueueJobMessageAspect.php @@ -61,8 +61,10 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) public function handleGet(ProceedingJoinPoint $proceedingJoinPoint) { - $destinationName = $proceedingJoinPoint->arguments['keys']['name'] ?? 'default'; - Context::set('sentry.messaging.destination.name', $destinationName); + Context::set( + 'sentry.messaging.destination.name', + $proceedingJoinPoint->arguments['keys']['name'] ?? 'default' + ); return $proceedingJoinPoint->process(); } @@ -87,19 +89,17 @@ public function handlePush(ProceedingJoinPoint $proceedingJoinPoint) $messageId = method_exists($job, 'getId') ? $job->getId() : uniqid('async_queue_', true); $destinationName = Context::get('sentry.messaging.destination.name', 'default'); $bodySize = (fn ($job) => strlen($this->packer->pack($job)))->call($driver, $job); - $data = [ + $span->setData([ 'messaging.system' => 'async_queue', 'messaging.operation' => 'publish', 'messaging.message.id' => $messageId, 'messaging.message.body.size' => $bodySize, 'messaging.destination.name' => $destinationName, - ]; - $data += match (true) { - $driver instanceof RedisDriver => $this->buildSpanDataOfRedisDriver($driver), - default => [] - }; + ]); + if ($driver instanceof RedisDriver) { + $span->setData($this->buildSpanDataOfRedisDriver($driver)); + } - $span->setData($data); $carrier = Carrier::fromSpan($span)->with([ 'publish_time' => microtime(true), 'message_id' => $messageId, diff --git a/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php b/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php index 995b771b2..d480d40d3 100644 --- a/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php +++ b/src/sentry/src/Tracing/Aspect/ElasticsearchAspect.php @@ -73,7 +73,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) return $proceedingJoinPoint->process(); } - $data = [ + $span->setData([ 'coroutine.id' => Coroutine::id(), 'db.system' => 'elasticsearch', 'db.operation.name' => $proceedingJoinPoint->methodName, @@ -82,9 +82,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'server.host' => '', // TODO 'server.port' => '', // TODO 'arguments' => json_encode($proceedingJoinPoint->arguments['keys'], JSON_UNESCAPED_UNICODE), - ]; - - $span->setData($data); + ]); try { $result = $proceedingJoinPoint->process(); From 94a370c612cb2b319d57fe1c24ff4ec5baf6452c Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:01:17 +0800 Subject: [PATCH 22/29] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E6=96=B9=E9=9D=A2=E7=9A=84=E4=BB=A3=E7=A0=81=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E5=92=8C=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BB=A5=E6=8F=90=E5=8D=87=E5=8F=AF=E8=AF=BB=E6=80=A7?= =?UTF-8?q?=E5=92=8C=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/cspell.json | 2 ++ src/sentry/src/Tracing/Aspect/GrpcAspect.php | 9 +++--- .../Tracing/Aspect/GuzzleHttpClientAspect.php | 32 +++++++++++-------- .../Tracing/Aspect/KafkaProducerAspect.php | 9 +++--- src/sentry/src/Tracing/Aspect/RedisAspect.php | 21 ++++++------ src/sentry/src/Tracing/Aspect/RpcAspect.php | 19 ++++++----- .../Tracing/Aspect/TraceAnnotationAspect.php | 18 ++++------- 7 files changed, 53 insertions(+), 57 deletions(-) diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 484b5c5da..3c3497b4d 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -39,6 +39,7 @@ "Laozi", "Laravel", "Livewire", + "longlang", "Macroable", "Mailables", "Mailgun", @@ -57,6 +58,7 @@ "openai", "overtrue", "phpize", + "phpkafka", "phpredis", "pmessage", "preprod", diff --git a/src/sentry/src/Tracing/Aspect/GrpcAspect.php b/src/sentry/src/Tracing/Aspect/GrpcAspect.php index 2354508ec..3bb765d39 100644 --- a/src/sentry/src/Tracing/Aspect/GrpcAspect.php +++ b/src/sentry/src/Tracing/Aspect/GrpcAspect.php @@ -41,7 +41,6 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } $options = $proceedingJoinPoint->arguments['keys']['options']; - $data = [ 'grpc.method' => $method = $proceedingJoinPoint->arguments['keys']['method'], 'grpc.options' => $options, @@ -89,9 +88,11 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'exception.message' => $exception->getMessage(), 'exception.code' => (string) $exception->getCode(), ]); - $this->switcher->isTracingExtraTagEnable('exception.stack_trace') && $span?->setData([ - 'exception.stack_trace' => (string) $exception, - ]); + if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { + $span?->setData([ + 'exception.stack_trace' => (string) $exception, + ]); + } throw $exception; } finally { diff --git a/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php b/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php index a74363417..d5896819d 100644 --- a/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php +++ b/src/sentry/src/Tracing/Aspect/GuzzleHttpClientAspect.php @@ -94,7 +94,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) $proceedingJoinPoint->arguments['keys']['options']['on_stats'] = function (TransferStats $stats) use ($options, $guzzleConfig, $onStats, $span) { $request = $stats->getRequest(); $uri = $request->getUri(); - $data = [ + $span->setData([ // See: https://develop.sentry.dev/sdk/performance/span-data-conventions/#http 'http.query' => $uri->getQuery(), 'http.fragment' => $uri->getFragment(), @@ -113,10 +113,10 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'http.guzzle.config' => $guzzleConfig, 'http.guzzle.options' => $options ?? [], 'duration' => $stats->getTransferTime() * 1000, // in milliseconds - ]; + ]); if ($response = $stats->getResponse()) { - $data = array_merge($data, [ + $span->setData([ 'http.response.status_code' => $response->getStatusCode(), 'http.response.reason' => $response->getReasonPhrase(), 'http.response.headers' => $response->getHeaders(), @@ -135,10 +135,12 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) if ($isTextual && $body->isSeekable()) { $pos = $body->tell(); - $data['http.response.body.contents'] = \GuzzleHttp\Psr7\Utils::copyToString($body, 8192); // 8KB 上限 + $span->setData([ + 'http.response.body.contents' => \GuzzleHttp\Psr7\Utils::copyToString($body, 8192), // 8KB 上限 + ]); $body->seek($pos); } else { - $data['http.response.body.contents'] = '[binary omitted]'; + $span->setData(['http.response.body.contents' => '[binary omitted]']); } } @@ -153,22 +155,24 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) } if ($stats->getHandlerErrorData()) { - $span->setStatus(SpanStatus::internalError()); - $exception = $stats->getHandlerErrorData() instanceof Throwable ? $stats->getHandlerErrorData() : new Error(); - $span->setTags([ - 'error' => 'true', - 'exception.class' => $exception::class, - 'exception.code' => (string) $exception->getCode(), - ]); + $exception = $stats->getHandlerErrorData() instanceof Throwable + ? $stats->getHandlerErrorData() + : new Error(); + $span->setStatus(SpanStatus::internalError()) + ->setTags([ + 'error' => 'true', + 'exception.class' => $exception::class, + 'exception.code' => (string) $exception->getCode(), + ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data = array_merge($data, [ + $span->setData([ 'exception.message' => $exception->getMessage(), 'exception.stack_trace' => (string) $exception, ]); } } - $span->setData($data)->finish(); + $span->finish(); if (is_callable($onStats)) { ($onStats)($stats); diff --git a/src/sentry/src/Tracing/Aspect/KafkaProducerAspect.php b/src/sentry/src/Tracing/Aspect/KafkaProducerAspect.php index 5327ad6fa..038548462 100644 --- a/src/sentry/src/Tracing/Aspect/KafkaProducerAspect.php +++ b/src/sentry/src/Tracing/Aspect/KafkaProducerAspect.php @@ -36,9 +36,8 @@ class KafkaProducerAspect extends AbstractAspect 'Hyperf\Kafka\Producer::sendBatchAsync', ]; - public function __construct( - protected Switcher $switcher - ) { + public function __construct(protected Switcher $switcher) + { } public function process(ProceedingJoinPoint $proceedingJoinPoint) @@ -57,8 +56,8 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) protected function sendAsync(ProceedingJoinPoint $proceedingJoinPoint) { $span = $this->startSpan( - 'queue.publish', - sprintf('%s::%s()', $proceedingJoinPoint->className, $proceedingJoinPoint->methodName), + op: 'queue.publish', + description: sprintf('%s::%s()', $proceedingJoinPoint->className, $proceedingJoinPoint->methodName), origin: 'auto.kafka' ); diff --git a/src/sentry/src/Tracing/Aspect/RedisAspect.php b/src/sentry/src/Tracing/Aspect/RedisAspect.php index 2bd27d952..667d6149a 100644 --- a/src/sentry/src/Tracing/Aspect/RedisAspect.php +++ b/src/sentry/src/Tracing/Aspect/RedisAspect.php @@ -55,11 +55,9 @@ class_exists(CommandExecuted::class) } $arguments = $proceedingJoinPoint->arguments['keys']; - $poolName = (fn () => $this->poolName ?? null)->call($proceedingJoinPoint->getInstance()); $pool = $this->container->get(PoolFactory::class)->getPool($poolName); $config = (fn () => $this->config ?? [])->call($pool); - $data = [ 'coroutine.id' => Coroutine::id(), 'db.system' => 'redis', @@ -78,14 +76,13 @@ class_exists(CommandExecuted::class) // $op = sprintf('%s %s', $arguments['name'], $arguments['arguments']['key'] ?? ''); // $description = sprintf('%s::%s()', $proceedingJoinPoint->className, $arguments['name']); $key = $arguments['arguments'][0] ?? ''; - $op = 'db.redis'; $description = sprintf( '%s %s', strtoupper($arguments['name'] ?? ''), is_array($key) ? implode(',', $key) : $key ); $span = $this->startSpan( - op: $op, + op: 'db.redis', description: $description, origin: 'auto.cache.redis', )?->setData($data); @@ -100,19 +97,19 @@ class_exists(CommandExecuted::class) if ($this->switcher->isTracingExtraTagEnable('redis.result')) { $span->setData(['redis.result' => $result]); } - } catch (Throwable $exception) { - if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $span->setData(['exception.stack_trace' => (string) $exception]); - } + } catch (Throwable $e) { $span?->setStatus(SpanStatus::internalError()) ->setTags([ 'error' => 'true', - 'exception.class' => $exception::class, - 'exception.message' => $exception->getMessage(), - 'exception.code' => (string) $exception->getCode(), + 'exception.class' => $e::class, + 'exception.message' => $e->getMessage(), + 'exception.code' => (string) $e->getCode(), ]); + if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { + $span->setData(['exception.stack_trace' => (string) $e]); + } - throw $exception; + throw $e; } finally { $span?->finish(); } diff --git a/src/sentry/src/Tracing/Aspect/RpcAspect.php b/src/sentry/src/Tracing/Aspect/RpcAspect.php index 5a1e0fcf6..2a4b025f4 100644 --- a/src/sentry/src/Tracing/Aspect/RpcAspect.php +++ b/src/sentry/src/Tracing/Aspect/RpcAspect.php @@ -113,13 +113,6 @@ private function handleGenerateRpcPath(ProceedingJoinPoint $proceedingJoinPoint) private function handleSend(ProceedingJoinPoint $proceedingJoinPoint) { - $data = (array) Context::get(static::DATA, []); - $data['rpc.arguments'] = $proceedingJoinPoint->arguments['keys']; - - if ($this->container->has(Rpc\Context::class)) { - $data['rpc.context'] = $this->container->get(Rpc\Context::class)->getData(); - } - // TODO // 'server.address' => '', // 'server.port' => '', @@ -127,11 +120,17 @@ private function handleSend(ProceedingJoinPoint $proceedingJoinPoint) /** @var null|Span $span */ $span = Context::get(static::SPAN); + $span?->setData((array) Context::get(static::DATA, [])); + + if ($this->container->has(Rpc\Context::class)) { + $span?->setData(['rpc.context' => $this->container->get(Rpc\Context::class)->getData()]); + } + try { $result = $proceedingJoinPoint->process(); if ($this->switcher->isTracingExtraTagEnable('rpc.result')) { - $data['rpc.result'] = $result; + $span?->setData(['rpc.result' => $result]); } } catch (Throwable $exception) { $span?->setStatus(SpanStatus::internalError()) @@ -142,12 +141,12 @@ private function handleSend(ProceedingJoinPoint $proceedingJoinPoint) 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; + $span?->setData(['exception.stack_trace' => (string) $exception]); } throw $exception; } finally { - $span?->setData($data)->finish(); + $span?->finish(); Context::destroy(static::SPAN); Context::destroy(static::DATA); diff --git a/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php b/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php index 1c1dd1816..cb08ee720 100644 --- a/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php +++ b/src/sentry/src/Tracing/Aspect/TraceAnnotationAspect.php @@ -43,9 +43,7 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) return $proceedingJoinPoint->process(); } - $data = [ - 'coroutine.id' => Coroutine::id(), - ]; + $data = ['coroutine.id' => Coroutine::id()]; $methodName = $proceedingJoinPoint->methodName; if (in_array($methodName, ['__call', '__callStatic'])) { @@ -63,20 +61,16 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) $methodName ), asParent: true - ); + )?->setData($data); try { $result = $proceedingJoinPoint->process(); - if (! $span) { - return $result; - } - if ($this->switcher->isTracingExtraTagEnable('annotation.result')) { - $data['annotation.result'] = $result; + $span?->setData(['annotation.result' => $result]); } } catch (Throwable $exception) { - $span->setStatus(SpanStatus::internalError()) + $span?->setStatus(SpanStatus::internalError()) ->setTags([ 'error' => 'true', 'exception.class' => $exception::class, @@ -84,11 +78,11 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) 'exception.code' => (string) $exception->getCode(), ]); if ($this->switcher->isTracingExtraTagEnable('exception.stack_trace')) { - $data['exception.stack_trace'] = (string) $exception; + $span?->setData(['exception.stack_trace' => (string) $exception]); } throw $exception; } finally { - $span->setData($data)->finish(microtime(true)); + $span?->finish(microtime(true)); // Reset root span SentrySdk::getCurrentHub()->setSpan($parent); From f69d5d59d292aa3a4b6e862a20b5068309b8f0b4 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:14:12 +0800 Subject: [PATCH 23/29] =?UTF-8?q?refactor:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E6=9F=A5=E8=AF=A2=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E4=BB=A5=E6=8F=90=E9=AB=98=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E6=80=A7=E5=92=8C=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 4 ++-- src/sentry/src/Tracing/Listener/EventHandleListener.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 290f9e320..7d2339fd1 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -107,7 +107,7 @@ public function process(object $event): void BootApplication::class => $this->handleBootApplication($event), // Database events - QueryExecuted::class => $this->handleDbQuery($event), + QueryExecuted::class => $this->handleDbQueryExecuted($event), TransactionBeginning::class, TransactionCommitted::class, TransactionRolledBack::class => $this->handleDbTransaction($event), @@ -274,7 +274,7 @@ protected function setupRedisEventEnable(): void /** * @param QueryExecuted $event */ - protected function handleDbQuery(object $event): void + protected function handleDbQueryExecuted(object $event): void { if (! $this->switcher->isBreadcrumbEnable('sql_queries')) { return; diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 85a802722..0482516db 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -127,7 +127,7 @@ public function process(object $event): void { match ($event::class) { // Database - QueryExecuted::class => $this->handleDatabaseQuery($event), + QueryExecuted::class => $this->handleDbQueryExecuted($event), // Request RequestReceived::class, RpcRequestReceived::class => $this->handleRequestReceived($event), @@ -160,7 +160,7 @@ public function process(object $event): void }; } - private function handleDatabaseQuery(QueryExecuted $event): void + private function handleDbQueryExecuted(QueryExecuted $event): void { if (! $this->switcher->isTracingSpanEnable('sql_queries')) { return; From a9f85df6d332371e4fd1512c29ccf7dd3adb48e7 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:39:03 +0800 Subject: [PATCH 24/29] =?UTF-8?q?refactor:=20=E7=BB=9F=E4=B8=80=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=A4=84=E7=90=86=E7=B1=BB=E4=B8=AD=E7=9A=84=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E7=A9=BA=E9=97=B4=E4=BB=A5=E6=8F=90=E9=AB=98=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E6=80=A7=E5=92=8C=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Listener/EventHandleListener.php | 51 +++---- .../Tracing/Listener/EventHandleListener.php | 134 +++++++++--------- 2 files changed, 88 insertions(+), 97 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 7d2339fd1..278df07c7 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -20,19 +20,14 @@ use Hyperf\Contract\ConfigInterface; use Hyperf\Contract\StdoutLoggerInterface; use Hyperf\Crontab\Event as CrontabEvent; -use Hyperf\Database\Events\QueryExecuted; -use Hyperf\Database\Events\TransactionBeginning; -use Hyperf\Database\Events\TransactionCommitted; -use Hyperf\Database\Events\TransactionRolledBack; +use Hyperf\Database\Events as DbEvent; use Hyperf\Event\Contract\ListenerInterface; use Hyperf\Framework\Event\BootApplication; -use Hyperf\HttpServer\Event\RequestReceived; -use Hyperf\HttpServer\Event\RequestTerminated; +use Hyperf\HttpServer\Event as HttpEvent; use Hyperf\HttpServer\Server as HttpServer; use Hyperf\Kafka\Event as KafkaEvent; use Hyperf\Redis\Event\CommandExecuted; -use Hyperf\RpcServer\Event\RequestReceived as RpcRequestReceived; -use Hyperf\RpcServer\Event\RequestTerminated as RpcRequestTerminated; +use Hyperf\RpcServer\Event as RpcEvent; use Hyperf\RpcServer\Server as RpcServer; use Hyperf\Server\Event; use Psr\Container\ContainerInterface; @@ -58,19 +53,19 @@ public function listen(): array BootApplication::class, // Database events - QueryExecuted::class, - TransactionBeginning::class, - TransactionCommitted::class, - TransactionRolledBack::class, + DbEvent\QueryExecuted::class, + DbEvent\TransactionBeginning::class, + DbEvent\TransactionCommitted::class, + DbEvent\TransactionRolledBack::class, // Redis events CommandExecuted::class, // Request events - RequestReceived::class, - RequestTerminated::class, - RpcRequestReceived::class, - RpcRequestTerminated::class, + HttpEvent\RequestReceived::class, + HttpEvent\RequestTerminated::class, + RpcEvent\RequestReceived::class, + RpcEvent\RequestTerminated::class, // Command events CommandEvent\BeforeHandle::class, @@ -107,19 +102,19 @@ public function process(object $event): void BootApplication::class => $this->handleBootApplication($event), // Database events - QueryExecuted::class => $this->handleDbQueryExecuted($event), - TransactionBeginning::class, - TransactionCommitted::class, - TransactionRolledBack::class => $this->handleDbTransaction($event), + DbEvent\QueryExecuted::class => $this->handleDbQueryExecuted($event), + DbEvent\TransactionBeginning::class, + DbEvent\TransactionCommitted::class, + DbEvent\TransactionRolledBack::class => $this->handleDbTransaction($event), // Redis events CommandExecuted::class => $this->handleRedisCommandExecuted($event), // Request events - RequestReceived::class, - RpcRequestReceived::class => $this->handleRequestReceived($event), - RequestTerminated::class, - RpcRequestTerminated::class => $this->handleRequestTerminated($event), + HttpEvent\RequestReceived::class, + RpcEvent\RequestReceived::class => $this->handleRequestReceived($event), + HttpEvent\RequestTerminated::class, + RpcEvent\RequestTerminated::class => $this->handleRequestTerminated($event), // Command events CommandEvent\BeforeHandle::class => $this->handleCommandStarting($event), @@ -272,7 +267,7 @@ protected function setupRedisEventEnable(): void } /** - * @param QueryExecuted $event + * @param DbEvent\QueryExecuted $event */ protected function handleDbQueryExecuted(object $event): void { @@ -300,7 +295,7 @@ protected function handleDbQueryExecuted(object $event): void } /** - * @param TransactionBeginning|TransactionCommitted|TransactionRolledBack $event + * @param DbEvent\TransactionBeginning|DbEvent\TransactionCommitted|DbEvent\TransactionRolledBack $event */ protected function handleDbTransaction(object $event): void { @@ -342,7 +337,7 @@ protected function handleRedisCommandExecuted(object $event): void } /** - * @param RequestReceived|RpcRequestReceived $event + * @param HttpEvent\RequestReceived|RpcEvent\RequestReceived $event */ protected function handleRequestReceived(object $event): void { @@ -354,7 +349,7 @@ protected function handleRequestReceived(object $event): void } /** - * @param RequestTerminated|RpcRequestTerminated $event + * @param HttpEvent\RequestTerminated|RpcEvent\RequestTerminated $event */ protected function handleRequestTerminated(object $event): void { diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 0482516db..68f87e417 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -18,36 +18,24 @@ use FriendsOfHyperf\Sentry\Util\Carrier; use FriendsOfHyperf\Sentry\Util\SqlParser; use FriendsOfHyperf\Support\RedisCommand; -use Hyperf\Amqp\Event\AfterConsume as AmqpAfterConsume; -use Hyperf\Amqp\Event\BeforeConsume as AmqpBeforeConsume; -use Hyperf\Amqp\Event\FailToConsume as AmqpFailToConsume; +use Hyperf\Amqp\Event as AmqpEvent; use Hyperf\Amqp\Message\ConsumerMessage; -use Hyperf\AsyncQueue\Event\AfterHandle; -use Hyperf\AsyncQueue\Event\BeforeHandle as AsyncQueueBeforeHandle; -use Hyperf\AsyncQueue\Event\FailedHandle; -use Hyperf\AsyncQueue\Event\RetryHandle; -use Hyperf\Command\Event\AfterExecute; -use Hyperf\Command\Event\BeforeHandle as CommandBeforeHandle; +use Hyperf\AsyncQueue\Event as AsyncQueueEvent; +use Hyperf\Command\Event as CommandEvent; use Hyperf\Context\Context; use Hyperf\Contract\ConfigInterface; use Hyperf\Coroutine\Coroutine; -use Hyperf\Crontab\Event\AfterExecute as CrontabAfterExecute; -use Hyperf\Crontab\Event\BeforeExecute; -use Hyperf\Crontab\Event\FailToExecute; +use Hyperf\Crontab\Event as CrontabEvent; use Hyperf\Database\Events\QueryExecuted; use Hyperf\DbConnection\Pool\PoolFactory; use Hyperf\Event\Contract\ListenerInterface; -use Hyperf\HttpServer\Event\RequestHandled; -use Hyperf\HttpServer\Event\RequestReceived; +use Hyperf\HttpServer\Event as HttpEvent; use Hyperf\HttpServer\Router\Dispatched; -use Hyperf\Kafka\Event\AfterConsume as KafkaAfterConsume; -use Hyperf\Kafka\Event\BeforeConsume as KafkaBeforeConsume; -use Hyperf\Kafka\Event\FailToConsume as KafkaFailToConsume; -use Hyperf\Redis\Event\CommandExecuted; +use Hyperf\Kafka\Event as KafkaEvent; +use Hyperf\Redis\Event as RedisEvent; use Hyperf\Redis\Pool\PoolFactory as RedisPoolFactory; use Hyperf\Rpc\Context as RpcContext; -use Hyperf\RpcServer\Event\RequestHandled as RpcRequestHandled; -use Hyperf\RpcServer\Event\RequestReceived as RpcRequestReceived; +use Hyperf\RpcServer\Event as RpcEvent; use Hyperf\Stringable\Str; use longlang\phpkafka\Consumer\ConsumeMessage; use PhpAmqpLib\Message\AMQPMessage; @@ -88,38 +76,38 @@ public function listen(): array QueryExecuted::class, // Request events - RequestReceived::class, - RequestHandled::class, - RpcRequestReceived::class, - RpcRequestHandled::class, + HttpEvent\RequestReceived::class, + HttpEvent\RequestHandled::class, + RpcEvent\RequestReceived::class, + RpcEvent\RequestHandled::class, // Command events - CommandBeforeHandle::class, - AfterExecute::class, + CommandEvent\BeforeHandle::class, + CommandEvent\AfterExecute::class, // Redis events - CommandExecuted::class, + RedisEvent\CommandExecuted::class, // Crontab events - BeforeExecute::class, - FailToExecute::class, - CrontabAfterExecute::class, + CrontabEvent\BeforeExecute::class, + CrontabEvent\FailToExecute::class, + CrontabEvent\AfterExecute::class, // AMQP events - AmqpBeforeConsume::class, - AmqpAfterConsume::class, - AmqpFailToConsume::class, + AmqpEvent\BeforeConsume::class, + AmqpEvent\AfterConsume::class, + AmqpEvent\FailToConsume::class, // Kafka events - KafkaBeforeConsume::class, - KafkaAfterConsume::class, - KafkaFailToConsume::class, + KafkaEvent\BeforeConsume::class, + KafkaEvent\AfterConsume::class, + KafkaEvent\FailToConsume::class, // AsyncQueue events - AsyncQueueBeforeHandle::class, - AfterHandle::class, - RetryHandle::class, - FailedHandle::class, + AsyncQueueEvent\BeforeHandle::class, + AsyncQueueEvent\AfterHandle::class, + AsyncQueueEvent\RetryHandle::class, + AsyncQueueEvent\FailedHandle::class, ]; } @@ -130,31 +118,37 @@ public function process(object $event): void QueryExecuted::class => $this->handleDbQueryExecuted($event), // Request - RequestReceived::class, RpcRequestReceived::class => $this->handleRequestReceived($event), - RequestHandled::class, RpcRequestHandled::class => $this->handleRequestHandled($event), + HttpEvent\RequestReceived::class, + RpcEvent\RequestReceived::class => $this->handleRequestReceived($event), + HttpEvent\RequestHandled::class, + RpcEvent\RequestHandled::class => $this->handleRequestHandled($event), // Command - CommandBeforeHandle::class => $this->handleCommandStarting($event), - AfterExecute::class => $this->handleCommandFinished($event), + CommandEvent\BeforeHandle::class => $this->handleCommandStarting($event), + CommandEvent\AfterExecute::class => $this->handleCommandFinished($event), // Redis - CommandExecuted::class => $this->handleRedisCommandExecuted($event), + RedisEvent\CommandExecuted::class => $this->handleRedisCommandExecuted($event), // Crontab - BeforeExecute::class => $this->handleCrontabTaskStarting($event), - FailToExecute::class, CrontabAfterExecute::class => $this->handleCrontabTaskFinished($event), + CrontabEvent\BeforeExecute::class => $this->handleCrontabTaskStarting($event), + CrontabEvent\FailToExecute::class, + CrontabEvent\AfterExecute::class => $this->handleCrontabTaskFinished($event), // AMQP - AmqpBeforeConsume::class => $this->handleAmqpMessageProcessing($event), - AmqpAfterConsume::class, AmqpFailToConsume::class => $this->handleAmqpMessageProcessed($event), + AmqpEvent\BeforeConsume::class => $this->handleAmqpMessageProcessing($event), + AmqpEvent\AfterConsume::class, AmqpEvent\FailToConsume::class => $this->handleAmqpMessageProcessed($event), // Kafka - KafkaBeforeConsume::class => $this->handleKafkaMessageProcessing($event), - KafkaAfterConsume::class, KafkaFailToConsume::class => $this->handleKafkaMessageProcessed($event), + KafkaEvent\BeforeConsume::class => $this->handleKafkaMessageProcessing($event), + KafkaEvent\AfterConsume::class, + KafkaEvent\FailToConsume::class => $this->handleKafkaMessageProcessed($event), // AsyncQueue - AsyncQueueBeforeHandle::class => $this->handleAsyncQueueJobProcessing($event), - RetryHandle::class, FailedHandle::class, AfterHandle::class => $this->handleAsyncQueueJobProcessed($event), + AsyncQueueEvent\BeforeHandle::class => $this->handleAsyncQueueJobProcessing($event), + AsyncQueueEvent\RetryHandle::class, + AsyncQueueEvent\FailedHandle::class, + AsyncQueueEvent\AfterHandle::class => $this->handleAsyncQueueJobProcessed($event), default => null, }; @@ -210,7 +204,7 @@ private function handleDbQueryExecuted(QueryExecuted $event): void ->finish($startTimestamp + $event->time / 1000); } - private function handleRequestReceived(RequestReceived|RpcRequestReceived $event): void + private function handleRequestReceived(HttpEvent\RequestReceived|RpcEvent\RequestReceived $event): void { if (! $this->switcher->isTracingEnable('request')) { return; @@ -281,7 +275,7 @@ private function handleRequestReceived(RequestReceived|RpcRequestReceived $event }); } - private function handleRequestHandled(RequestHandled|RpcRequestHandled $event): void + private function handleRequestHandled(HttpEvent\RequestHandled|RpcEvent\RequestHandled $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); @@ -293,8 +287,10 @@ private function handleRequestHandled(RequestHandled|RpcRequestHandled $event): return; } - if ($event instanceof RpcRequestHandled) { - $this->container->has(RpcContext::class) && $this->container->get(RpcContext::class)->set('sentry-trace-id', $traceId); + if ($event instanceof RpcEvent\RequestHandled) { + if ($this->container->has(RpcContext::class)) { + $this->container->get(RpcContext::class)->set('sentry-trace-id', $traceId); + } } elseif ($event->response instanceof ResponsePlusInterface) { $event->response->setHeader('sentry-trace-id', $traceId); } @@ -317,7 +313,7 @@ private function handleRequestHandled(RequestHandled|RpcRequestHandled $event): } } - private function handleCommandStarting(CommandBeforeHandle $event): void + private function handleCommandStarting(CommandEvent\BeforeHandle $event): void { if ( ! $this->switcher->isTracingEnable('command') @@ -337,7 +333,7 @@ private function handleCommandStarting(CommandBeforeHandle $event): void ); } - private function handleCommandFinished(AfterExecute $event): void + private function handleCommandFinished(CommandEvent\AfterExecute $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); @@ -379,7 +375,7 @@ private function handleCommandFinished(AfterExecute $event): void $transaction->finish(microtime(true)); } - private function handleRedisCommandExecuted(CommandExecuted $event): void + private function handleRedisCommandExecuted(RedisEvent\CommandExecuted $event): void { if (! $this->switcher->isTracingSpanEnable('redis')) { return; @@ -434,7 +430,7 @@ private function handleRedisCommandExecuted(CommandExecuted $event): void $span->finish(); } - private function handleCrontabTaskStarting(BeforeExecute $event): void + private function handleCrontabTaskStarting(CrontabEvent\BeforeExecute $event): void { if (! $this->switcher->isTracingEnable('crontab')) { return; @@ -451,7 +447,7 @@ private function handleCrontabTaskStarting(BeforeExecute $event): void ); } - private function handleCrontabTaskFinished(FailToExecute|CrontabAfterExecute $event): void + private function handleCrontabTaskFinished(CrontabEvent\FailToExecute|CrontabEvent\AfterExecute $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); @@ -485,7 +481,7 @@ private function handleCrontabTaskFinished(FailToExecute|CrontabAfterExecute $ev $transaction->finish(microtime(true)); } - private function handleAmqpMessageProcessing(AmqpBeforeConsume $event): void + private function handleAmqpMessageProcessing(AmqpEvent\BeforeConsume $event): void { if (! $this->switcher->isTracingEnable('amqp')) { return; @@ -516,7 +512,7 @@ private function handleAmqpMessageProcessing(AmqpBeforeConsume $event): void ); } - private function handleAmqpMessageProcessed(AmqpAfterConsume|AmqpFailToConsume $event): void + private function handleAmqpMessageProcessed(AmqpEvent\AfterConsume|AmqpEvent\FailToConsume $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); @@ -542,7 +538,7 @@ private function handleAmqpMessageProcessed(AmqpAfterConsume|AmqpFailToConsume $ 'messaging.amqp.message.exchange' => $message->getExchange(), 'messaging.amqp.message.queue' => $message->getQueue(), 'messaging.amqp.message.pool_name' => $message->getPoolName(), - 'messaging.amqp.message.result' => $event instanceof AmqpAfterConsume ? $event->getResult()->value : 'fail', + 'messaging.amqp.message.result' => $event instanceof AmqpEvent\AfterConsume ? $event->getResult()->value : 'fail', ]); if (method_exists($event, 'getThrowable') && $exception = $event->getThrowable()) { @@ -563,7 +559,7 @@ private function handleAmqpMessageProcessed(AmqpAfterConsume|AmqpFailToConsume $ $transaction->finish(microtime(true)); } - private function handleKafkaMessageProcessing(KafkaBeforeConsume $event): void + private function handleKafkaMessageProcessing(KafkaEvent\BeforeConsume $event): void { if (! $this->switcher->isTracingEnable('kafka')) { return; @@ -594,7 +590,7 @@ private function handleKafkaMessageProcessing(KafkaBeforeConsume $event): void ); } - private function handleKafkaMessageProcessed(KafkaAfterConsume|KafkaFailToConsume $event): void + private function handleKafkaMessageProcessed(KafkaEvent\AfterConsume|KafkaEvent\FailToConsume $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); @@ -635,7 +631,7 @@ private function handleKafkaMessageProcessed(KafkaAfterConsume|KafkaFailToConsum $transaction->finish(microtime(true)); } - private function handleAsyncQueueJobProcessing(AsyncQueueBeforeHandle $event): void + private function handleAsyncQueueJobProcessing(AsyncQueueEvent\BeforeHandle $event): void { if (! $this->switcher->isTracingEnable('async_queue')) { return; @@ -656,7 +652,7 @@ private function handleAsyncQueueJobProcessing(AsyncQueueBeforeHandle $event): v ); } - private function handleAsyncQueueJobProcessed(AfterHandle|RetryHandle|FailedHandle $event): void + private function handleAsyncQueueJobProcessed(AsyncQueueEvent\AfterHandle|AsyncQueueEvent\RetryHandle|AsyncQueueEvent\FailedHandle $event): void { $transaction = SentrySdk::getCurrentHub()->getTransaction(); From 9f1ed035ae7e7177283677c6b7fa79fe55946df5 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:41:08 +0800 Subject: [PATCH 25/29] =?UTF-8?q?refactor:=20=E7=BB=9F=E4=B8=80Redis?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86=E7=B1=BB=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E7=A9=BA=E9=97=B4=E4=BB=A5=E6=8F=90=E9=AB=98?= =?UTF-8?q?=E4=B8=80=E8=87=B4=E6=80=A7=E5=92=8C=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 9 +++++---- src/sentry/src/Tracing/Listener/EventHandleListener.php | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 278df07c7..2cb46b9d8 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -26,11 +26,12 @@ use Hyperf\HttpServer\Event as HttpEvent; use Hyperf\HttpServer\Server as HttpServer; use Hyperf\Kafka\Event as KafkaEvent; -use Hyperf\Redis\Event\CommandExecuted; +use Hyperf\Redis\Event as RedisEvent; use Hyperf\RpcServer\Event as RpcEvent; use Hyperf\RpcServer\Server as RpcServer; use Hyperf\Server\Event; use Psr\Container\ContainerInterface; +use Redis; use Sentry\Breadcrumb; use Sentry\SentrySdk; use Throwable; @@ -59,7 +60,7 @@ public function listen(): array DbEvent\TransactionRolledBack::class, // Redis events - CommandExecuted::class, + RedisEvent\CommandExecuted::class, // Request events HttpEvent\RequestReceived::class, @@ -108,7 +109,7 @@ public function process(object $event): void DbEvent\TransactionRolledBack::class => $this->handleDbTransaction($event), // Redis events - CommandExecuted::class => $this->handleRedisCommandExecuted($event), + RedisEvent\CommandExecuted::class => $this->handleRedisCommandExecuted($event), // Request events HttpEvent\RequestReceived::class, @@ -315,7 +316,7 @@ protected function handleDbTransaction(object $event): void } /** - * @param CommandExecuted $event + * @param RedisEvent\CommandExecuted $event */ protected function handleRedisCommandExecuted(object $event): void { diff --git a/src/sentry/src/Tracing/Listener/EventHandleListener.php b/src/sentry/src/Tracing/Listener/EventHandleListener.php index 68f87e417..d8a98ca9d 100644 --- a/src/sentry/src/Tracing/Listener/EventHandleListener.php +++ b/src/sentry/src/Tracing/Listener/EventHandleListener.php @@ -137,7 +137,8 @@ public function process(object $event): void // AMQP AmqpEvent\BeforeConsume::class => $this->handleAmqpMessageProcessing($event), - AmqpEvent\AfterConsume::class, AmqpEvent\FailToConsume::class => $this->handleAmqpMessageProcessed($event), + AmqpEvent\AfterConsume::class, + AmqpEvent\FailToConsume::class => $this->handleAmqpMessageProcessed($event), // Kafka KafkaEvent\BeforeConsume::class => $this->handleKafkaMessageProcessing($event), From b2f349544df3fc3a4bd5b6f5a159157b6f68d58e Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:44:51 +0800 Subject: [PATCH 26/29] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=E6=8D=95?= =?UTF-8?q?=E8=8E=B7=E5=BC=82=E5=B8=B8=E6=96=B9=E6=B3=95=E7=9A=84=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E7=B1=BB=E5=9E=8B=E6=8F=90=E7=A4=BA=E4=BB=A5=E6=8F=90?= =?UTF-8?q?=E9=AB=98=E4=BB=A3=E7=A0=81=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 2cb46b9d8..7a5544098 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -147,9 +147,9 @@ public function process(object $event): void }; } - protected function captureException($throwable): void + protected function captureException(?Throwable $throwable): void { - if (! $throwable instanceof Throwable) { + if (! $throwable) { return; } From d020b98e4792b3a58fa46997f36dddbd86b67f86 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:45:50 +0800 Subject: [PATCH 27/29] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=87=BD=E6=95=B0=E5=8F=82=E6=95=B0=E5=B9=B6=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 7a5544098..ba4a376b0 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -43,7 +43,8 @@ class EventHandleListener implements ListenerInterface public function __construct( protected ContainerInterface $container, protected Switcher $switcher, - protected ConfigInterface $config + protected ConfigInterface $config, + protected StdoutLoggerInterface $logger ) { } @@ -158,7 +159,7 @@ protected function captureException(?Throwable $throwable): void try { $hub->captureException($throwable); } catch (Throwable $e) { - $this->container->get(StdoutLoggerInterface::class)->error((string) $e); + $this->logger->error((string) $e); } finally { $hub->getClient()?->flush(); } @@ -174,7 +175,7 @@ protected function flushEvents(): void try { Integration::flushEvents(); } catch (Throwable $e) { - $this->container->get(StdoutLoggerInterface::class)->error((string) $e); + $this->logger->error((string) $e); } } From 7ce77b28152a10d16339ac1f99704fb21a61f39c Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:48:16 +0800 Subject: [PATCH 28/29] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9A=84Redis=E5=91=BD=E5=90=8D=E7=A9=BA?= =?UTF-8?q?=E9=97=B4=E5=AF=BC=E5=85=A5=E4=BB=A5=E6=B8=85=E7=90=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sentry/src/Listener/EventHandleListener.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index ba4a376b0..f71bfc8e7 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -31,7 +31,6 @@ use Hyperf\RpcServer\Server as RpcServer; use Hyperf\Server\Event; use Psr\Container\ContainerInterface; -use Redis; use Sentry\Breadcrumb; use Sentry\SentrySdk; use Throwable; From a2f167406f9bd128f2ca7d014430a0e953164183 Mon Sep 17 00:00:00 2001 From: Deeka Wong <8337659+huangdijia@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:54:11 +0800 Subject: [PATCH 29/29] =?UTF-8?q?refactor:=20=E5=B0=86=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E7=9A=84=E9=94=AE=E9=9B=86=E4=B8=AD=E5=88=B0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E4=B8=AD=E4=BB=A5=E7=AE=80=E5=8C=96=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Listener/EventHandleListener.php | 71 ++++++++++--------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index f71bfc8e7..25561ceb4 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -39,6 +39,43 @@ class EventHandleListener implements ListenerInterface { public const HUB = 'sentry.context.hub'; + 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 Switcher $switcher, @@ -189,39 +226,7 @@ protected function handleBootApplication(object $event): void protected function setupRequestLifecycle(): void { - $keys = [ - 'sentry.enable.amqp', - 'sentry.enable.async_queue', - 'sentry.enable.command', - 'sentry.enable.crontab', - 'sentry.enable.kafka', - 'sentry.enable.request', - 'sentry.breadcrumbs.cache', - 'sentry.breadcrumbs.sql_queries', - 'sentry.breadcrumbs.sql_bindings', - 'sentry.breadcrumbs.sql_transaction', - 'sentry.breadcrumbs.redis', - 'sentry.breadcrumbs.guzzle', - 'sentry.breadcrumbs.logs', - 'sentry.enable_tracing', - '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', - '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', - ]; - - foreach ($keys as $key) { + foreach ($this->missingKeys as $key) { if (! $this->config->has($key)) { $this->config->set($key, true); }