# Backend Status & Monitoring - Documentation Complète **Version**: 1.0 **Date**: 2025-12-05 **Priorité**: P1 - Monitoring Production --- ## 📋 Vue d'ensemble Ce document décrit l'implémentation complète du système de monitoring et de health checks pour le backend Go de Veza. Cette implémentation inclut : - ✅ Route `/health` simplifiée (stateless) - ✅ Route `/status` complète avec vérifications de tous les services - ✅ Intégration Sentry pour le tracking d'erreurs - ✅ Logging structuré avec zap - ✅ Métriques Prometheus pour les health checks - ✅ Tests d'intégration --- ## 🔍 Endpoints de Health Check ### 1. `/health` - Health Check Simple **Route**: `GET /health` ou `GET /api/v1/health` **Description**: Endpoint stateless qui retourne toujours `{status: "ok"}`. Aucune vérification de dépendances externes. **Réponse**: ```json { "status": "ok" } ``` **Status Code**: `200 OK` **Usage**: - Kubernetes liveness probe - Load balancer health check - Monitoring basique **Exemple**: ```bash curl http://localhost:8080/api/v1/health ``` --- ### 2. `/status` - Status Complet **Route**: `GET /api/v1/status` **Description**: Endpoint complet qui vérifie l'état de tous les services dépendants (DB, Redis, Chat Server, Stream Server). **Réponse**: ```json { "status": "ok", "uptime_seconds": 12345, "services": { "database": { "status": "ok", "latency_ms": 3.2 }, "redis": { "status": "ok", "latency_ms": 1.5 }, "chat_server": { "status": "ok", "latency_ms": 4.8 }, "stream_server": { "status": "ok", "latency_ms": 6.1 } }, "version": "v1.0.0", "git_commit": "abc123", "build_time": "2025-12-05T14:33:00Z", "environment": "production" } ``` **Status Codes**: - `200 OK`: Tous les services sont opérationnels - `503 Service Unavailable`: Au moins un service est en erreur (status: "degraded") **Status des Services**: - `ok`: Service opérationnel avec latence normale - `slow`: Service opérationnel mais latence élevée - `error`: Service inaccessible ou en erreur **Seuils de Latence**: - Database: 100ms (au-delà = "slow") - Redis: 50ms (au-delà = "slow") - Chat Server: 100ms (au-delà = "slow") - Stream Server: 100ms (au-delà = "slow") **Exemple**: ```bash curl http://localhost:8080/api/v1/status ``` **Exemple avec service dégradé**: ```json { "status": "degraded", "uptime_seconds": 12345, "services": { "database": { "status": "ok", "latency_ms": 3.2 }, "redis": { "status": "error", "latency_ms": 0, "message": "connection refused" }, "chat_server": { "status": "ok", "latency_ms": 4.8 }, "stream_server": { "status": "ok", "latency_ms": 6.1 } }, "version": "v1.0.0", "git_commit": "abc123", "build_time": "2025-12-05T14:33:00Z", "environment": "production" } ``` --- ## 🔧 Configuration ### Variables d'Environnement #### Health Check Aucune variable requise pour `/health` (stateless). #### Status Endpoint Les variables suivantes sont utilisées pour `/status`: | Variable | Description | Default | Requis | |----------|-------------|---------|--------| | `CHAT_SERVER_URL` | URL du serveur de chat | `http://localhost:8081` | Non | | `STREAM_SERVER_URL` | URL du serveur de streaming | `http://localhost:8082` | Non | | `APP_VERSION` | Version de l'application | `v1.0.0` | Non | | `GIT_COMMIT` | Commit Git | `unknown` | Non | | `BUILD_TIME` | Date de build | (vide) | Non | **Note**: Si `CHAT_SERVER_URL` ou `STREAM_SERVER_URL` ne sont pas configurés, ces services ne seront pas vérifiés dans `/status`. ### Sentry Configuration | Variable | Description | Default | Requis | |----------|-------------|---------|--------| | `SENTRY_DSN` | DSN Sentry pour error tracking | (vide) | Non | | `SENTRY_ENV` | Environnement Sentry | `APP_ENV` | Non | | `SENTRY_SAMPLE_RATE_ERRORS` | Sample rate pour les erreurs (0.0-1.0) | `1.0` | Non | | `SENTRY_SAMPLE_RATE_TRANSACTIONS` | Sample rate pour les transactions (0.0-1.0) | `0.1` | Non | **Exemple**: ```bash export SENTRY_DSN="https://xxx@xxx.ingest.sentry.io/xxx" export SENTRY_ENV="production" export SENTRY_SAMPLE_RATE_ERRORS=1.0 export SENTRY_SAMPLE_RATE_TRANSACTIONS=0.1 ``` --- ## 📊 Métriques Prometheus ### Health Check Metrics Les métriques suivantes sont exposées pour les health checks: #### `veza_health_check_duration_ms` Histogramme de la durée des health checks par service. **Labels**: - `service`: `database`, `redis`, `chat_server`, `stream_server` **Buckets**: `1, 5, 10, 25, 50, 100, 250, 500, 1000` (ms) **Exemple**: ``` veza_health_check_duration_ms_bucket{service="database",le="10"} 45 veza_health_check_duration_ms_bucket{service="database",le="50"} 98 veza_health_check_duration_ms_sum{service="database"} 1234.5 veza_health_check_duration_ms_count{service="database"} 100 ``` #### `veza_health_check_status` Gauge du status de chaque service. **Labels**: - `service`: `database`, `redis`, `chat_server`, `stream_server` **Valeurs**: - `1.0`: Service OK - `0.5`: Service lent (slow) - `0.0`: Service en erreur **Exemple**: ``` veza_health_check_status{service="database"} 1.0 veza_health_check_status{service="redis"} 0.5 veza_health_check_status{service="chat_server"} 0.0 ``` ### Accès aux Métriques **Endpoint**: `GET /api/v1/metrics` **Exemple**: ```bash curl http://localhost:8080/api/v1/metrics | grep health_check ``` --- ## 🐛 Intégration Sentry ### Initialisation Sentry est initialisé automatiquement dans `cmd/api/main.go` si `SENTRY_DSN` est configuré. ### Middleware Le middleware `SentryRecover` capture automatiquement: - Les panics (avec stack trace) - Les erreurs HTTP 5xx - Les erreurs du contexte Gin ### Contexte Capturé Pour chaque erreur, Sentry capture: - Méthode HTTP - Path de la requête - Query parameters - IP du client - Request ID (si présent) - User ID (si authentifié) ### Exemple d'Erreur dans Sentry ```json { "message": "Panic: runtime error: invalid memory address", "level": "error", "tags": { "component": "gin", "request_id": "req-12345" }, "contexts": { "request": { "method": "POST", "path": "/api/v1/tracks", "query": "", "ip": "192.168.1.1" } }, "user": { "id": "user-123", "username": "user-123" } } ``` --- ## 📝 Logging Structuré ### Format Tous les logs utilisent le format JSON structuré avec zap. ### Champs Standards Chaque requête HTTP logge: - `method`: Méthode HTTP (GET, POST, etc.) - `path`: Chemin de la requête - `query`: Query parameters - `ip`: IP du client - `user_agent`: User agent - `latency`: Durée de la requête - `status`: Status code HTTP - `body_size`: Taille de la réponse - `request_id`: ID unique de la requête (si présent) - `user_id`: ID de l'utilisateur (si authentifié) - `trace_id`: ID de trace (si présent) - `span_id`: ID de span (si présent) ### Niveaux de Log - **INFO**: Requêtes réussies (2xx, 3xx) - **WARN**: Erreurs client (4xx) - **ERROR**: Erreurs serveur (5xx) ### Exemple de Log ```json { "level": "info", "ts": 1701878400.123, "msg": "Request completed", "method": "GET", "path": "/api/v1/status", "query": "", "ip": "192.168.1.1", "user_agent": "curl/7.68.0", "latency": "0.012345s", "status": 200, "body_size": 456, "request_id": "req-12345" } ``` --- ## 🧪 Tests ### Tests Unitaires Les tests sont dans `tests/integration/api_health_test.go`: - `TestAPIHealth`: Test de `/health` - `TestAPIHealthV1`: Test de `/api/v1/health` - `TestAPIStatus`: Test de `/status` avec services réels - `TestAPIStatusDegraded`: Test de `/status` avec service dégradé ### Exécution des Tests ```bash cd veza-backend-api go test ./tests/integration -v -run TestAPIHealth go test ./tests/integration -v -run TestAPIStatus ``` ### Tests d'Intégration HTTP Pour tester avec un serveur réel: ```bash # Démarrer le serveur make run # Dans un autre terminal curl http://localhost:8080/api/v1/health curl http://localhost:8080/api/v1/status ``` --- ## 📈 Dashboard Grafana Recommandé ### Panels Suggérés 1. **Health Check Status** - Query: `veza_health_check_status` - Type: Gauge - Alerte: Si valeur < 1.0 2. **Health Check Latency** - Query: `rate(veza_health_check_duration_ms_sum[5m]) / rate(veza_health_check_duration_ms_count[5m])` - Type: Graph - Alerte: Si latence > 100ms 3. **Service Availability** - Query: `avg_over_time(veza_health_check_status[5m])` - Type: Stat - Alerte: Si disponibilité < 0.95 4. **Error Rate** - Query: `rate(veza_errors_total[5m])` - Type: Graph - Alerte: Si taux d'erreur > 1% ### Exemple de Dashboard JSON ```json { "dashboard": { "title": "Veza Backend Health", "panels": [ { "title": "Health Check Status", "targets": [ { "expr": "veza_health_check_status" } ] }, { "title": "Health Check Latency", "targets": [ { "expr": "rate(veza_health_check_duration_ms_sum[5m]) / rate(veza_health_check_duration_ms_count[5m])" } ] } ] } } ``` --- ## 🚀 Procédure de Test Locale ### 1. Démarrer les Services ```bash # Démarrer PostgreSQL docker-compose up -d postgres # Démarrer Redis docker-compose up -d redis # Démarrer le backend cd veza-backend-api go run cmd/api/main.go ``` ### 2. Tester `/health` ```bash curl http://localhost:8080/api/v1/health # Réponse: {"status":"ok"} ``` ### 3. Tester `/status` ```bash curl http://localhost:8080/api/v1/status | jq ``` ### 4. Vérifier les Métriques ```bash curl http://localhost:8080/api/v1/metrics | grep health_check ``` ### 5. Tester avec Service Dégradé ```bash # Arrêter Redis docker-compose stop redis # Vérifier le status curl http://localhost:8080/api/v1/status | jq # Le status devrait être "degraded" et redis en "error" ``` --- ## 🔍 Dépannage ### Problème: `/status` retourne toujours "degraded" **Causes possibles**: 1. Un service est inaccessible (DB, Redis, Chat Server, Stream Server) 2. Latence élevée (> seuil) **Solution**: 1. Vérifier les logs: `docker-compose logs backend` 2. Vérifier la connectivité: `curl http://localhost:8081/health` (chat server) 3. Vérifier les métriques: `curl http://localhost:8080/api/v1/metrics | grep health_check` ### Problème: Sentry ne capture pas les erreurs **Causes possibles**: 1. `SENTRY_DSN` non configuré 2. Sample rate trop bas **Solution**: 1. Vérifier `SENTRY_DSN` dans les variables d'environnement 2. Augmenter `SENTRY_SAMPLE_RATE_ERRORS` à 1.0 pour les tests ### Problème: Métriques Prometheus non visibles **Causes possibles**: 1. Endpoint `/metrics` non accessible 2. Métriques non enregistrées **Solution**: 1. Vérifier l'endpoint: `curl http://localhost:8080/api/v1/metrics` 2. Vérifier les logs pour les erreurs d'enregistrement --- ## 📚 Références - [Prometheus Metrics](https://prometheus.io/docs/concepts/metric_types/) - [Sentry Go SDK](https://docs.sentry.io/platforms/go/) - [Zap Logger](https://github.com/uber-go/zap) - [Gin Framework](https://gin-gonic.com/docs/) --- ## ✅ Checklist de Déploiement - [ ] Variables d'environnement configurées (`SENTRY_DSN`, `CHAT_SERVER_URL`, etc.) - [ ] Endpoint `/health` accessible depuis le load balancer - [ ] Endpoint `/status` accessible pour le monitoring - [ ] Métriques Prometheus scrapées par Prometheus - [ ] Dashboard Grafana configuré - [ ] Alertes configurées (service down, latence élevée) - [ ] Tests d'intégration passent - [ ] Documentation à jour --- **Auteur**: Veza Backend Team **Dernière mise à jour**: 2025-12-05