From 57af39d24bd1b9c6f05710b870fb0b23a1963cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bonzi=20da=20Concei=C3=A7=C3=A3o?= Date: Sat, 21 Aug 2021 00:24:44 -0300 Subject: [PATCH] contrib/gofiber/fiber.v2: capture error from fiber handler The error returned from the fiber handler was being ignored by the middleware. It now correctly captures the error and sets it on the span. Fixes #978 --- contrib/gofiber/fiber.v2/fiber.go | 4 +++- contrib/gofiber/fiber.v2/fiber_test.go | 32 +++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/contrib/gofiber/fiber.v2/fiber.go b/contrib/gofiber/fiber.v2/fiber.go index 24da04ab92..e664deda00 100644 --- a/contrib/gofiber/fiber.v2/fiber.go +++ b/contrib/gofiber/fiber.v2/fiber.go @@ -64,7 +64,9 @@ func Middleware(opts ...Option) func(c *fiber.Ctx) error { } span.SetTag(ext.HTTPCode, strconv.Itoa(status)) - if cfg.isStatusError(status) { + if err != nil { + span.SetTag(ext.Error, err) + } else if cfg.isStatusError(status) { // mark 5xx server error span.SetTag(ext.Error, fmt.Errorf("%d: %s", status, http.StatusText(status))) } diff --git a/contrib/gofiber/fiber.v2/fiber_test.go b/contrib/gofiber/fiber.v2/fiber_test.go index 4b8d0c10ca..97b3ae1242 100644 --- a/contrib/gofiber/fiber.v2/fiber_test.go +++ b/contrib/gofiber/fiber.v2/fiber_test.go @@ -94,7 +94,7 @@ func TestTrace200(t *testing.T) { }) } -func TestError(t *testing.T) { +func TestStatusError(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() @@ -128,6 +128,36 @@ func TestError(t *testing.T) { assert.Equal(wantErr, span.Tag(ext.Error).(error).Error()) } +func TestCustomError(t *testing.T) { + assert := assert.New(t) + mt := mocktracer.Start() + defer mt.Stop() + + router := fiber.New() + router.Use(Middleware(WithServiceName("foobar"))) + + router.Get("/err", func(c *fiber.Ctx) error { + c.SendStatus(400) + return fiber.ErrBadRequest + }) + r := httptest.NewRequest("GET", "/err", nil) + + response, err := router.Test(r, 100) + assert.Equal(nil, err) + assert.Equal(response.StatusCode, 400) + + spans := mt.FinishedSpans() + assert.Len(spans, 1) + if len(spans) < 1 { + t.Fatalf("no spans") + } + span := spans[0] + assert.Equal("http.request", span.OperationName()) + assert.Equal("foobar", span.Tag(ext.ServiceName)) + assert.Equal("400", span.Tag(ext.HTTPCode)) + assert.Equal(fiber.ErrBadRequest, span.Tag(ext.Error).(*fiber.Error)) +} + func TestGetSpanNotInstrumented(t *testing.T) { assert := assert.New(t) router := fiber.New()