veza/veza-backend-api/docs/BACKEND_STATUS_MONITORING.md

525 lines
12 KiB
Markdown
Raw Normal View History

P0: stabilisation backend/chat/stream + nouvelle base migrations v1 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.).
2025-12-06 10:14:38 +00:00
# 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