93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
package revelnewrelic
|
|
|
|
import (
|
|
"github.com/newrelic/go-agent"
|
|
"github.com/revel/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 (g *ServerNewRelic) Init(init *revel.EngineInit) {
|
|
g.GoHttpServer.Init(init)
|
|
}
|
|
|
|
func (nr *ServerNewRelic) Event(event int, args interface{}) {
|
|
|
|
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
|
|
|
|
}
|
|
|
|
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:])
|
|
}
|