在布法罗整合哨兵和弹性APM



我正在尝试使用Buffalo将Elastic APM和Sentry集成到我的网站中。有趣的文件如下:

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和Elastic,而不是试图重新实现它们的包装呢?

所以,我猜处理程序包装器正在丢弃水牛。上下文信息。

没错。问题是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和Elastic,而不需要重新实现它们的包装?

我可以看到两个选项:

  • 重新启用buffalo.WrapHandler/buffalo.WrapBuffaloHandler以停止丢弃水牛。上下文这将涉及到将buffalo.Context存储在底层http.Request的上下文中,然后在另一侧再次将其取出,而不是创建一个全新的上下文
  • 在不使用Wrap*函数的情况下,为Sentry和Elastic APM实现Buffalo特定的中间件

后一个选项的弹性APM代理中存在一个悬而未决的问题:弹性/APM#39。

相关内容

  • 没有找到相关文章

最新更新