Ga naar inhoud

Observability

De shop gebruikt drie lagen voor observability: Sentry voor fout- en performancemonitoring, applicatielogging naar de atx_log-database, en Matomo voor webanalyse.


Sentry

Initialisatie

Sentry wordt geïnitialiseerd in _www/appconfig/bootstrap.php (regel 13–22), direct na het laden van de autoloader:

// bootstrap.php:13
\Sentry\init([
    'dsn'                  => SENTRY_DSN,
    'environment'          => ENVIRONMENT,
    'release'              => require APP_PROJECT_DIR . '/.version.php',
    'max_value_length'     => 2048,
    'max_request_body_size' => 'always',
    'traces_sample_rate'   => 1.0,
    'profiles_sample_rate' => 1.0,
    'enable_logs'          => is_prod(),
]);

SENTRY_DSN is een PHP-constante die per omgeving in environment_constants.php gedefineerd wordt. In de Docker-ontwikkelomgeving is de DSN leeg ('') om ruis te vermijden (docker/environment_constants.docker.php:63).

Fatal-error hook

Een register_shutdown_function vangt fatale PHP-fouten op die buiten de normale exception-handler vallen (bootstrap.php:24–35). Bij E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR of E_PARSE wordt een Sentry\captureMessage() met severity fatal afgevuurd, gevolgd door \Sentry\logger()->flush().

Console-fouten

Wanneer een Symfony Console-commando (cli.php) crasht, onderschept de ConsoleEvents::ERROR-listener de uitzondering (cli.php:21–36). De fout wordt gelogd naar atx_log via LogUpdateDAO en gaat ook via Sentry naar het dashboard.

Instellingen

Parameter Waarde
traces_sample_rate 1.0 (100% tracing)
profiles_sample_rate 1.0 (100% profiling)
enable_logs Alleen op productie (is_prod())
max_value_length 2048 tekens per waarde
max_request_body_size 'always' (volledig request body)

Releases

De release-versie (release) wordt ingeladen vanuit .version.php in de projectroot. Zo kan Sentry fouten aan een specifieke release koppelen.


Applicatielogging — atx_log

Database

Alle cron- en commandouitvoeringen worden opgeslagen in de database atx_log (constante APP_DB_LOG = 'atx_log', _www/appconfig/constants.php:72), tabel log_update.

LogUpdateDAO

LogUpdateDAO (_core/model/dbclasses/atx/logs/LogUpdateDAO.php:7) beheert alle schrijf-operaties:

  • Aanmaken (constructor, regel 50): de constructor ontvangt Controller, Action en optionele ParentUpdate. De daadwerkelijke INSERT-query (inclusief Debug-vlag bepaald via UpdateScriptDAO::getScriptInfo) wordt uitgevoerd op regel 65.
  • Loggen (log($output, $isError), regel 94): voegt output toe aan de interne buffer; markeert het record als fout bij $bError = true; flusht automatisch bij >800 000 tekens.
  • Flushen (flushLog($end = false), regel 138): UPDATE log_update SET Output = concat(Output, :Output), Updated = NOW(), Duration = TIMESTAMPDIFF(SECOND, Added, NOW()), Error = :Error. Bij $end = true wordt Completed = 1 gezet.
  • Afsluiten (endLog(), regel 168): roept flushLog(true) aan.

LogUpdate-entity

LogUpdate (_core/model/classes/atx/logs/LogUpdate.php:5) heeft de velden: Id, ParentUpdate, Controller, Action, Output, Duration, Debug, Completed, Error, Added, Updated, UpdatedBy. De eerste negen zijn private class-properties; Added, Updated en UpdatedBy worden via de Fields()-array (regels 29–31) opgegeven en afgehandeld door de parent-klasse \atx\Generic.

Gebruik in cron-scripts

// Typisch patroon in een cron-script:
$dLogUpdate = new \atx\logs\LogUpdateDAO('ControllerNaam');
// ... werk uitvoeren ...
$dLogUpdate->log('Bericht', false /* geen fout */);
$dLogUpdate->endLog();

In cli.php registreert de ConsoleEvents::ERROR-listener hetzelfde patroon automatisch bij elke commando-uitzondering.

Opruiming

cleanLogs.php (_shopupdating/cronjobs/atx/logs/cleanLogs.php) roept UpdatingLogController::cleanLogUpdate() aan om oude records te verwijderen.


Matomo — webanalyse

Configuratie

Matomo werkt via server-side tracking met de PHP-tracker (matomo/matomo-php-tracker). Drie constanten sturen de verbinding (_www/appconfig/environment_constants.php.dist:29–31):

Constante Rol
MATOMO_SITE_ID Numeriek site-ID in Matomo
MATOMO_SITE_URL URL van de Matomo-instantie
MATOMO_TOKEN_AUTH API-token voor server-side tracking

MatomoFacade

MatomoFacade (src/Matomo/MatomoFacade.php:13) wikkelt de MatomoTracker en biedt deze methoden:

Methode Doel
trackSearch(term, results) Sitezoekopdracht tracken
trackProductView(article, price) Productpagina bijhouden; categorie, merk, type als Matomo-categorieen
trackCart(cart) Winkelwagen-update (artikelen + velgsets)
trackOrder(order) Orderconversie (artikelen + velgsets + doel 1)
trackNewRegistration(login) Nieuwe registratie (doel 3)
trackEvent(category, action, name, value) Generiek event
trackLogin() Login voltooid (event categorie "Login")

Aangepaste dimensie — "Dagen in mand"

Custom dimensie index 1 (bezoekscope) meet hoeveel dagen het oudste winkelwagenartikel in de mand zat vóór de bestelling. Buckets: 0-1 dag, 2-7 dagen, 8-30 dagen, 1-3 maanden, 3-12 maanden, > 1 jaar (src/Matomo/MatomoFacade.php:131–138). Wordt meegestuurd bij trackOrder().

Doelen

Doel-ID Trigger
1 Bestelling geplaatst (trackOrder)
3 Nieuwe registratie (trackNewRegistration)

Overzichtsdiagram

graph TD
    subgraph App
        PHP[PHP-request / cli.php]
        Fatal[Fatal-error hook]
    end

    subgraph Sentry
        SD[Sentry.io dashboard]
    end

    subgraph atx_log[(atx_log DB)]
        LU[log_update tabel]
    end

    subgraph Matomo
        MT[Matomo-instantie]
    end

    PHP -->|captureException / captureMessage| SD
    Fatal -->|captureMessage fatal| SD
    PHP -->|LogUpdateDAO::log / endLog| LU
    PHP -->|MatomoFacade::track*| MT