> ## Documentation Index
> Fetch the complete documentation index at: https://docs.snakysec.com/llms.txt
> Use this file to discover all available pages before exploring further.

# OBSERVABILITY

# OBSERVABILITY — Sentry wiring & scrubbing

Configuration Sentry full-pipeline (client / server / edge + workers BullMQ + webhook + génération GRC/rapport). DSN chargé depuis Vault, scrubbing PII actif par défaut.

***

## Architecture

```
┌──────────────┐   DSN + auth token   ┌──────────────┐
│    Vault     │─────────────────────▶│instrumentation│
│  mssp/plat.  │                      │     .ts       │
└──────────────┘                      └──────┬────────┘
                                             │ Sentry.init()
                   ┌─────────────────────────┼────────────────────────┐
                   ▼                         ▼                        ▼
           sentry.client.config.ts   sentry.server.config.ts   sentry.edge.config.ts
                 (navigateur)           (API + workers)              (edge runtime)
```

* `platform/src/instrumentation.ts` — lit les secrets Vault (incl. `SENTRY_DSN`, `SENTRY_AUTH_TOKEN`) avant d'initialiser Sentry. Exécuté **une fois** au démarrage serveur.
* `platform/sentry.{client,server,edge}.config.ts` — 3 configs séparées, toutes avec `beforeSend` scrubbing + `beforeBreadcrumb` filtrage console.

## Scope de capture

| Surface                                   | Capturé | Mécanisme                                                                                               |
| ----------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------- |
| API routes (`/app/api/**`)                | Auto    | SDK Next.js instrumentation                                                                             |
| Workers BullMQ                            | Oui     | `Sentry.captureException` dans handlers `audit-import-worker`, `monthly-digest-worker`, `alerts-worker` |
| Webhook GitLab                            | Oui     | Capture sur HMAC invalide, payload malformé, timeout                                                    |
| Génération GRC                            | Oui     | `Sentry.withScope` enrichi de `{ clientId, documentType, language }`                                    |
| Génération rapport audit (PDF/Excel/HTML) | Oui     | `Sentry.withScope` enrichi de `{ clientId, auditId, format }`                                           |
| Erreurs client (React)                    | Oui     | ErrorBoundary + auto                                                                                    |

## Scrubbing PII

Configuré dans `beforeSend` (server) :

### Headers

* Denylist : `authorization`, `cookie`, `x-vault-token`, `x-gitlab-token`, `x-api-key`
* Remplacés par `[REDACTED]`

### Body

* Clés sensibles (`password`, `secret`, `token`, `apiKey`, `privateKey`, etc.) → `[REDACTED]`
* Body > 10 KB tronqué avec suffixe `…[TRUNCATED]`
* Cookies complets → `{ scrubbed: "[REDACTED]" }`

### User context

* `event.user.email` supprimé
* `event.user.ip_address` supprimé (RGPD)

### Env vars

Pattern regex appliqué aux env vars de `event.contexts.runtime.env` :

* `/AUTH_SECRET/i`
* `/ENCRYPTION_KEY/i`
* `/_PASSWORD$/i`
* `/VAULT_/i`
* `/GITLAB_TOKEN/i`
* `/ENTRA_.*_(SECRET|KEY|PEM)/i`
* `/SENTRY_AUTH_TOKEN/i`

### Breadcrumbs console

Les console logs matchant `/vault|secret|token|password|AUTH_SECRET|ENCRYPTION_KEY/i` sont **droppés** (retour `null` dans `beforeBreadcrumb`).

## Ignore rules (réduction de bruit)

* `CredentialsSignin` — 401 NextAuth routiniers (utilisateur non loggé)
* `AccessDenied` — redirections RBAC normales
* `NEXT_NOT_FOUND` / `NEXT_REDIRECT` — contrôle de flux Next.js

## Release & environment

* `SENTRY_RELEASE` = commit SHA court (injecté build-arg Docker)
* `SENTRY_ENVIRONMENT` = `production` | `preprod` | `development`
* `tracesSampleRate` = 0.1 (10% des transactions tracées en prod)

## Source maps

Upload automatique via `@sentry/nextjs` à l'étape build Docker :

* `SENTRY_AUTH_TOKEN` injecté en build-arg depuis Vault
* Source maps liées au `release` tag = commit SHA
* Permet stack traces dé-minifiées sur erreurs client

## Alertes (Sentry dashboard)

Configurées côté Sentry (pas dans le code) :

| Règle                 | Condition                                            | Canal             |
| --------------------- | ---------------------------------------------------- | ----------------- |
| Prod error spike      | ≥ 5 new events / 15 min sur `environment:production` | Email MSSP\_ADMIN |
| Worker failure        | Any event `level:error` avec tag `job:*`             | Email MSSP\_ADMIN |
| GRC generation failed | Event avec tag `feature:grc-pdf`                     | Email MSSP\_ADMIN |

## Vérification post-déploiement

1. **Erreur de test** : `throw new Error("sentry-test")` dans un handler → event reçu avec `release = <commit-sha>`
2. **Scrubbing** : inspecter le payload → aucun `AUTH_SECRET`, `*_PASSWORD`, `VAULT_TOKEN` ne doit apparaître
3. **Worker** : throw dans `monthly-digest-worker` → event reçu avec contexte `{ clientId, jobId }`
4. **Client** : throw dans un composant React → stack trace dé-minifiée visible

## Migration self-hosted (P3)

Planifiée Q3-Q4 2026, déclencheur = 1er client payant (données de sécurité en environnement tiers = risque).

* VPS dédié 4 vCPU / 16 GB RAM / 40 GB NVMe
* Rotation DSN dans Vault uniquement (aucun changement code applicatif)
* Même scrubbing, même pipeline

Voir [roadmap-2026-Q2.md §7.1](roadmap-2026-Q2.md#71-migration-sentry-self-hosted).
