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) } }