Fibersentry


Fiber용 Sentry 지원 라이브러리입니다.

참고: Go 1.18 이상이 필요합니다

Installation

이 미들웨어는 Fiber v2를 지원합니다.

go get -u github.com/gofiber/fiber/v2
go get -u github.com/gofiber/contrib/fibersentry  
go get -u github.com/getsentry/sentry-go

Signatures

fibersentry.New(config ...fibersentry.Config) fiber.Handler

Config

속성
타입
설명
기본값

Repanic

bool

Repanic은 복구 후 Sentry가 패닉을 다시 발생시켜야 하는지 여부를 설정합니다. Recover 미들웨어를 사용하는 경우 true로 설정하세요.

false

WaitForDelivery

bool

WaitForDelivery는 응답을 진행하기 전에 요청을 차단할 것인지를 설정합니다. Recover 미들웨어를 사용하는 경우 이 옵션을 건너뛰거나 false로 설정해도 안전합니다.

false

Timeout

time.Duration

이벤트 전송 요청에 대한 시간 제한입니다.

time.Second * 2

Examples

fibersentry*sentry.Hub 인스턴스(https://godoc.org/github.com/getsentry/sentry-go#Hub)를 요청의 컨텍스트에 연결하여 요청의 나머지 수명 동안 사용할 수 있도록 합니다. fibersentry.GetHubFromContext() 메서드를 사용하여 이어지는 모든 미들웨어 및 경로에서 컨텍스트 자체에 액세스할 수 있습니다. 그리고 전역 sentry.CaptureMessage, sentry.CaptureException 또는 기타 호출 대신 사용해야 합니다. 요청 간의 데이터 분리를 유지하기 때문입니다.

fibersentry 이전에 연결된 미들웨어에서는 *sentry.Hub를 사용할 수 없습니다!

package main

import (
	"fmt"
	"log"

	"github.com/getsentry/sentry-go"
	"github.com/gofiber/contrib/fibersentry"
	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/v2/utils"
)

func main() {
	_ = sentry.Init(sentry.ClientOptions{
		Dsn: "",
		BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
			if hint.Context != nil {
				if c, ok := hint.Context.Value(sentry.RequestContextKey).(*fiber.Ctx); ok {
					// 패닉이 발생했을 때 원래의 컨텍스트에 액세스할 수 있습니다
					fmt.Println(utils.ImmutableString(c.Hostname()))
				}
			}
			fmt.Println(event)
			return event
		},
		Debug:            true,
		AttachStacktrace: true,
	})

	app := fiber.New()

	app.Use(fibersentry.New(fibersentry.Config{
		Repanic:         true,
		WaitForDelivery: true,
	}))

	enhanceSentryEvent := func(c *fiber.Ctx) error {
		if hub := fibersentry.GetHubFromContext(c); hub != nil {
			hub.Scope().SetTag("someRandomTag", "maybeYouNeedIt")
		}
		return c.Next()
	}

	app.All("/foo", enhanceSentryEvent, func(c *fiber.Ctx) error {
		panic("왜 그럴까")  
	})

	app.All("/", func(c *fiber.Ctx) error {
		if hub := fibersentry.GetHubFromContext(c); hub != nil {
			hub.WithScope(func(scope *sentry.Scope) {
				scope.SetExtra("unwantedQuery", "someQueryDataMaybe")
				hub.CaptureMessage("사용자가 원치 않는 쿼리 문자열을 제공했지만 정상적으로 복구되었습니다")
			})
		}
		return c.SendStatus(fiber.StatusOK)
	})

	log.Fatal(app.Listen(":3000"))
}

BeforeSend 콜백에서 컨텍스트 액세스하기

sentry.Init(sentry.ClientOptions{
	Dsn: "your-public-dsn",  
	BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
		if hint.Context != nil {
			if c, ok := hint.Context.Value(sentry.RequestContextKey).(*fiber.Ctx); ok {
				// 패닉이 발생했을 때 원래의 컨텍스트에 액세스할 수 있습니다
				fmt.Println(c.Hostname())
			}
		}
		return event
	},
})

Last updated