Přesun z salamek/raven-nette na kdyby/monolog se Sentry

theacastus
Člen | 81
+
0
-

Zdravím,

přebral jsem již běžící projekt a již jsem se dostal do bodu kdy potřebuji logovat a protože máme Sentry a používáme salamek/raven-nette, ale ten je abandoned, takže chci přejít na kdyby/monolog, ALE…

Četl jsem https://forum.nette.org/…mplementovat a i https://packagist.org/…/raven-nette jak přemigrovat na kdyby/monolog, jen jsem nenašel u monologu zda je podporované options pro sentry přes raven jako tomu bylo u salamek/raven-nette

Víte o nějakých tipech & tricích které se hodí u přesunu? nějaké nápady jak na to ?

Díky moc

Barbarossa
Člen | 74
+
+1
-

Ahoj,

config pro inspiraci:

monolog:
    name: MyName
    hookToTracy: true
    registerFallback: true
    handlers:
        raven: Monolog\Handler\RavenHandler(Raven_Client('<dsn>', [release: '1.0.0']))
    processors:
        - Monolog\Processor\GitProcessor
        - Monolog\Processor\WebProcessor
        - Kdyby\Monolog\Processor\PriorityProcessor
        - YourNamespace\SentryContextProcessor

a procesor:

class SentryContextProcessor
{
    /** @var User */
    private $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function __invoke(array $record)
    {
        // record the current user
    	$user = $this->user;
    	$record['context']['user'] = array(
        	'name' => $user->getName(),
        	'username' => $user->getUsername(),
        	'email' => $user->getEmail(),
    	);

        // Add various tags
        //$record['context']['tags'] = array('key' => 'value');

        // Add various generic context
        //$record['extra']['key'] = 'value';

        return $record;
    }
}

Editoval Barbarossa (27. 3. 2018 22:45)

theacastus
Člen | 81
+
0
-

Tohle by tedy mělo být ok?:

<?php
declare(strict_types=1);

namespace ProjectNS\Core;

use Doctrine\ORM\EntityManager;
use ProjectNS\Entities\User\User;
use ProjectNS\Core\Security\User as SecurityUser; // extends Nette\Security\User

class SentryContextProcessor
{
    /**
     * @var EntityManager
     */
    private $em;

    /**
     * @var SecurityUser
     */
    private $securityUser;

    public function __construct(EntityManager $entityManager, SecurityUser $securityUser)
    {
        $this->em = $entityManager;
        $this->securityUser = $securityUser;
    }

    public function __invoke(array $record)
    {
        $user = $this->em->getRepository(User::class)->find($this->securityUser->getId());

        if ($user instanceof User) // aka $this->securityUser->isLoggedIn()
        {
            $record['context']['user'] = [
                'name' => $user->getName(),
                'username' => $user->getUsername(),
                'email' => $user->getEmail()
            ];
        } else { /* TODO: Check if this is needed
            $record['context']['user'] = [
                'name' => 'Anonymous guest',
                'username' => 'guest',
                'email' => 'guest@domain.tld'
            ]; */
        }

        return $record;
    }
}

configurace monologu:

sentry:
    dsn: '<sentry dsn>'

extensions:
    monolog: Kdyby\Monolog\DI\MonologExtension

monolog:
    name: project.tld
    hookToTracy: true
    registerFallback: true
    handlers:
        raven: Monolog\Handler\RavenHandler(Raven_Client(%sentry.dsn%, [release: %version%, enviroment: 'production']))
    processors:
        - Monolog\Processor\GitProcessor
        - Monolog\Processor\WebProcessor
        - Kdyby\Monolog\Processor\PriorityProcessor
        - ProjectNS\Core\SentryContextProcessor
Barbarossa
Člen | 74
+
0
-

Jestli je to opravdu ok, to teprve uvidíš. Jen bych (pro ostatní) doplnil, že konfigurace parametru senry.dsn by měla být v parameters:

parameters:
	sentry:
		dsn: '<sentry dsn>'

a pro record anonymního uživatele není v default nic potřeba (sentry mu přidělí id a zjistí základní informace).

Jinak pokud máš vlastní rozšíření pro SecurityUser, tak je vhodnější přebírat orm data od něj (třeba vlastní metodou getData(), která ti vrátí tu entitu User (pro aplikaci se to pak tahá jen jednou, pokud to orm nehlídá).

mcmatak
Člen | 490
+
0
-

neměl by jste někdo aktualizaci? jelikož sentry už raven_client nepoužívá

David Matějka
Moderator | 6445
+
+4
-

@mcmatak nejsnazsi integrace sentry zhruba

composer require contributte/monolog sentry/sdk
extensions:
	monolog: Contributte\Monolog\DI\MonologExtension
monolog:
	channel:
		default:
			handlers:
				- Sentry\Monolog\Handler(level: Monolog\Logger::WARNING)
services:
	sentryClientBuilder: Sentry\ClientBuilder::create(%sentry%)
	sentryClient:
		class: Sentry\ClientInterface
		create: @sentryClientBuilder::getClient()
	sentryHub: Sentry\State\Hub
parameters:
	sentry:
		dsn: '<your dsn>'
Barbarossa
Člen | 74
+
0
-

@DavidMatějka ahoj poradil bys mi prosím jak si přes ten monolog můžu přidat vlastní tagy? Musím si udělat vlastní HUB? + pokud je aplikace schovaná za proxy (kubernetes), tak už se nepředá informace o prohlížeči, URL apod jak ji donutit to převzít z HTTP_X_ headers?