gpt4 book ai didi

go - 在 Buffalo 中集成 Sentry 和 Elastic APM

转载 作者:行者123 更新时间:2023-12-01 22:24:22 24 4
gpt4 key购买 nike

我正在尝试使用 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信息。那么,除了尝试重新实现它们的包装器之外,我还需要做什么才能在 Buffalo 中集成 Sentry 和 Elastic?

最佳答案

So, I'm guessing that the handler wrappers are dropping the buffalo.Context information.



这是正确的。问题是 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
}
}

So, what would I need to do to be able to integrate Sentry and Elastic in Buffalo asides from trying to reimplement their wrappers?



我可以看到两个选项:
  • 重新实现 buffalo.WrapHandler/buffalo.WrapBuffaloHandler停止扔掉 buffalo.Context。这将涉及存储 buffalo.Context在底层 http.Request的上下文,然后在另一侧再次将其拉出,而不是创建一个全新的上下文。
  • 在不使用 Wrap* 的情况下为 Sentry 和 Elastic APM 实现 Buffalo 特定的中间件职能。

  • 后一个选项的 Elastic APM 代理中存在一个 Unresolved 问题: elastic/apm#39 .

    关于go - 在 Buffalo 中集成 Sentry 和 Elastic APM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60920952/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com