summaryrefslogtreecommitdiffstats
path: root/vendor/gopkg.in/gemnasium/logrus-airbrake-hook.v2/airbrake.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gopkg.in/gemnasium/logrus-airbrake-hook.v2/airbrake.go')
-rw-r--r--vendor/gopkg.in/gemnasium/logrus-airbrake-hook.v2/airbrake.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/vendor/gopkg.in/gemnasium/logrus-airbrake-hook.v2/airbrake.go b/vendor/gopkg.in/gemnasium/logrus-airbrake-hook.v2/airbrake.go
new file mode 100644
index 00000000..a92e01ed
--- /dev/null
+++ b/vendor/gopkg.in/gemnasium/logrus-airbrake-hook.v2/airbrake.go
@@ -0,0 +1,71 @@
+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,
+ }
+}