forked from lug/matterbridge
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package airbrake // import "gopkg.in/gemnasium/logrus-airbrake-hook.v2"
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
	"os"
 | 
						|
 | 
						|
	"github.com/Sirupsen/logrus"
 | 
						|
	"gopkg.in/airbrake/gobrake.v2"
 | 
						|
)
 | 
						|
 | 
						|
// AirbrakeHook to send exceptions to an exception-tracking service compatible
 | 
						|
// with the Airbrake API.
 | 
						|
type airbrakeHook struct {
 | 
						|
	Airbrake *gobrake.Notifier
 | 
						|
}
 | 
						|
 | 
						|
func NewHook(projectID int64, apiKey, env string) *airbrakeHook {
 | 
						|
	airbrake := gobrake.NewNotifier(projectID, apiKey)
 | 
						|
	airbrake.AddFilter(func(notice *gobrake.Notice) *gobrake.Notice {
 | 
						|
		if env == "development" {
 | 
						|
			return nil
 | 
						|
		}
 | 
						|
		notice.Context["environment"] = env
 | 
						|
		return notice
 | 
						|
	})
 | 
						|
	hook := &airbrakeHook{
 | 
						|
		Airbrake: airbrake,
 | 
						|
	}
 | 
						|
	return hook
 | 
						|
}
 | 
						|
 | 
						|
func (hook *airbrakeHook) Fire(entry *logrus.Entry) error {
 | 
						|
	var notifyErr error
 | 
						|
	err, ok := entry.Data["error"].(error)
 | 
						|
	if ok {
 | 
						|
		notifyErr = err
 | 
						|
	} else {
 | 
						|
		notifyErr = errors.New(entry.Message)
 | 
						|
	}
 | 
						|
	var req *http.Request
 | 
						|
	for k, v := range entry.Data {
 | 
						|
		if r, ok := v.(*http.Request); ok {
 | 
						|
			req = r
 | 
						|
			delete(entry.Data, k)
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
	notice := hook.Airbrake.Notice(notifyErr, req, 3)
 | 
						|
	for k, v := range entry.Data {
 | 
						|
		notice.Context[k] = fmt.Sprintf("%s", v)
 | 
						|
	}
 | 
						|
 | 
						|
	hook.sendNotice(notice)
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (hook *airbrakeHook) sendNotice(notice *gobrake.Notice) {
 | 
						|
	if _, err := hook.Airbrake.SendNotice(notice); err != nil {
 | 
						|
		fmt.Fprintf(os.Stderr, "Failed to send error to Airbrake: %v\n", err)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (hook *airbrakeHook) Levels() []logrus.Level {
 | 
						|
	return []logrus.Level{
 | 
						|
		logrus.ErrorLevel,
 | 
						|
		logrus.FatalLevel,
 | 
						|
		logrus.PanicLevel,
 | 
						|
	}
 | 
						|
}
 |