/** * Monitor 7: Monitoring Dashboard Component * Visualizes validation metrics, API performance, and error tracking */ import { useState, useEffect } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Activity, AlertTriangle, CheckCircle, XCircle, TrendingUp, Clock, ExternalLink, RefreshCw, } from 'lucide-react'; import { validationMetrics } from '@/services/api/client'; import { env } from '@/config/env'; import { logger } from '@/utils/logger'; interface MonitoringMetrics { validation: { total: number; successful: number; failed: number; failureRate: number; lastFailureTime?: string; lastSuccessTime?: string; failuresByEndpoint: Record; }; sentry: { enabled: boolean; dsnConfigured: boolean; }; } export function MonitoringDashboard() { const [metrics, setMetrics] = useState(null); const [lastUpdate, setLastUpdate] = useState(new Date()); const loadMetrics = () => { try { const validationMetricsData = validationMetrics.getMetrics(); setMetrics({ validation: { total: validationMetricsData.totalValidations, successful: validationMetricsData.successfulValidations, failed: validationMetricsData.failedValidations, failureRate: validationMetricsData.failureRate, lastFailureTime: validationMetricsData.lastFailureTime, lastSuccessTime: validationMetricsData.lastSuccessTime, failuresByEndpoint: validationMetricsData.failuresByEndpoint, }, sentry: { enabled: !!env.SENTRY_DSN && import.meta.env.PROD, dsnConfigured: !!env.SENTRY_DSN, }, }); setLastUpdate(new Date()); } catch (error) { logger.error('[MonitoringDashboard] Failed to load metrics', { error: error instanceof Error ? error.message : String(error), }); } }; useEffect(() => { loadMetrics(); // Refresh metrics every 30 seconds const interval = setInterval(loadMetrics, 30000); return () => clearInterval(interval); }, []); if (!metrics) { return (

Chargement des métriques...

); } const getFailureRateColor = (rate: number): string => { if (rate === 0) return 'text-green-600'; if (rate < 1) return 'text-yellow-600'; if (rate < 5) return 'text-orange-600'; return 'text-red-600'; }; const getFailureRateBadge = (rate: number) => { if (rate === 0) return 'success'; if (rate < 1) return 'default'; if (rate < 5) return 'warning'; return 'error'; }; const topFailureEndpoints = Object.entries(metrics.validation.failuresByEndpoint) .sort(([, a], [, b]) => b - a) .slice(0, 5); return (
{/* Header */}

Monitoring du Système

Métriques de validation, performance API et suivi des erreurs

Dernière mise à jour: {lastUpdate.toLocaleTimeString('fr-FR')}

{/* Validation Metrics */}
Total Validations
{metrics.validation.total.toLocaleString()}

Validations depuis le démarrage

Validations Réussies
{metrics.validation.successful.toLocaleString()}

{metrics.validation.total > 0 ? ( (metrics.validation.successful / metrics.validation.total) * 100 ).toFixed(1) : 0} % de réussite

Validations Échouées
{metrics.validation.failed.toLocaleString()}

{metrics.validation.failureRate.toFixed(2)}% d'échec

Taux d'Échec
{metrics.validation.failureRate.toFixed(2)}%
{metrics.validation.failureRate === 0 ? 'Parfait' : metrics.validation.failureRate < 1 ? 'Bon' : metrics.validation.failureRate < 5 ? 'Attention' : 'Critique'}
{/* Detailed Metrics */}
{/* Validation Details */} Détails des Validations Statistiques détaillées des validations API
Dernière validation réussie: {metrics.validation.lastSuccessTime ? new Date( metrics.validation.lastSuccessTime, ).toLocaleString('fr-FR') : 'Aucune'}
Dernière validation échouée: {metrics.validation.lastFailureTime ? new Date( metrics.validation.lastFailureTime, ).toLocaleString('fr-FR') : 'Aucune'}
{topFailureEndpoints.length > 0 && (

Endpoints avec le plus d'échecs:

{topFailureEndpoints.map(([endpoint, count]) => (
{endpoint} {count}
))}
)}
{/* Error Tracking Status */} Suivi des Erreurs Configuration et statut du suivi des erreurs
{metrics.sentry.enabled ? ( ) : ( )} Sentry Error Tracking
{metrics.sentry.enabled ? 'Actif' : 'Inactif'}
{metrics.sentry.dsnConfigured ? ( ) : ( )} DSN Configuré
{metrics.sentry.dsnConfigured ? 'Oui' : 'Non'}
{metrics.sentry.enabled && (

Les erreurs sont automatiquement envoyées à Sentry pour le suivi et l'analyse.

)} {!metrics.sentry.enabled && (

Le suivi des erreurs Sentry n'est pas activé. Configurez{' '} VITE_SENTRY_DSN {' '} pour activer le suivi des erreurs en production.

)}
{/* Performance Monitoring Info */} Performance Monitoring Les métriques de performance sont suivies automatiquement
Temps de Rendu

Suivi via Sentry Browser Tracing

Temps de Réponse API

Suivi dans le client API avec détection des requêtes lentes

Erreurs Réseau

Détection des pannes partielles vs complètes

); }