Backend Go: - Remplacement complet des anciennes migrations par la base V1 alignée sur ORIGIN. - Durcissement global du parsing JSON (BindAndValidateJSON + RespondWithAppError). - Sécurisation de config.go, CORS, statuts de santé et monitoring. - Implémentation des transactions P0 (RBAC, duplication de playlists, social toggles). - Ajout d’un job worker structuré (emails, analytics, thumbnails) + tests associés. - Nouvelle doc backend : AUDIT_CONFIG, BACKEND_CONFIG, AUTH_PASSWORD_RESET, JOB_WORKER_*. Chat server (Rust): - Refonte du pipeline JWT + sécurité, audit et rate limiting avancé. - Implémentation complète du cycle de message (read receipts, delivered, edit/delete, typing). - Nettoyage des panics, gestion d’erreurs robuste, logs structurés. - Migrations chat alignées sur le schéma UUID et nouvelles features. Stream server (Rust): - Refonte du moteur de streaming (encoding pipeline + HLS) et des modules core. - Transactions P0 pour les jobs et segments, garanties d’atomicité. - Documentation détaillée de la pipeline (AUDIT_STREAM_*, DESIGN_STREAM_PIPELINE, TRANSACTIONS_P0_IMPLEMENTATION). Documentation & audits: - TRIAGE.md et AUDIT_STABILITY.md à jour avec l’état réel des 3 services. - Cartographie complète des migrations et des transactions (DB_MIGRATIONS_*, DB_TRANSACTION_PLAN, AUDIT_DB_TRANSACTIONS, TRANSACTION_TESTS_PHASE3). - Scripts de reset et de cleanup pour la lab DB et la V1. Ce commit fige l’ensemble du travail de stabilisation P0 (UUID, backend, chat et stream) avant les phases suivantes (Coherence Guardian, WS hardening, etc.).
12 KiB
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
/healthsimplifiée (stateless) - ✅ Route
/statuscomplè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:
{
"status": "ok"
}
Status Code: 200 OK
Usage:
- Kubernetes liveness probe
- Load balancer health check
- Monitoring basique
Exemple:
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:
{
"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érationnels503 Service Unavailable: Au moins un service est en erreur (status: "degraded")
Status des Services:
ok: Service opérationnel avec latence normaleslow: Service opérationnel mais latence élevéeerror: 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:
curl http://localhost:8080/api/v1/status
Exemple avec service dégradé:
{
"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:
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 OK0.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:
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
{
"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êtequery: Query parametersip: IP du clientuser_agent: User agentlatency: Durée de la requêtestatus: Status code HTTPbody_size: Taille de la réponserequest_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
{
"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/healthTestAPIHealthV1: Test de/api/v1/healthTestAPIStatus: Test de/statusavec services réelsTestAPIStatusDegraded: Test de/statusavec service dégradé
Exécution des Tests
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:
# 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
-
Health Check Status
- Query:
veza_health_check_status - Type: Gauge
- Alerte: Si valeur < 1.0
- Query:
-
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
- Query:
-
Service Availability
- Query:
avg_over_time(veza_health_check_status[5m]) - Type: Stat
- Alerte: Si disponibilité < 0.95
- Query:
-
Error Rate
- Query:
rate(veza_errors_total[5m]) - Type: Graph
- Alerte: Si taux d'erreur > 1%
- Query:
Exemple de Dashboard 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
# 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
curl http://localhost:8080/api/v1/health
# Réponse: {"status":"ok"}
3. Tester /status
curl http://localhost:8080/api/v1/status | jq
4. Vérifier les Métriques
curl http://localhost:8080/api/v1/metrics | grep health_check
5. Tester avec Service Dégradé
# 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:
- Un service est inaccessible (DB, Redis, Chat Server, Stream Server)
- Latence élevée (> seuil)
Solution:
- Vérifier les logs:
docker-compose logs backend - Vérifier la connectivité:
curl http://localhost:8081/health(chat server) - 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:
SENTRY_DSNnon configuré- Sample rate trop bas
Solution:
- Vérifier
SENTRY_DSNdans les variables d'environnement - Augmenter
SENTRY_SAMPLE_RATE_ERRORSà 1.0 pour les tests
Problème: Métriques Prometheus non visibles
Causes possibles:
- Endpoint
/metricsnon accessible - Métriques non enregistrées
Solution:
- Vérifier l'endpoint:
curl http://localhost:8080/api/v1/metrics - Vérifier les logs pour les erreurs d'enregistrement
📚 Références
✅ Checklist de Déploiement
- Variables d'environnement configurées (
SENTRY_DSN,CHAT_SERVER_URL, etc.) - Endpoint
/healthaccessible depuis le load balancer - Endpoint
/statusaccessible 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