Fiber に New Relic を導入する Middleware を書いた

2021-03-04

Fiber で作った Web アプリケーションに New Relic を導入するための Middleware をつくりました。

Fiber は HTTP まわりの実装に valyala/fasthttp を使っているので、 net/http をコアにしたアプリケーションを想定して作られている公式の newrelic/go-agent ではまだ integration package が提供されていません。

ざっと探した感じサードパーティのものも見当たらないのでやってみようという経緯です。

使い方

Fiber に同梱されている他の Middleware と同じように app.Use() するだけです。 全てのエンドポイントが勝手に計測されます。

app := Fiber.new()

nrApp, err := newrelic.NewApplication(
    newrelic.ConfigAppName("Application Name"),
    newrelic.ConfigLicense(os.Getenv("NEW_RELIC_LICENSE_KEY")),
    newrelic.ConfigDebugLogger(os.Stdout),
)

app.Use(nrfiber.New(nrfiber.Config{
    NewRelicApp: nrApp
}))

DB アクセスなどリクエスト内で別のセグメントを計測するときは、Fiber.ctx に保存された txn を取り出して他の Wrapper に渡せます。

app.Get("/", func(c *fiber.Ctx) {
  txn, _ := c.Locals("newrelic_transaction").(*newrelic.Transaction)
})

その他

関係するリポジトリだけを直接行ったり来たりしながら作っていたので終わってから気付いたのですが、 Fiber の Organization には net/http との相互変換系がありました。 この辺りを使えば、よりスマートに同様のこともしくはエンドポイント単位で計測する・しないを分けるなどの工夫ができるかもしれません。