-
Notifications
You must be signed in to change notification settings - Fork 2
/
middleware.go
56 lines (42 loc) · 1.21 KB
/
middleware.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package newrelic
import (
"fmt"
"net/http"
"net/url"
"strings"
newrelic "github.com/americanas-go/ignite/newrelic/go-agent.v3"
f "github.com/gofiber/fiber/v2"
nr "github.com/newrelic/go-agent/v3/newrelic"
)
func middleware(app *nr.Application) f.Handler {
return func(c *f.Ctx) error {
transactionPattern := fmt.Sprintf("%s - %s ", c.Method(), string(c.Request().URI().Path()))
txn := app.StartTransaction(transactionPattern)
defer txn.End()
// TODO criar whitelist de headers
c.Request().Header.VisitAll(func(key, value []byte) {
txn.AddAttribute(strings.ToLower(string(key)), string(value))
})
wr := setNewRelicWebRequest(c)
txn.SetWebRequest(wr)
ctx := c.Context()
ctx.SetUserValue(newrelic.NewRelicTransaction, txn)
return c.Next()
}
}
func setNewRelicWebRequest(c *f.Ctx) nr.WebRequest {
header := http.Header{}
c.Request().Header.VisitAll(func(key, value []byte) {
header.Add(string(key), string(value))
})
URL := fmt.Sprintf("%s%s", c.BaseURL(), c.Path())
parsedURL, _ := url.Parse(URL)
wr := nr.WebRequest{
Header: header,
URL: parsedURL,
Method: c.Method(),
Transport: nr.TransportType(c.Protocol()),
Host: string(c.Request().Host()),
}
return wr
}