diff --git a/pkg/handler/error.go b/pkg/handler/error.go index 6a0ff7b..2360435 100644 --- a/pkg/handler/error.go +++ b/pkg/handler/error.go @@ -7,6 +7,10 @@ import ( "strconv" "strings" + "github.com/nais/wonderwall/internal/o11y/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" + "github.com/go-chi/chi/v5/middleware" log "github.com/sirupsen/logrus" @@ -25,18 +29,26 @@ const ( ) func (s *Standalone) InternalError(w http.ResponseWriter, r *http.Request, cause error) { + span := trace.SpanFromContext(r.Context()) + otel.AddErrorEvent(span, "errorHandler", "InternalError", cause) s.respondError(w, r, http.StatusInternalServerError, cause, log.ErrorLevel) } func (s *Standalone) BadRequest(w http.ResponseWriter, r *http.Request, cause error) { + span := trace.SpanFromContext(r.Context()) + otel.AddErrorEvent(span, "errorHandler", "BadRequest", cause) s.respondError(w, r, http.StatusBadRequest, cause, log.ErrorLevel) } func (s *Standalone) Unauthorized(w http.ResponseWriter, r *http.Request, cause error) { + span := trace.SpanFromContext(r.Context()) + otel.AddErrorEvent(span, "errorHandler", "Unauthorized", cause) s.respondError(w, r, http.StatusUnauthorized, cause, log.WarnLevel) } func (s *Standalone) TooManyRequests(w http.ResponseWriter, r *http.Request, cause error) { + span := trace.SpanFromContext(r.Context()) + otel.AddErrorEvent(span, "errorHandler", "TooManyRequests", cause) s.respondError(w, r, http.StatusTooManyRequests, cause, log.WarnLevel) } @@ -70,13 +82,16 @@ func (s *Standalone) Retry(r *http.Request, loginCookie *openid.LoginCookie) str } func (s *Standalone) respondError(w http.ResponseWriter, r *http.Request, statusCode int, cause error, level log.Level) { + span := trace.SpanFromContext(r.Context()) logger := mw.LogEntryFrom(r).WithFields(httpinternal.Attributes(r)) msg := "error in route: %+v" incrementRetryAttempt(w, r, s.GetCookieOptions(r)) attempts, ok := getRetryAttempts(r) + span.SetAttributes(attribute.Int("error.retry_count", attempts)) if (!ok || attempts < MaxAutoRetryAttempts) && (statusCode != http.StatusTooManyRequests) { + span.SetAttributes(attribute.Bool("error.retry", true)) loginCookie, err := openid.GetLoginCookie(r, s.Crypter) if err != nil { loginCookie = nil @@ -97,6 +112,7 @@ func (s *Standalone) respondError(w http.ResponseWriter, r *http.Request, status } logger.Infof("errorhandler: maximum retry attempts exceeded; executing error template...") + span.SetAttributes(attribute.Bool("error.retries_exhausted", true)) s.defaultErrorResponse(w, r, statusCode) } diff --git a/pkg/openid/client/client.go b/pkg/openid/client/client.go index c2fa9b4..984d335 100644 --- a/pkg/openid/client/client.go +++ b/pkg/openid/client/client.go @@ -5,13 +5,14 @@ import ( "encoding/json" "errors" "fmt" - "github.com/nais/wonderwall/internal/o11y/otel" - "go.opentelemetry.io/otel/attribute" "io" "net/http" "strings" "time" + "github.com/nais/wonderwall/internal/o11y/otel" + "go.opentelemetry.io/otel/attribute" + httpinternal "github.com/nais/wonderwall/internal/http" "github.com/google/uuid" diff --git a/pkg/openid/client/login_callback.go b/pkg/openid/client/login_callback.go index b157548..3201884 100644 --- a/pkg/openid/client/login_callback.go +++ b/pkg/openid/client/login_callback.go @@ -4,9 +4,10 @@ import ( "context" "errors" "fmt" + "net/http" + "github.com/nais/wonderwall/internal/o11y/otel" "go.opentelemetry.io/otel/attribute" - "net/http" "github.com/nais/wonderwall/pkg/openid" ) diff --git a/pkg/openid/provider/provider.go b/pkg/openid/provider/provider.go index 1a37d29..411e37e 100644 --- a/pkg/openid/provider/provider.go +++ b/pkg/openid/provider/provider.go @@ -3,11 +3,12 @@ package provider import ( "context" "fmt" - "github.com/nais/wonderwall/internal/o11y/otel" - "go.opentelemetry.io/otel/attribute" "sync" "time" + "github.com/nais/wonderwall/internal/o11y/otel" + "go.opentelemetry.io/otel/attribute" + "github.com/lestrrat-go/jwx/v2/jwk" openidconfig "github.com/nais/wonderwall/pkg/openid/config"