Включение Sentry в консольной программе Symfony без установки всего Symfony

У меня есть простая консольная программа:

namespace MyApp\Console;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;

class MaConsole extends Command {
 protected function configure()
 {  
    $this->setDescription('Console\'s not console');
 }

  protected function execute(
        \Symfony\Component\Console\Input\InputInterface $input,
        \Symfony\Component\Console\Output\OutputInterface $output
  ) {
    $output->writeln('Doing Stuff');
  }
}

И загружаю вот так:

namespace MyApp;

use Symfony\Component\Console\Application as SymfonyApplication;
use MyApp\Console\MaConsole;

class Application extends SymfonyApplication
{
    public function __construct(
        string $name = 'staff',
        string $version = '0.0.1'
    ) {
        parent::__construct($name, $version);

        throw new \Exception('Test Sentry on Playground');
        $this->add(new MaConsole());
    }
}

И я хочу зарегистрировать исключение, указанное выше в службе Sentry. Итак, моя точка входа:

use MyApp\Application;

require __DIR__ . '/vendor/autoload.php';

Sentry\init([
    'dsn' => getenv('SENTRY_DSN'),
    'environment' => getenv('ENVIRONMENT')
]);

$application = (new Application())->run();

Но мне не удается зарегистрировать ошибку в часовом, даже если я установил правильные переменные среды.

Приложение не загружает фреймворк Full Symfony, но вместо этого использует только консольные компоненты, поэтому я понятия не имею, следует ли мне использовать интеграцию Sentry Symfony: https://docs.sentry.io/platforms/php/symfony/

Причина в том, что я не знаю, как в моем случае загрузить пакет, поэтому я использую SDK.

Изменить 1:

Я также попытался поймать исключение и вручную зарегистрировать его, но по какой-то причине тоже не регистрируется:

use MyApp\Application;

require __DIR__ . '/vendor/autoload.php';

try {
  Sentry\init([
    'dsn' => getenv('SENTRY_DSN'),
    'environment' => getenv('ENVIRONMENT')
  ]);
  throw new \Exception('Test Sentry on Playground');

  $application = (new Application())->run();
} catch(Exception $e) {
    Sentry\captureException($e);
}

person Dimitrios Desyllas    schedule 03.09.2019    source источник


Ответы (1)


Вы можете использовать диспетчер:

use Symfony\Component\EventDispatcher\EventDispatcher;

$dispatcher = new EventDispatcher();
$dispatcher->addListener(ConsoleEvents::ERROR, function (ConsoleErrorEvent $event) use ($env) {
    Sentry\init([
        'dsn' => getenv('SENTRY_DSN'),
        'environment' => $env
    ]);
    Sentry\captureException($event->getError());
});

$kernel = new AppKernel($env, $debug);
$application = new Application($kernel);
$application->setDispatcher($dispatcher);
$application->run($input);
person PierrickM    schedule 26.02.2020
comment
Да, это так. Но я могу добавить несколько дополнительных обозначений. Sentry можно инициализировать только один раз, поэтому вы можете инициализировать его в основном скрипте приложения, а затем использовать диспетчер для обработки ошибки. Следовательно, Sentry\init можно использовать вне замыкания, обрабатывающего ошибку. - person Dimitrios Desyllas; 27.02.2020