# Analytics et observabilité auto-hébergées

POC répondant au cahier des charges [self_hosted_analayctics_observability.md](https://github.com/waxland/saclay-research/blob/main/self_hosted_analayctics_observability.md) : mesurer l'audience et observer l'application **sans qu'aucune donnée sorte vers un tiers**, avec des paquets réutilisables hors du projet.

:::caution{title="Ne pas activer en production"}
Rien ne part tant que rien n'est activé, et rien ne doit être activé avant la validation de la DPO ([Vie privée](/analytics/conception/privacy)). L'auto-hébergement ne vaut pas conformité.
:::

---

## 📑 Sommaire de la section

<FeatureGrid cols={2}>
  <FeatureCard
    icon="🚀"
    title="Prise en main"
    description="Démarrer les quatre services en local, les variables de configuration, le catalogue d'événements typés."
    badge="3 pages"
    href="/analytics/prise-en-main/quickstart"
  />
  <FeatureCard
    icon="📐"
    title="Conception"
    description="Deux chaînes séparées, frontière navigateur / serveur, fournisseurs comparés par essai, OpenTelemetry, vie privée, sécurité."
    badge="5 pages"
    href="/analytics/conception/architecture"
  />
  <FeatureCard
    icon="🔧"
    title="Exploitation"
    description="Déploiement, tableaux de bord, capacité, sauvegardes, reprise après incident, montées de version, runbook, dépannage."
    badge="8 pages"
    href="/analytics/exploitation/deployment"
  />
  <FeatureCard
    icon="📋"
    title="Bilans"
    description="L'audit du dépôt avant toute modification, et la revue critique du branchement sur le site."
    badge="2 pages"
    href="/analytics/bilans/audit"
  />
</FeatureGrid>

---

## 🧭 Deux chaînes qui ne se mélangent pas

<Mermaid
  title="Audience d'un côté, observabilité de l'autre"
  caption="Un événement métier ne part pas dans les traces, un span ne part pas chez un fournisseur d'audience. Seuls traceId et spanId circulent dans les journaux, comme identifiants de corrélation."
  chart={`flowchart TB
  APP["Application Next.js / Node"]
  subgraph A["@workspace/analytics"]
    direction TB
    EV["Événements typés<br/>consentement, identité anonyme"]
    Q["Caviardage, files, routage<br/>une file par fournisseur"]
    EV --> Q
  end
  subgraph O["@workspace/observability"]
    direction TB
    SDK["SDK OpenTelemetry<br/>journaux, métriques, traces"]
    COL["Collecteur OTLP"]
    SDK --> COL
  end
  RY["Rybbit"]
  UM["Umami"]
  MA["Matomo"]
  OO["OpenObserve"]
  APP --> A
  APP --> O
  Q --> RY
  Q --> UM
  Q --> MA
  COL --> OO`}
/>

---

## 📍 État mesuré au 28 octobre 2026

| Ce qui est fait                                                                           | État                                  |
| ----------------------------------------------------------------------------------------- | ------------------------------------- |
| Quatre services en local, données **interrogeables** (`pnpm telemetry:test`)              | <Status tone="ok">15 / 15</Status>    |
| Site construit, navigateur réel, vues de page retrouvées (`pnpm telemetry:test:app`)      | <Status tone="ok">12 / 12</Status>    |
| Formatage, lint, typage, tests (`make check`)                                             | <Status tone="ok">au vert</Status>    |
| Bannière de consentement                                                                  | <Status tone="ok">en place</Status>   |
| Tableaux de bord, alertes, déploiement distant, HTTPS, sauvegardes, IaC, essais de charge | <Status tone="todo">non fait</Status> |

**Ce qui est branché, exactement** : les vues de page et les recherches (Matomo `trackSiteSearch`, compteur Prometheus). Les autres événements du catalogue ne sont émis par aucun composant du site. Détail et conséquences dans la [revue du branchement](/analytics/bilans/revue).

La leçon de cette étape, écrite dans le [journal](/projet/journal) : **chaque échec se présentait comme un succès**. Un code HTTP 2xx ne prouve rien, seule l'interrogation des données après coup compte.
