veza/veza-backend-api/internal/tracing/http_client.go
senke 8edc5fa0b4 [BE-SVC-018] be-svc: Implement request tracing
- Created TraceContext struct for distributed tracing
- Implemented W3C Trace Context format support (traceparent header)
- Added backward compatibility with legacy X-Trace-ID and X-Span-ID headers
- Created HTTPClientWithTracing for automatic trace propagation in outgoing requests
- Enhanced Tracing middleware to use new trace context system
- Added context propagation helpers (WithTraceContext, FromContext)
- Added child span creation for nested operations
- Comprehensive unit tests for trace context and HTTP client

Phase: PHASE-6
Priority: P2
Progress: 114/267 (42.70%)
2025-12-24 17:05:32 +01:00

53 lines
1.7 KiB
Go

package tracing
import (
"context"
"net/http"
)
// HTTPClientWithTracing est un wrapper autour de http.Client qui propage automatiquement le contexte de tracing
type HTTPClientWithTracing struct {
client *http.Client
}
// NewHTTPClientWithTracing crée un nouveau client HTTP avec propagation automatique du tracing
func NewHTTPClientWithTracing(client *http.Client) *HTTPClientWithTracing {
if client == nil {
client = &http.Client{}
}
return &HTTPClientWithTracing{
client: client,
}
}
// Do exécute une requête HTTP en propageant automatiquement le contexte de tracing
func (c *HTTPClientWithTracing) Do(req *http.Request) (*http.Response, error) {
// Extraire le contexte de tracing depuis le contexte de la requête
if traceCtx := FromContext(req.Context()); traceCtx != nil {
// Injecter le contexte de tracing dans les headers
InjectTraceContext(req, traceCtx)
}
return c.client.Do(req)
}
// DoWithContext exécute une requête HTTP avec un contexte et propage le tracing
func (c *HTTPClientWithTracing) DoWithContext(ctx context.Context, req *http.Request) (*http.Response, error) {
// Utiliser le contexte fourni
req = req.WithContext(ctx)
// Extraire le contexte de tracing depuis le contexte
if traceCtx := FromContext(ctx); traceCtx != nil {
// Injecter le contexte de tracing dans les headers
InjectTraceContext(req, traceCtx)
}
return c.client.Do(req)
}
// InjectTraceContextInRequest injecte le contexte de tracing dans une requête HTTP existante
// Helper function pour les cas où on ne peut pas utiliser HTTPClientWithTracing
func InjectTraceContextInRequest(req *http.Request) {
if traceCtx := FromContext(req.Context()); traceCtx != nil {
InjectTraceContext(req, traceCtx)
}
}