Negroni integration guide

Add Bugsnag to your Negroni applications.

Installation

Download the code via go get:

go get github.com/bugsnag/bugsnag-go

Basic configuration

  1. Add bugsnagnegroni.AutoNotify immediately after the negroni.Recovery middleware in main.go. This causes unhandled panics to notify Bugsnag.

    
    import "github.com/bugsnag/bugsnag-go"
    import "github.com/bugsnag/bugsnag-go/negroni"
    
    func main() {
        errorHandlerConfig := bugsnag.Configuration{
            APIKey: "YOUR_API_KEY_HERE",
        }
        m.Use(negroni.Recovery())
        m.Use(bugsnagnegroni.AutoNotify(errorHandlerConfig))
    }
    
  2. Use your bugsnag.Configuration if you need to notify about non-fatal errors or recover from panics within goroutines.

    type App struct {
        errorHandlerConfig bugsnag.Configuration
    }
    
    // (app initialization) ...
    
    func MyHandler(w http.ResponseWriter, req *http.Request) {
        if err := processWhichMayErr() {
            bugsnag.notify(err, app.errorHandlerConfig)
        }
    }
    

Reporting unhandled exceptions

After completing installation and basic configuration, unhandled panics will be automatically reported. Error data will begin to appear in your project’s dashboard. To ensure panics from goroutines are handled effectively, see reporting panics from goroutines.

This feature is enabled via Configuration.PanicHandler, which forks and monitors the application as a sub-process, reporting any unhandled panics.

Reporting handled exceptions

Sometimes it is useful to manually notify Bugsnag of a problem. To do this, call bugsnag.Notify()

if err != nil {
    bugsnag.Notify(err)
}

When reporting handled exceptions, it’s often helpful to send us custom diagnostic data or to adjust the severity of particular errors. For more information, see the reporting handled errors reference.

Reporting panics from goroutines

Since goroutines are generally non-blocking, panics captured on a goroutine may crash the application before having the opportunity to be delivered to Bugsnag unless intentionally handled.

Use bugsnag.AutoNotify() to notify bugsnag of a panic while letting the program continue to panic. This is useful if you’re using a framework that already has some handling of panics and you are retrofitting Bugsnag support.

go func() {
    defer bugsnag.AutoNotify()

    // ...
}()

To avoid a panic in a goroutine from crashing your entire app, you can use bugsnag.Recover() to stop a panic from unwinding the stack any further. When Recover() is hit, it will send any current panic to Bugsnag and then stop panicking. This is most useful at the start of a goroutine:

go func() {
    defer bugsnag.Recover()

    // ...
}()

Sending diagnostic data

Most functions in the Bugsnag API, including bugsnag.Notify(), bugsnag.Recover(), bugsnag.AutoNotify(), and bugsnag.Handler() let you attach data to the notifications that they send. To do this you pass in rawData, which can be any of the supported types listed here.

Custom metaData appears as tabs on error reports on your Bugsnag dashboard. You can set it by passing a bugsnag.MetaData object as rawData.

bugsnag.Notify(err,
    bugsnag.MetaData{
        "Account": {
            "Name": Account.Name,
            "Paying": Account.Plan.Premium,
        },
    })

For more information, see the reporting handled errors reference.

Identifying users

User data is searchable, and the Id powers the count of users affected. You can set which user an error affects by passing a bugsnag.User object as rawData.

bugsnag.Notify(err,
    bugsnag.User{Id: "1234", Name: "Conrad", Email: "me@example.com"})

For more information, see the reporting handled errors reference.

Tracking deploys

By sending your source revision or application version when you deploy a new version, you’ll be able to see in which deployment each error was introduced and link stacktrace lines with the related code on GitHub.

Integrate a call to our deploy tracking API into your deployment process.

Next steps