<?php
namespace App\V4\EventSubscriber\Sentry;
use App\Command\SentryMonitoringAwareInterface;
use App\V4\Logger\SentryMonitoring;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CommandMonitoringEventSubscriber implements EventSubscriberInterface
{
/**
* @var SentryMonitoring
*/
private $sentryMonitoring;
private $checkInId = 'missing-check-in-id';
public function __construct(SentryMonitoring $sentryMonitoring)
{
$this->sentryMonitoring = $sentryMonitoring;
}
public static function getSubscribedEvents(): array
{
return [
ConsoleEvents::COMMAND => 'notifyBegin',
ConsoleEvents::ERROR => 'notifyError',
ConsoleEvents::TERMINATE => 'notifyFinish',
];
}
public function supports(?Command $command): bool
{
return $command instanceof SentryMonitoringAwareInterface;
}
public function notifyBegin(ConsoleCommandEvent $event): void
{
/** @var SentryMonitoringAwareInterface&Command $command */
$command = $event->getCommand();
if (!$this->supports($command)) {
return;
}
$this->checkInId = $this
->sentryMonitoring
->notifyCronInProgress($command->getMonitorSlug());
}
public function notifyError(ConsoleErrorEvent $event): void
{
/** @var SentryMonitoringAwareInterface&Command $command */
$command = $event->getCommand();
if (!$this->supports($command)) {
return;
}
$this
->sentryMonitoring
->notifyCronFailed($command->getMonitorSlug(), $this->checkInId);
}
public function notifyFinish(ConsoleTerminateEvent $event): void
{
/** @var SentryMonitoringAwareInterface&Command $command */
$command = $event->getCommand();
if (!$this->supports($command)) {
return;
}
$this
->sentryMonitoring
->notifyCronFinished($command->getMonitorSlug(), $this->checkInId);
}
}