forked from revel/modules
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server-newrelic.go
91 lines (79 loc) · 2.53 KB
/
server-newrelic.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package revelnewrelic
import (
newrelic "github.com/newrelic/go-agent"
"github.com/terhitormanen/revel"
)
type ServerNewRelic struct {
NewRelicConfig *newrelic.Config
NewRelicApp newrelic.Application
revel.GoHttpServer
}
var serverLog = revel.AppLog
func init() {
revel.RegisterServerEngine("newrelic", func() revel.ServerEngine {
nr := &ServerNewRelic{
GoHttpServer: revel.GoHttpServer{},
}
config := newrelic.NewConfig("Unknown Application", " Unknown Key ")
nr.NewRelicConfig = &config
return nr
})
revel.RegisterModuleInit(func(m *revel.Module) {
serverLog = m.Log
})
}
func (nr *ServerNewRelic) Init(init *revel.EngineInit) {
nr.GoHttpServer.Init(init)
}
func (nr *ServerNewRelic) Event(event revel.Event, args interface{}) revel.EventResponse {
switch event {
case revel.ENGINE_BEFORE_INITIALIZED:
nr.NewRelicConfig.AppName = revel.Config.StringDefault("app.name", "Uknown App")
license := revel.Config.StringDefault("server.newrelic.license", "")
if license != "" {
nr.NewRelicConfig.License = license
serverLog.Debug("Assigned NewRelic license")
} else {
serverLog.Error("Newrelic license key not assigned, configuration missing 'server.newrelic.license'")
}
addfilter := revel.Config.BoolDefault("server.newrelic.addfilter", true)
if addfilter {
// Inject filter after the router (Normally position 2)
revel.Filters = append(revel.Filters, NewRelicFilter)
copy(revel.Filters[3:], revel.Filters[2:])
revel.Filters[2] = NewRelicFilter
serverLog.Debug("Newrelic filter injected")
}
case revel.ENGINE_STARTED:
// Check to see if configuration is set
// create the application interface
app, err := newrelic.NewApplication(*nr.NewRelicConfig)
if err != nil {
serverLog.Panic("Failed to start NewRelic:", "error", err)
}
nr.NewRelicApp = app
default:
}
return nr.GoHttpServer.Event(event, args)
}
func (nr *ServerNewRelic) Name() string {
return "newrelic"
}
func (nr *ServerNewRelic) Engine() interface{} {
return nr
}
// This is a simplistic example of setting up a filter to record all events for the
// webserver as transactions.
func NewRelicFilter(c *revel.Controller, fc []revel.Filter) {
if nr, ok := revel.CurrentEngine.Engine().(*ServerNewRelic); ok {
if nr.NewRelicApp != nil {
txn := nr.NewRelicApp.StartTransaction(c.Action,
c.Response.Out.Server.(*revel.GoResponse).Original,
c.Request.In.(*revel.GoRequest).Original)
defer txn.End()
} else {
serverLog.Error("Newrelic application not initialized before filter called")
}
}
fc[0](c, fc[1:])
}