veza/veza-backend-api/internal/middleware/context_propagation.go

64 lines
1.9 KiB
Go

package middleware
import (
"context"
"net/http"
"github.com/gin-gonic/gin"
)
// GetRequestIDFromContext extrait le request_id depuis le contexte Gin ou Go
// Essaie d'abord le contexte Gin, puis le contexte Go standard
func GetRequestIDFromContext(c *gin.Context) string {
// Essayer depuis le contexte Gin
if requestID, exists := c.Get("request_id"); exists {
if id, ok := requestID.(string); ok && id != "" {
return id
}
}
return ""
}
// GetRequestIDFromGoContext extrait le request_id depuis un contexte Go standard
func GetRequestIDFromGoContext(ctx context.Context) string {
// Le request_id peut être stocké dans le contexte Go avec une clé spécifique
if requestID := ctx.Value("request_id"); requestID != nil {
if id, ok := requestID.(string); ok {
return id
}
}
return ""
}
// PropagateRequestID ajoute le header X-Request-ID à une requête HTTP sortante
// si le request_id est disponible dans le contexte
func PropagateRequestID(c *gin.Context, req *http.Request) {
requestID := GetRequestIDFromContext(c)
if requestID != "" {
req.Header.Set("X-Request-ID", requestID)
}
// Propager aussi le trace_id si disponible
if traceID := GetTraceID(c); traceID != "" {
req.Header.Set("X-Trace-ID", traceID)
}
// Propager aussi le span_id si disponible
if spanID := GetSpanID(c); spanID != "" {
req.Header.Set("X-Span-ID", spanID)
}
}
// PropagateRequestIDFromContext ajoute le header X-Request-ID à une requête HTTP sortante
// depuis un contexte Go standard
func PropagateRequestIDFromContext(ctx context.Context, req *http.Request) {
requestID := GetRequestIDFromGoContext(ctx)
if requestID != "" {
req.Header.Set("X-Request-ID", requestID)
}
// Propager aussi le trace_id si disponible (via tracing package)
// Note: Cette fonctionnalité nécessiterait l'import du package tracing
// Pour l'instant, on se concentre sur le request_id
}