fix: switch to use roundtripper from otel

This commit is contained in:
Cedric Ziel 2024-06-22 15:07:04 +02:00
parent 5f9398cede
commit 8f4075491b
2 changed files with 5 additions and 56 deletions

View File

@ -21,11 +21,6 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/codes"
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
semconv2 "go.opentelemetry.io/otel/semconv/v1.4.0"
"go.opentelemetry.io/otel/trace"
weakrand "math/rand"
"net"
"net/http"
@ -142,8 +137,6 @@ type HTTPTransport struct {
h2cTransport *http2.Transport
h3Transport *http3.RoundTripper // TODO: EXPERIMENTAL (May 2024)
tracer *trace.Tracer
}
// CaddyModule returns the Caddy module information.
@ -449,54 +442,7 @@ func (h *HTTPTransport) RoundTrip(req *http.Request) (*http.Response, error) {
return h.h2cTransport.RoundTrip(req)
}
ctx, span := createClientSpanForProxy(req.Context(), req)
defer span.End()
// override the request's context with the span context, so it can be propagated
req = req.WithContext(ctx)
res, err := transport.Transport.RoundTrip(req)
return recordResponseToSpan(span, res, err)
}
func recordResponseToSpan(span trace.Span, res *http.Response, err error) (*http.Response, error) {
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return res, err
}
// record response into span
if res != nil {
span.SetStatus(semconv2.SpanStatusFromHTTPStatusCodeAndSpanKind(res.StatusCode, trace.SpanKindClient))
span.SetAttributes(
semconv.HTTPStatusCodeKey.Int(res.StatusCode),
semconv.HTTPResponseContentLengthKey.Int64(res.ContentLength),
)
}
return res, err
}
func createClientSpanForProxy(ctx context.Context, req *http.Request) (context.Context, trace.Span) {
tracer := otel.Tracer("caddy/reverseproxy/httptransport")
// create a new span for the client request
ctx, span := tracer.Start(ctx, "client request",
trace.WithAttributes(
semconv.HTTPURLKey.String(req.URL.String()),
semconv.HTTPMethodKey.String(req.Method),
semconv.HTTPUserAgentKey.String(req.UserAgent()),
semconv.HTTPSchemeKey.String(req.URL.Scheme),
semconv.HTTPTargetKey.String(req.URL.Path),
semconv.HTTPClientIPKey.String(req.RemoteAddr),
semconv.HTTPFlavorKey.String(req.Proto),
),
)
return ctx, span
return transport.Transport.RoundTrip(req)
}
// SetScheme ensures that the outbound request req

View File

@ -20,6 +20,7 @@ import (
"encoding/json"
"errors"
"fmt"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"io"
"net"
"net/http"
@ -784,8 +785,10 @@ func (h *Handler) reverseProxy(rw http.ResponseWriter, req *http.Request, origRe
// do the round-trip; emit debug log with values we know are
// safe, or if there is no error, emit fuller log entry
// we are wrapping the RoundTripper to make it observable
start := time.Now()
res, err := h.Transport.RoundTrip(req)
otelTransport := otelhttp.NewTransport(h.Transport)
res, err := otelTransport.RoundTrip(req)
duration := time.Since(start)
logger := h.logger.With(
zap.String("upstream", di.Upstream.String()),