%PDF- %PDF-
Direktori : /www/loslex/demo/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Console/ |
Current File : /www/loslex/demo/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Console/TestCommand.php |
<?php namespace Sentry\Laravel\Console; use Exception; use Illuminate\Console\Command; use Illuminate\Support\Str; use Psr\Log\AbstractLogger; use Sentry\ClientBuilder; use Sentry\Laravel\Version; use Sentry\State\Hub; use Sentry\State\HubInterface; use Sentry\Tracing\SpanContext; use Sentry\Tracing\TransactionContext; use Sentry\Tracing\TransactionSource; use Throwable; class TestCommand extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'sentry:test {--transaction} {--dsn=}'; /** * The console command description. * * @var string */ protected $description = 'Generate a test event and send it to Sentry'; /** * Buffer of log messages generated by the Sentry SDK. * * @var array */ private $logMessages = []; /** * Execute the console command. * * @return int */ public function handle(): int { // Maximize error reporting $old_error_reporting = error_reporting(E_ALL | E_STRICT); $dsn = $this->option('dsn'); $laravelClient = null; try { $laravelClient = app(HubInterface::class)->getClient(); } catch (Throwable $e) { // Ignore any errors related to getting the client from the Laravel container // These errors will surface later in the process but we should not crash here } // If the DSN was not passed as option to the command we use the registered client to get the DSN from the Laravel config if ($dsn === null) { $dsnObject = $laravelClient === null ? null : $laravelClient->getOptions()->getDsn(); if ($dsnObject !== null) { $dsn = (string)$dsnObject; $this->info('DSN discovered from Laravel config or `.env` file!'); } } // No DSN found from the command line or config if (!$dsn) { $this->error('Could not discover DSN!'); $this->printDebugTips(); return 1; } try { $clientBuilder = ClientBuilder::create([ 'dsn' => $dsn, 'release' => $laravelClient === null ? null : $laravelClient->getOptions()->getRelease(), 'environment' => $laravelClient === null ? null : $laravelClient->getOptions()->getEnvironment(), 'traces_sample_rate' => 1.0, ]); } catch (Exception $e) { $this->error($e->getMessage()); return 1; } // Set the Laravel SDK identifier and version $clientBuilder->setSdkIdentifier(Version::SDK_IDENTIFIER); $clientBuilder->setSdkVersion(Version::SDK_VERSION); // We set a logger so we can surface errors thrown internally by the SDK $clientBuilder->setLogger(new class($this) extends AbstractLogger { private $command; public function __construct(TestCommand $command) { $this->command = $command; } public function log($level, $message, array $context = []): void { if ($level === 'error') { $this->command->logMessageFromSDK($message); } } }); $hub = new Hub($clientBuilder->getClient()); $this->info('Sending test event...'); $exception = $this->generateTestException($this->name, ['foo' => 'bar']); $eventId = $hub->captureException($exception); if (!$eventId) { $this->error('There was an error sending the event.'); $this->printDebugTips(); return 1; } $this->info("Test event sent with ID: {$eventId}"); if ($this->option('transaction')) { $this->clearLogMessagesFromSDK(); $transactionContext = new TransactionContext(); $transactionContext->setSampled(true); $transactionContext->setName('Sentry Test Transaction'); $transactionContext->setSource(TransactionSource::custom()); $transactionContext->setOp('sentry.test'); $transaction = $hub->startTransaction($transactionContext); $spanContext = new SpanContext(); $spanContext->setOp('sentry.sent'); $span = $transaction->startChild($spanContext); $this->info('Sending transaction...'); $span->finish(); $transactionId = $transaction->finish(); if (!$transactionId) { $this->error('There was an error sending the transaction.'); $this->printDebugTips(); return 1; } $this->info("Transaction sent with ID: {$transactionId}"); } error_reporting($old_error_reporting); return 0; } /** * Generate a test exception to send to Sentry. * * @param $command * @param $arg * * @return \Exception */ protected function generateTestException($command, $arg): Exception { // Do something silly try { throw new Exception('This is a test exception sent from the Sentry Laravel SDK.'); } catch (Exception $exception) { return $exception; } } public function logMessageFromSDK(string $message): void { $this->logMessages[] = $message; } private function clearLogMessagesFromSDK(): void { $this->logMessages = []; } private function printDebugTips(): void { $emittedSDKErrors = false; $probablySSLError = false; foreach ($this->logMessages as $logMessage) { $emittedSDKErrors = true; $this->error("SDK: {$logMessage}"); if (Str::contains($logMessage, ['SSL certificate problem', 'certificate has expired'])) { $probablySSLError = true; } } if ($probablySSLError) { $this->warn('The problem might be related to the Let\'s Encrypt root certificate that expired and your machine not having an up-to-date enough OpenSSL version or still having the expired root in your certificate authority store.'); $this->warn('For more information you can check out this forum post from Let\'s Encrypt that contains helpful links on how to resolve this for your environment: https://community.letsencrypt.org/t/production-chain-changes/150739/4'); } elseif ($emittedSDKErrors) { $this->error('Please check the error message from the SDK above for further hints about what went wrong.'); } else { $this->error('Please check if your DSN is set properly in your `.env` as `SENTRY_LARAVEL_DSN` or in your config file `config/sentry.php`.'); } } }