ObsiViewer/docs/LOGGING_IMPLEMENTATION.md

7.2 KiB

🎯 Frontend Logging Implementation - Summary

Implementation Complete

Le système de traçage front → backend pour ObsiViewer est maintenant entièrement opérationnel.

📦 Livrables

1. Core Logging System

  • src/core/logging/log.model.ts - Types et interfaces
  • src/core/logging/log.service.ts - Service principal avec batch, retry, circuit breaker
  • src/core/logging/log.sender.ts - Fonction d'envoi HTTP
  • src/core/logging/log.router-listener.ts - Listener pour navigation
  • src/core/logging/log.visibility-listener.ts - Listener pour lifecycle
  • src/core/logging/environment.ts - Configuration
  • src/core/logging/index.ts - Exports publics

2. Instrumentation

  • src/app.component.ts - APP_START, APP_STOP, NAVIGATE, SEARCH_EXECUTED, BOOKMARKS_*, CALENDAR_SEARCH_EXECUTED
  • src/app/core/services/theme.service.ts - THEME_CHANGE
  • src/app/graph/graph-settings.service.ts - GRAPH_VIEW_SETTINGS_CHANGE
  • index.tsx - Providers pour router et visibility listeners

3. Documentation

  • docs/README-logging.md - Documentation complète du système

4. Tests

  • src/core/logging/log.service.spec.ts - Tests unitaires du service
  • src/core/logging/log.sender.spec.ts - Tests unitaires du sender
  • e2e/logging.spec.ts - Tests E2E complets

🎪 Événements Tracés

Événement Source Données
APP_START AppComponent.ngOnInit viewport dimensions
APP_STOP AppComponent.ngOnDestroy, beforeunload timestamp
VISIBILITY_CHANGE document.visibilitychange hidden, visibilityState
NAVIGATE Router.events from, to, durationMs
SEARCH_EXECUTED AppComponent.onSearchSubmit query, queryLength
BOOKMARKS_OPEN AppComponent.setView -
BOOKMARKS_MODIFY AppComponent.onBookmarkSave/Delete action, path
GRAPH_VIEW_OPEN AppComponent.setView -
GRAPH_VIEW_CLOSE (à implémenter si nécessaire) -
GRAPH_VIEW_SETTINGS_CHANGE GraphSettingsService.save changes (keys)
CALENDAR_SEARCH_EXECUTED AppComponent.onCalendarResultsChange resultsCount
THEME_CHANGE ThemeService.toggleTheme/setTheme from, to

🔧 Fonctionnalités Implémentées

Batch & Debounce

  • Regroupe jusqu'à 5 événements ou 2 secondes (configurable)
  • Réduit la charge réseau et backend

Retry avec Backoff Exponentiel

  • Jusqu'à 5 tentatives avec délais : 500ms, 1s, 2s, 4s, 8s
  • Gestion robuste des erreurs réseau

Circuit Breaker

  • S'ouvre après 5 échecs consécutifs
  • Pause de 30 secondes avant réessai
  • Protège le backend en cas de panne

Support Offline

  • File d'attente en mémoire + localStorage
  • Envoi automatique au retour du réseau
  • sendBeacon pour l'envoi sur unload

Optimisations Performance

  • requestIdleCallback pour envoi non-bloquant
  • Limite de 5 KB par record
  • Pas d'impact sur l'UI

Contexte Automatique

  • Route courante
  • Thème (light/dark)
  • Nom du vault
  • Version de l'app
  • Session ID (UUID v4)
  • User agent

🧪 Validation

Tests Unitaires

npm test
  • Construction des LogRecord
  • Batch et debounce
  • Retry et circuit breaker
  • Persistence localStorage
  • Session ID

Tests E2E

npm run test:e2e
  • APP_START au chargement
  • SEARCH_EXECUTED sur recherche
  • BOOKMARKS_OPEN sur ouverture bookmarks
  • GRAPH_VIEW_OPEN sur ouverture graph
  • THEME_CHANGE sur toggle thème
  • Session ID cohérent
  • Contexte présent
  • Batch de logs
  • Gestion offline/online

Test Manuel

  1. Démarrer l'app : npm run dev
  2. Ouvrir DevTools → Network → Filter /api/log
  3. Effectuer des actions :
    • Naviguer entre les vues
    • Effectuer une recherche
    • Ouvrir les bookmarks
    • Ouvrir le graph view
    • Changer le thème
  4. Vérifier : Les requêtes POST vers /api/log avec payloads JSON

🚀 Déploiement

Configuration Production

Modifier src/core/logging/environment.ts :

export const environment = {
  production: true,
  appVersion: '1.0.0', // Version réelle
  logging: {
    enabled: true,
    endpoint: '/api/log',
    // ... autres configs
  },
};

Backend Requirements

Le backend doit implémenter :

  • Endpoint : POST /api/log
  • Accept : application/json
  • Body : LogRecord ou LogRecord[]
  • Response : Status 2xx (le body est ignoré)

Exemple Node.js/Express :

app.post('/api/log', express.json(), (req, res) => {
  const logs = Array.isArray(req.body) ? req.body : [req.body];
  
  logs.forEach(log => {
    console.log('[CLIENT LOG]', log.event, log.data);
    // Stocker en DB, envoyer à un service de monitoring, etc.
  });
  
  res.json({ ok: true });
});

📊 Monitoring Recommandé

Métriques à Surveiller

  • Volume de logs par événement
  • Taux d'erreur (circuit breaker ouvert)
  • Latence des requêtes /api/log
  • Sessions actives (unique sessionIds)
  • Patterns d'usage (navigation, recherches populaires)

Alertes Suggérées

  • Circuit breaker ouvert > 5 minutes
  • Taux d'erreur > 10%
  • Aucun log reçu pendant > 1 heure (en prod)

🔒 Sécurité & Confidentialité

Implémenté

  • Aucun contenu de note n'est envoyé
  • Uniquement des métadonnées (chemins, titres, compteurs)
  • Troncature des objets volumineux (5 KB max)
  • Sérialisation sécurisée (pas de fonctions, pas de références circulaires)

⚠️ Considérations

  • Les chemins de fichiers sont envoyés (peuvent contenir des infos sensibles)
  • Les requêtes de recherche sont envoyées (peuvent contenir des termes privés)
  • Considérer l'anonymisation côté backend si nécessaire

🐛 Troubleshooting

Logs non envoyés

  1. Vérifier environment.logging.enabled = true
  2. Vérifier que /api/log existe et retourne 2xx
  3. Vérifier la console pour erreurs

Circuit breaker ouvert

  1. Vérifier la disponibilité du backend
  2. Vérifier que l'endpoint retourne 2xx
  3. Attendre 30s pour reset automatique

Logs perdus sur unload

  • Comportement normal (navigateurs modernes)
  • sendBeacon utilisé en best-effort
  • Certains logs peuvent être perdus sur refresh forcé

📝 Prochaines Étapes (Optionnel)

Améliorations Possibles

  • Ajouter GRAPH_VIEW_CLOSE explicite
  • Tracker les erreurs JavaScript (window.onerror)
  • Tracker les performances (Core Web Vitals)
  • Ajouter des filtres côté client (ex: ne pas logger en dev)
  • Compression des payloads (gzip)
  • Sampling (ne logger qu'un % des événements)

Intégrations

  • Google Analytics / Matomo
  • Sentry / Rollbar pour erreurs
  • DataDog / New Relic pour APM
  • Elasticsearch / Kibana pour analyse

Conclusion

Le système de logging est production-ready et respecte toutes les spécifications :

  • Tous les événements requis sont tracés
  • Payload conforme au contrat API
  • Robuste (retry, circuit breaker, offline)
  • Performant (batch, debounce, non-bloquant)
  • Testé (unit + E2E)
  • Documenté

Le système est prêt à être déployé et utilisé en production.


Auteur : Cascade AI
Date : 2025-10-05
Version : 1.0.0