Интеграция Sentry и Elasti c APM в Буффало - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь интегрировать Elasti c APM и Sentry в мой сайт, используя Buffalo. Интересные файлы:

handlers/sentryHandler.go

package handlers

import (
    sentryhttp "github.com/getsentry/sentry-go/http"
    "github.com/gobuffalo/buffalo"
)

func SentryHandler(next buffalo.Handler) buffalo.Handler {
    handler := buffalo.WrapBuffaloHandler(next)
    sentryHandler := sentryhttp.New(sentryhttp.Options{})

    return buffalo.WrapHandler(sentryHandler.Handle(handler))
}

handlers/elasticAPMHandler.go

package handlers

import (
    "fmt"

    "github.com/gobuffalo/buffalo"
    "go.elastic.co/apm/module/apmhttp"
)

func ElasticAPMHandler(next buffalo.Handler) buffalo.Handler {
    fmt.Println("AAA")
    handler := apmhttp.Wrap(buffalo.WrapBuffaloHandler(next))
    return buffalo.WrapHandler(handler)
}

actions/app.go

package actions

import (
    "github.com/gobuffalo/buffalo"
    "github.com/gobuffalo/envy"
    forcessl "github.com/gobuffalo/mw-forcessl"
    paramlogger "github.com/gobuffalo/mw-paramlogger"
    "github.com/unrolled/secure"

    "my_website/handlers"
    "my_website/models"

    "github.com/gobuffalo/buffalo-pop/pop/popmw"
    csrf "github.com/gobuffalo/mw-csrf"
    i18n "github.com/gobuffalo/mw-i18n"
    "github.com/gobuffalo/packr/v2"
)

func App() *buffalo.App {
    if app == nil {
        app = buffalo.New(buffalo.Options{
            Env:         ENV,
            SessionName: "_my_website_session",
        })

        // Automatically redirect to SSL
        app.Use(forceSSL())

        // Catch errors and send them to Sentry.
        app.Use(handlers.SentryHandler)

        // Get tracing information and send it to Elastic.
        app.Use(handlers.ElasticAPMHandler)

        // Other Buffalo middleware stuff goes here...

        // Routing stuff goes here...
    }

    return app
}

Проблема, с которой я сталкиваюсь, состоит в том, что если у меня есть обработчики Sentry / APM наверху, то я получаю ошибки типа application.html: line 24: "showPagePath": unknown identifier. Однако, если я переместлю его непосредственно перед настройкой маршрутов, я получу ошибку «Нет транзакций найдена». Итак, я предполагаю, что оболочки обработчика сбрасывают информацию buffalo.Context. Итак, что мне нужно сделать, чтобы иметь возможность интегрировать Sentry и Elasti c в Buffalo, помимо попыток переопределить их оболочки?

1 Ответ

0 голосов
/ 02 апреля 2020

Итак, я предполагаю, что обработчики-обработчики сбрасывают информацию о buffalo.Context.

Это верно. Проблема в том, что buffalo.WrapHandler ( Source ) отбрасывает весь контекст, кроме базового http.Request / http.Response:

// WrapHandler wraps a standard http.Handler and transforms it
// into a buffalo.Handler.
func WrapHandler(h http.Handler) Handler {
    return func(c Context) error {
        h.ServeHTTP(c.Response(), c.Request())
        return nil
    }
}

Итак, что бы Мне нужно сделать, чтобы иметь возможность интегрировать Sentry и Elasti c в Buffalo, кроме попыток переопределить их оболочки?

Я вижу два варианта:

  • Переопределение buffalo.WrapHandler / buffalo.WrapBuffaloHandler чтобы прекратить выбрасывать буйвола. Это будет включать в себя сохранение buffalo.Context в базовом контексте http.Request, а затем повторное извлечение его на другой стороне, вместо создания целого нового контекста.
  • Реализация связанного с Buffalo c middleware для Sentry и Elasti c APM без использования функций Wrap*.

В агенте Elasti c APM существует открытая проблема для последней опции: astic / apm # 39 .

...