- GlitchTip über die Sentry-SDKs; Datenschutzfilter (nur User-ID, keine
Request-Bodys, Tokens aus URL/Query/Referer, E-Mails aus Meldungen).
Browser-SDK erst beim ersten Fehler nachgeladen.
- ReportErrorSignals: tote interne Links (404 mit eigenem Referrer), 403/429
für Angemeldete, 419 als gedrosselte Warnung.
- /health (Bearer-Token): DB, Cache, Queue-Rückstau, Scheduler-Herzschlag,
Plattenplatz → 200/503; Scheduler und Plattenplatz auch im Systemstatus.
- OperationalAlert zusätzlich per ntfy (JSON-POST), unabhängig von der Mail.
- Verlauf: login_failed (Grund unbekannt/kein Passwort/falsch),
login_lockout, two_factor_failed; IP nur als gekürzter HMAC.
- Umami: Kundenbereich mit eigenem Schalter und identify('user-<id>'),
nie im Admin/bei Impersonation; Query-Filter auch auf den Webseiten
(signierte Links gingen bisher an Umami).
- queue:prune-failed nach 30 Tagen.
- Versionsnummer: config('app.version') aus APP_VERSION oder Datei RELEASE
(git describe --tags), in GlitchTip, /health, Systemstatus, artisan about.
Plan: dev/betrieb/monitoring-plan.md (Entscheidungen M1–M9).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 lines
1.2 KiB
PHP
38 lines
1.2 KiB
PHP
<?php
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Support\Facades\Blade;
|
|
|
|
/**
|
|
* Browserfehler (Monitoring-Plan 1.2): Meta-Konfiguration und Skript nur mit
|
|
* DSN; die User-ID ist der einzige Personenbezug.
|
|
*/
|
|
beforeEach(function () {
|
|
$this->withoutVite();
|
|
});
|
|
|
|
test('nothing is rendered without a browser dsn', function () {
|
|
config()->set('monitoring.browser.dsn', null);
|
|
|
|
expect(Blade::render('<x-monitoring.browser-errors />'))->toBe('');
|
|
});
|
|
|
|
test('the configuration carries dsn, release and the user id only', function () {
|
|
config()->set('monitoring.browser.dsn', 'https://public@glitchtip.test/2');
|
|
config()->set('sentry.release', 'abc1234');
|
|
$user = User::factory()->create(['email' => 'kunde@example.com']);
|
|
$this->actingAs($user);
|
|
|
|
$html = Blade::render('<x-monitoring.browser-errors build="build/portal" area="portal" />');
|
|
|
|
preg_match('/<meta name="pk-error-reporting" content="([^"]+)"/', $html, $match);
|
|
$config = json_decode(html_entity_decode($match[1]), true);
|
|
|
|
expect($config)->toMatchArray([
|
|
'dsn' => 'https://public@glitchtip.test/2',
|
|
'release' => 'abc1234',
|
|
'userId' => $user->id,
|
|
'area' => 'portal',
|
|
])
|
|
->and($html)->not->toContain('kunde@example.com');
|
|
});
|