Update OTEL in client hijack to use transport
Signed-off-by: Derek McGowan <derek@mcg.dev>
This commit is contained in:
parent
c84e889a69
commit
eb9ce779f6
1 changed files with 2 additions and 51 deletions
|
@ -12,10 +12,7 @@ import (
|
|||
"github.com/docker/docker/api/types"
|
||||
"github.com/docker/docker/api/types/versions"
|
||||
"github.com/pkg/errors"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/codes"
|
||||
"go.opentelemetry.io/otel/propagation"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||
)
|
||||
|
||||
// postHijacked sends a POST request and hijacks the connection.
|
||||
|
@ -53,28 +50,6 @@ func (cli *Client) setupHijackConn(req *http.Request, proto string) (_ net.Conn,
|
|||
req.Header.Set("Connection", "Upgrade")
|
||||
req.Header.Set("Upgrade", proto)
|
||||
|
||||
// We aren't using the configured RoundTripper here so manually inject the trace context
|
||||
tp := cli.tp
|
||||
if tp == nil {
|
||||
if span := trace.SpanFromContext(ctx); span.SpanContext().IsValid() {
|
||||
tp = span.TracerProvider()
|
||||
} else {
|
||||
tp = otel.GetTracerProvider()
|
||||
}
|
||||
}
|
||||
|
||||
ctx, span := tp.Tracer("").Start(ctx, req.Method+" "+req.URL.Path, trace.WithSpanKind(trace.SpanKindClient))
|
||||
// FIXME(thaJeztah): httpconv.ClientRequest is now an internal package; replace this with alternative for semconv v1.21
|
||||
// span.SetAttributes(httpconv.ClientRequest(req)...)
|
||||
defer func() {
|
||||
if retErr != nil {
|
||||
span.RecordError(retErr)
|
||||
span.SetStatus(codes.Error, retErr.Error())
|
||||
}
|
||||
span.End()
|
||||
}()
|
||||
otel.GetTextMapPropagator().Inject(ctx, propagation.HeaderCarrier(req.Header))
|
||||
|
||||
dialer := cli.Dialer()
|
||||
conn, err := dialer(ctx)
|
||||
if err != nil {
|
||||
|
@ -99,31 +74,7 @@ func (cli *Client) setupHijackConn(req *http.Request, proto string) (_ net.Conn,
|
|||
hc := &hijackedConn{conn, bufio.NewReader(conn)}
|
||||
|
||||
// Server hijacks the connection, error 'connection closed' expected
|
||||
resp, err := hc.RoundTrip(req)
|
||||
if resp != nil {
|
||||
// This is a simplified variant of "httpconv.ClientStatus(resp.StatusCode))";
|
||||
//
|
||||
// The main purpose of httpconv.ClientStatus() is to detect whether the
|
||||
// status was successful (1xx, 2xx, 3xx) or non-successful (4xx/5xx).
|
||||
//
|
||||
// It also provides complex logic to *validate* status-codes against
|
||||
// a hard-coded list meant to exclude "bogus" status codes in "success"
|
||||
// ranges (1xx, 2xx) and convert them into an error status. That code
|
||||
// seemed over-reaching (and not accounting for potential future valid
|
||||
// status codes). We assume we only get valid status codes, and only
|
||||
// look at status-code ranges.
|
||||
//
|
||||
// For reference, see:
|
||||
// https://github.com/open-telemetry/opentelemetry-go/blob/v1.21.0/semconv/v1.17.0/httpconv/http.go#L85-L89
|
||||
// https://github.com/open-telemetry/opentelemetry-go/blob/v1.21.0/semconv/internal/v2/http.go#L322-L330
|
||||
// https://github.com/open-telemetry/opentelemetry-go/blob/v1.21.0/semconv/internal/v2/http.go#L356-L404
|
||||
code := codes.Unset
|
||||
if resp.StatusCode >= http.StatusBadRequest {
|
||||
code = codes.Error
|
||||
}
|
||||
span.SetStatus(code, "")
|
||||
}
|
||||
|
||||
resp, err := otelhttp.NewTransport(hc).RoundTrip(req)
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue