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,Actionen optioneleParentUpdate. De daadwerkelijkeINSERT-query (inclusiefDebug-vlag bepaald viaUpdateScriptDAO::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 = truewordtCompleted = 1gezet. - Afsluiten (
endLog(), regel 168): roeptflushLog(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