1. Mesurer l'expérience #
Apdex et Core Web Vitals.
Indicateurs #
| Indicateur | Ce qu'il mesure |
|---|---|
| Apdex | Score de 0 à 1 : part d'actions satisfaisantes (sous un seuil), tolérables et frustrantes |
| Core Web Vitals (LCP, INP, CLS) | Standards du web : affichage, réactivité, stabilité visuelle |
| Taux d'erreurs JavaScript | Erreurs vues par les utilisateurs |
| Taux de rebond, conversion | Impact métier |
Bonne Pratique : L'Apdex se règle par application et par action : un seuil de 3 s pour une recherche n'a pas de sens pour un paiement. Les Core Web Vitals, eux, sont comparables d'un site à l'autre.
2. De la session à la ligne de code #
Les vues d'analyse.
Parcours d'analyse #
| Vue | Usage |
|---|---|
| Application frontend | Vue d'ensemble : actions clés, géographie, navigateurs, erreurs |
| User sessions | Chronologie d'une session : actions, erreurs, cascade de chargement (waterfall), replay si activé |
| Service flow | Enchaînement des appels entre services pour une transaction |
| Distributed traces (PurePath) | Trace détaillée d'une requête jusqu'au code et aux requêtes SQL |
| Backtrace | Qui appelle ce service ou cette base de données, depuis quelle action utilisateur |
| Multidimensional analysis | Découper temps de réponse et erreurs par n'importe quelle dimension (URL, méthode, exception) |
Le parcours type : une action lente → ses traces → le service responsable dans le service flow → la méthode ou la requête SQL dans le PurePath.
3. USQL #
Interroger les sessions comme en SQL.
Requêtes #
-- Les 10 actions les plus lentes d'une application
SELECT useraction.name, AVG(useraction.duration), COUNT(*)
FROM useraction
WHERE useraction.application = "boutique"
GROUP BY useraction.name
ORDER BY AVG(useraction.duration) DESC
LIMIT 10
-- Sessions avec erreur par navigateur
SELECT browserFamily, COUNT(*) FROM usersession
WHERE totalErrorCount > 0 GROUP BY browserFamily
-- Entonnoir de conversion
SELECT FUNNEL(useraction.name = "Accueil" AS "Accueil",
useraction.name = "Ajouter au panier" AS "Panier",
useraction.name = "Payer" AS "Paiement")
FROM usersessionÀ savoir : Les données RUM les plus récentes sont aussi stockées dans Grail et interrogeables en DQL ; USQL reste le langage des données de session classiques.
