Skip to content

gluck1986/yii3sentry

Repository files navigation

This implementation sentry tracing using logs.

Install

for gitlab

you should add the repository to your project

    composer config repositories.<gitlab domain>/109 '{"type": "composer", "url": "https://<gitlab domain>/api/v4/group/109/-/packages/composer/packages.json"}'

if you have the error 404 you should add auth.json into composer.json directory by command and add this file to .gitignore

    composer config gitlab-token.<DOMAIN-NAME> <personal_access_token>

Configure:

add code block below to your params.php and type your DSN also you can define your environment and release, for example TAG from gitlab.ci

    'sentry' =>
        [
            'options' => [
                'dsn' => '',
                'environment' => 'local', //SENTRY_ENVIRONMENT, //YII_ENV,
                'release' => 'dev',  //SENTRY_RELEASE, //TAG
                // @see: https://docs.sentry.io/platforms/php/configuration/options/#send-default-pii
                'send_default_pii' => true,
                'traces_sample_rate' => 1.0,
            ],
            'log_level' => 'warning',
            'tracing'          => [
                // Indicates if the tracing integrations supplied by Sentry should be loaded
                'default_integrations'   => true,
            ],
        ]

add APP_START_TIME const into index.php and yii.php

define('APP_START_TIME', microtime(true));

add log targets for breadcrumbs and tracing in app/config/common/logger.php or another config file with logger settings

return [
    LoggerInterface::class => static function (
        /** your_another_log_target $your_log_target */
        \Webvork\Yii3\Sentry\SentryBreadcrumbLogTarget $sentryLogTarget,
        \Webvork\Yii3\Sentry\Tracing\SentryTraceLogTarget $sentryTraceLogTarget
    ) {
        return new Logger([
        /** $your_log_target */
            $sentryLogTarget,
            $sentryTraceLogTarget
        ]);
    }
];

if you want to see your logs in sentry timeline, you need to use keys (float)'time' and (float)'elapsed' in log context array


add DB log decorator for tracing db queries in app/config/params.php

'yiisoft/yii-cycle' => [
        // DBAL config
        'dbal' => [
            // SQL query logger. Definition of Psr\Log\LoggerInterface
            // For example, \Yiisoft\Yii\Cycle\Logger\StdoutQueryLogger::class
            'query-logger' => \Webvork\Yii3\Sentry\DbLoggerDecorator::class,
            /**
            * ...
            * your another db settings 
            **/
    ]
]

add into app/config/params.php into middleware section SetRequestIpMiddleware

    'middlewares' => [
        ErrorCatcher::class,
        Webvork\Yii3\Sentry\Http\SetRequestIpMiddleware::class, //add this
        Router::class,
    ],

add into app/config/common/router.php tracing middleware

  RouteCollectionInterface::class => static function (RouteCollectorInterface $collector) use ($config) {
        $collector
            ->middleware(FormatDataResponse::class)
            ->middleware(JsonParseMiddleware::class)
            ->middleware(ExceptionMiddleware::class)
            ->middleware(\Webvork\Yii3\Sentry\Tracing\SentryTraceMiddleware::class) // add this
            ->addGroup(
                Group::create('')
                    ->routes(...$config->get('routes'))
            );

        return new RouteCollection($collector);
    },

if you want to trace guzzle requests and add sentry headers to external queries, add this into your config\httpClient.php or into another factories config file

    GuzzleHttp\Client::class => static function (ContainerInterface $container) {
        $stack = new HandlerStack();
        $stack->setHandler(new CurlHandler());
        $factory = $container->get(GuzzleMiddlewareFactory::class);
        $middleware = static function (callable $handler) use ($factory): callable {
            return $factory->factory($handler);
        };

        $stack->push($middleware);

        return new GuzzleHttp\Client([
            'handler' => $stack,
        ]);
    },

if your transaction too heavy you can slice it to several transactions with clearing log buffer.

use SentryConsoleTransactionAdapter or SentryWebTransactionAdapter

for example:

        /** some code with default transaction */
        /** commit default transaction and send data to sentry server */
        $sentryTraceString = $this->sentryTransactionAdapter->commit();
        while ($currentDate <= $endDate) {
            $this->sentryTransactionAdapter->begin($sentryTraceString)
                ->setName('my_heavy_operation/iteration')
                ->setData(['date' => $currentDate->format('Y-m-d')]);

            $this->process($currentDate, $sentryTraceString);
            $this->sentryTransactionAdapter->commit();
        }
        $this->sentryTransactionAdapter->begin($sentryTraceString)
            ->setName('my_heavy_operation done, terminating application');
    /** transaction will commit when application is terminated */

for this example all new transactions will linked to transaction with $sentryTraceString

About

yii3 sentry over logs traceing integration

Resources

Stars

Watchers

Forks

Packages

No packages published