Рубрики
Uncategorized

Использование sentry в сверхтонких

документ века: https://docs.sentry.io/ После знакомства с механизмом перехвата исключений архитектуры hyper я думаю, что sentry можно использовать в механизме перехвата исключений очень разумным способом. Сначала установите sentry: composer требует sentry/sdk:2.0.3 Добавьте в hyperf.php UTF-8…

часовой документ:

часовой документ:

После знакомства с механизмом перехвата исключений архитектуры hyper я думаю, что sentry можно использовать в механизме перехвата исключений очень разумным способом.

Сначала установите часового:

composer require sentry/sdk:2.0.3

Добавьте в hyperf.php файл после установки

Sentry\init(\['dsn' => 'your dsn']);

В приложении\Exception\Handle\AppExceptionHandle

use Sentry;
public function handle(Throwable $throwable, ResponseInterface $response)
{
    Sentry\captureException($throwable);
    return $response->withStatus(500)->withBody(new SwooleStream('Internal Server Error.'));
}

В это время мы перехватываем исключение и обнаруживаем, что сторожевой сервер не получает исключение. Просматривая исходный код, обнаруживается, что механизм отправки Sentry заключается в очистке информационной очереди после завершения процесса, в то время как hyperf основан на архитектуре swoole. После запроса процесс не будет выпущен, поэтому сторожевой сервер не сможет получать данные. Третий параметр в методе построения транспорта Sentry\Transport\Http объясняется следующим образом:

This flag controls whether to delay sending of the events until the shutdown of the application

Значение по умолчанию равно true. Sentry не будет отправлять исключение на сервер в первый раз после отправки исключения, но будет ждать до конца процесса, прежде чем отправлять исключение. Третий параметр Http-транспорта, созданный методом init в sentry \ \ \ \ client builder – > метод createtransportinstance имеет значение true, и запрос можно получить, изменив его на false.

Но тогда возникает еще одна проблема. Механизм push sentry использует библиотеку curl, в то время как swoole не поддерживает совместное программирование curl, что означает, что если в производственной среде одновременно возникнет большое количество исключений, процесс будет заблокирован, а производительность hyperf будет серьезно снижена.

Асинхронная обработка необходима срочно!

После повторного просмотра документа curl push обрабатывается с помощью транспортного класса. Транспорт по умолчанию – Http-транспорт, который также известен как синхронный механизм push. В то же время также предусмотрены асинхронный транспорт и spooltransport.

Удалить Sentryinit метод hyperf.php В App\Exception\Handle\AppExceptionHandle измените на следующее

use Sentry\ClientBuilder;
use Sentry\Transport\SpoolTransport;
use Sentry\Transport\HttpTransport;
use Sentry\State\Hub;
use Sentry\Spool\MemorySpool;
use Http\Discovery\HttpAsyncClientDiscovery;
use Http\Discovery\MessageFactoryDiscovery;
use Sentry\Options;

public function handle(Throwable $throwable, ResponseInterface $response)
{
    $options = ['dsn' => 'https://@sentry.io/'\];
    $optionObj = new Options($options);
    $spool = new MemorySpool();
    $transport = new SpoolTransport($spool);
    $httpTransport = new HttpTransport($optionObj, HttpAsyncClientDiscovery::find(), MessageFactoryDiscovery::find());
    $builder = ClientBuilder::create($options);
    $builder->setTransport($transport);
    Hub::getCurrent()->bindClient($builder->getClient());
    Hub::getCurrent()->captureException($throwable);
    // Calling this method will start to clear the queue that caught the exception before. After thinking about it, it is reasonable to put it in the timed task to clear the queue regularly.
    $spool->flushQueue($httpTransport);
}

Начните отлавливать исключения. Как может сторожевой сервер не получить запрос, оставив вас без технологии?

После устранения неполадок выясняется, что причиной является проблема с конфигурацией URL-адреса асинхронного httpTransport, созданного httapasyncclientdiscovery:: find(). После тщательного изучения исходного кода обнаруживается, что можно использовать метод client builder > createtransportinstance. Метод по умолчанию – private, который можно использовать для создания транспортных объектов, изменив его на public. Измененный код выглядит следующим образом

App\Exception\Handle\AppExceptionHandle выглядит следующим образом

use Sentry\ClientBuilder;
use Sentry\Transport\SpoolTransport;
use Sentry\State\Hub;
use Sentry\Spool\MemorySpool;

public function handle(Throwable $throwable, ResponseInterface $response)
{
    $options = ['dsn' => 'https://@sentry.io/'\];
    $spool = new MemorySpool();
    $transport = new SpoolTransport($spool);
    $builder = ClientBuilder::create($options);
    $httpTransport = $builder->createTransportInstance();
    $builder->setTransport($transport);
    Hub::getCurrent()->bindClient($builder->getClient());
    Hub::getCurrent()->captureException($throwable);
    // Calling this method will start to clear the queue that caught the exception before. After thinking about it, it is reasonable to put it in the timed task to clear the queue regularly.
    $spool->flushQueue($httpTransport);
}

Перехватите исключение. Сторожевой сервер получает исключение Здесь, $spool – > flushqueue ($http transport); он будет активно передавать перехваченное исключение очереди. Подумав об этом, разумно поместить его в задачу синхронизации, чтобы регулярно очищать очередь.

Оригинал: “https://programmer.help/blogs/using-sentry-in-hyperf.html”