diff --git a/src/sentry/publish/sentry.php b/src/sentry/publish/sentry.php index f80883b41..1718ebb31 100644 --- a/src/sentry/publish/sentry.php +++ b/src/sentry/publish/sentry.php @@ -43,6 +43,8 @@ // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#enable_logs 'enable_logs' => env('SENTRY_ENABLE_LOGS', false), + 'logs_channel_level' => env('SENTRY_LOGS_CHANNEL_LEVEL', Sentry\Logs\LogLevel::debug()), + // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#send_default_pii 'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false), diff --git a/src/sentry/src/Factory/ClientBuilderFactory.php b/src/sentry/src/Factory/ClientBuilderFactory.php index dacc35106..71cd4ac05 100644 --- a/src/sentry/src/Factory/ClientBuilderFactory.php +++ b/src/sentry/src/Factory/ClientBuilderFactory.php @@ -30,6 +30,7 @@ class ClientBuilderFactory 'integrations', 'http_chanel_size', // deprecated, will be removed in v3.2 'http_concurrent_limit', // deprecated, will be removed in v3.2 + 'logs_channel_level', 'transport_channel_size', 'transport_concurrent_limit', 'tracing', diff --git a/src/sentry/src/Listener/EventHandleListener.php b/src/sentry/src/Listener/EventHandleListener.php index 616c9a09c..387450537 100644 --- a/src/sentry/src/Listener/EventHandleListener.php +++ b/src/sentry/src/Listener/EventHandleListener.php @@ -22,15 +22,11 @@ use Hyperf\Database\Events as DbEvent; use Hyperf\DbConnection\Pool\PoolFactory as DbPoolFactory; use Hyperf\Event\Contract\ListenerInterface; -use Hyperf\Framework\Event\BootApplication; use Hyperf\HttpServer\Event as HttpEvent; -use Hyperf\HttpServer\Server as HttpServer; use Hyperf\Kafka\Event as KafkaEvent; use Hyperf\Redis\Event as RedisEvent; use Hyperf\Redis\Pool\PoolFactory as RedisPoolFactory; use Hyperf\RpcServer\Event as RpcEvent; -use Hyperf\RpcServer\Server as RpcServer; -use Hyperf\Server\Event; use Psr\Container\ContainerInterface; use Sentry\Breadcrumb; use Sentry\SentrySdk; @@ -45,43 +41,6 @@ */ class EventHandleListener implements ListenerInterface { - protected array $missingKeys = [ - // Enable - 'sentry.enable.amqp', - 'sentry.enable.async_queue', - 'sentry.enable.command', - 'sentry.enable.crontab', - 'sentry.enable.kafka', - 'sentry.enable.request', - // Breadcrumbs - 'sentry.breadcrumbs.cache', - 'sentry.breadcrumbs.sql_queries', - 'sentry.breadcrumbs.sql_bindings', - 'sentry.breadcrumbs.sql_transaction', - 'sentry.breadcrumbs.redis', - 'sentry.breadcrumbs.guzzle', - 'sentry.breadcrumbs.logs', - // Tracing - 'sentry.enable_tracing', - // Enable for tracing integrations - 'sentry.tracing.enable.amqp', - 'sentry.tracing.enable.async_queue', - 'sentry.tracing.enable.cache', - 'sentry.tracing.enable.command', - 'sentry.tracing.enable.crontab', - 'sentry.tracing.enable.kafka', - 'sentry.tracing.enable.request', - // Enable for tracing Spans - 'sentry.tracing.spans.cache', - 'sentry.tracing.spans.coroutine', - 'sentry.tracing.spans.db', - 'sentry.tracing.spans.elasticsearch', - 'sentry.tracing.spans.guzzle', - 'sentry.tracing.spans.rpc', - 'sentry.tracing.spans.redis', - 'sentry.tracing.spans.sql_queries', - ]; - public function __construct( protected ContainerInterface $container, protected Feature $feature, @@ -93,9 +52,6 @@ public function __construct( public function listen(): array { return [ - // Framework events - BootApplication::class, - // Database events DbEvent\QueryExecuted::class, DbEvent\TransactionBeginning::class, @@ -142,9 +98,6 @@ public function listen(): array public function process(object $event): void { match ($event::class) { - // Boot application events - BootApplication::class => $this->handleBootApplication($event), - // Database events DbEvent\QueryExecuted::class => $this->handleDbQueryExecuted($event), DbEvent\TransactionBeginning::class, @@ -206,63 +159,6 @@ protected function captureException(?Throwable $throwable): void } } - /** - * @param BootApplication $event - */ - protected function handleBootApplication(object $event): void - { - $this->setupRequestLifecycle(); - $this->setupRedisEventEnable(); - } - - protected function setupRequestLifecycle(): void - { - foreach ($this->missingKeys as $key) { - if (! $this->config->has($key)) { - $this->config->set($key, true); - } - } - - if ( - ! $this->feature->isEnabled('request') - && ! $this->feature->isTracingEnabled('request') - ) { - return; - } - - $servers = $this->config->get('server.servers', []); - - foreach ($servers as &$server) { - $callbacks = $server['callbacks'] ?? []; - $handler = $callbacks[Event::ON_REQUEST][0] ?? $callbacks[Event::ON_RECEIVE][0] ?? null; - - if (! $handler) { - continue; - } - - if ( - is_a($handler, HttpServer::class, true) - || is_a($handler, RpcServer::class, true) - ) { - $server['options'] ??= []; - $server['options']['enable_request_lifecycle'] = true; - } - } - - $this->config->set('server.servers', $servers); - } - - protected function setupRedisEventEnable(): void - { - if (! $this->config->has('redis')) { - return; - } - - foreach ($this->config->get('redis', []) as $pool => $_) { - $this->config->set("redis.{$pool}.event.enable", true); - } - } - /** * @param DbEvent\QueryExecuted $event */ diff --git a/src/sentry/src/Listener/SetupSentryListener.php b/src/sentry/src/Listener/SetupSentryListener.php new file mode 100644 index 000000000..00dd73000 --- /dev/null +++ b/src/sentry/src/Listener/SetupSentryListener.php @@ -0,0 +1,147 @@ +setupRequestLifecycle(); + $this->setupRedisEventEnable(); + $this->registerLoggerChannel(); + } + + protected function registerLoggerChannel(): void + { + if ( + ! $this->config->get('sentry.enable_logs', true) + || $this->config->has('logger.sentry') + ) { + return; + } + + $this->config->set('logger.sentry', [ + 'handler' => LogsHandler::class, + 'constructor' => [ + 'group' => 'sentry', + 'logLevel' => $this->config->get('sentry.logs_channel_level'), + 'bubble' => true, + ], + 'formatter' => null, + 'processors' => [], + ]); + } + + protected function setupRequestLifecycle(): void + { + foreach (self::MISSING_KEYS as $key) { + if (! $this->config->has($key)) { + $this->config->set($key, true); + } + } + + if ( + ! $this->feature->isEnabled('request') + && ! $this->feature->isTracingEnabled('request') + ) { + return; + } + + $servers = $this->config->get('server.servers', []); + + foreach ($servers as &$server) { + $callbacks = $server['callbacks'] ?? []; + $handler = $callbacks[Event::ON_REQUEST][0] ?? $callbacks[Event::ON_RECEIVE][0] ?? null; + + if (! $handler) { + continue; + } + + if (is_a($handler, HttpServer::class, true) || is_a($handler, RpcServer::class, true)) { + $server['options'] ??= []; + $server['options']['enable_request_lifecycle'] = true; + } + } + + $this->config->set('server.servers', $servers); + } + + protected function setupRedisEventEnable(): void + { + if (! $this->config->has('redis')) { + return; + } + + foreach ($this->config->get('redis', []) as $pool => $_) { + $this->config->set("redis.{$pool}.event.enable", true); + } + } +}