From 91fc1dc9c149b07dd0db7f2e834d757e8d235353 Mon Sep 17 00:00:00 2001 From: DevMiner Date: Sat, 10 Aug 2024 01:51:58 +0200 Subject: [PATCH] feat(tracing/http-transport): emit breadcrumbs --- request_logger.go | 20 ++++++++++---------- traced_transport.go | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/request_logger.go b/request_logger.go index c00b50a..cbcf050 100644 --- a/request_logger.go +++ b/request_logger.go @@ -35,16 +35,6 @@ func RequestLogger(l zerolog.Logger, requestHeaders, responseHeaders bool) fiber reqCh := make(chan request, reqLoggerBufSize) resCh := make(chan response, reqLoggerBufSize) - formatHeaderAttribute := func(t, k string, v []string, i int) string { - attr := fmt.Sprintf("%s.headers.%s", t, k) - - if len(v) != 1 { - attr = fmt.Sprintf("%s.%d", attr, i) - } - - return attr - } - go func() { for { select { @@ -170,3 +160,13 @@ func RequestLogger(l zerolog.Logger, requestHeaders, responseHeaders bool) fiber return err } } + +func formatHeaderAttribute(t, k string, v []string, i int) string { + attr := fmt.Sprintf("%s.headers.%s", t, k) + + if len(v) != 1 { + attr = fmt.Sprintf("%s.%d", attr, i) + } + + return attr +} diff --git a/traced_transport.go b/traced_transport.go index 1e450f6..4c4ab4c 100644 --- a/traced_transport.go +++ b/traced_transport.go @@ -35,14 +35,14 @@ func (t *Telemetry) NewTracedTransport(transport http.RoundTripper, forwardTrace } func (t *HTTPTransport) RoundTrip(req *http.Request) (*http.Response, error) { - span := t.telemetry. + s := t.telemetry. StartSpan(req.Context(), "http.client", fmt.Sprintf("%s %s", req.Method, req.URL), WithOtelOptions(trace.WithSpanKind(trace.SpanKindClient))). AddAttributes( semconv.HTTPRequestMethodKey.String(req.Method), semconv.URLFull(req.URL.String()), ) - defer span.End() - ctx := span.Context() + defer s.End() + ctx := s.Context() req = req.WithContext(ctx) if t.forwardTrace { @@ -50,13 +50,19 @@ func (t *HTTPTransport) RoundTrip(req *http.Request) (*http.Response, error) { } for _, header := range t.tracedRequestHeaders { - if v := req.Header.Get(header); v != "" { - span.AddAttributes(attribute.String(fmt.Sprintf("http.request.header.%s", header), v)) + vv := req.Header.Values(header) + for i, v := range vv { + s.AddAttributes(attribute.String(formatHeaderAttribute("http.request", header, vv, i), v)) } } resp, err := t.Transport.RoundTrip(req) if err != nil { + s.CaptureBreadcrumb(SeverityError, BreadcrumbTypeHTTP, BreadcrumbCatagoryHTTP, fmt.Sprintf("Failed to send request to %s: %v", req.URL.String(), err), map[string]any{ + "url": req.URL.String(), + "method": req.Method, + }) + if hub := sentry.GetHubFromContext(ctx); hub != nil { hub.CaptureException(err) } @@ -64,13 +70,30 @@ func (t *HTTPTransport) RoundTrip(req *http.Request) (*http.Response, error) { return resp, err } - span. + { + severity := SeverityDebug + if resp.StatusCode < http.StatusBadRequest { + severity = SeverityInfo + } else if resp.StatusCode < http.StatusInternalServerError { + severity = SeverityError + } else { + severity = SeverityError + } + s.CaptureBreadcrumb(severity, BreadcrumbTypeHTTP, BreadcrumbCatagoryHTTP, req.URL.String(), map[string]any{ + "url": req.URL.String(), + "method": req.Method, + "status": resp.StatusCode, + }) + } + + s. AddAttributes(semconv.HTTPResponseStatusCode(resp.StatusCode)). SetStatus(httpStatusToSpanStatus(resp.StatusCode, false), "") for _, header := range t.tracedResponseHeaders { - if v := resp.Header.Get(header); v != "" { - span.AddAttributes(attribute.String(fmt.Sprintf("http.response.header.%s", header), v)) + vv := resp.Header.Values(header) + for i, v := range vv { + s.AddAttributes(attribute.String(formatHeaderAttribute("http.response", header, vv, i), v)) } }