135 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
package bugsnag
 | 
						|
 | 
						|
import (
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/bugsnag/bugsnag-go/errors"
 | 
						|
)
 | 
						|
 | 
						|
// Context is the context of the error in Bugsnag.
 | 
						|
// This can be passed to Notify, Recover or AutoNotify as rawData.
 | 
						|
type Context struct {
 | 
						|
	String string
 | 
						|
}
 | 
						|
 | 
						|
// User represents the searchable user-data on Bugsnag. The Id is also used
 | 
						|
// to determine the number of users affected by a bug. This can be
 | 
						|
// passed to Notify, Recover or AutoNotify as rawData.
 | 
						|
type User struct {
 | 
						|
	Id    string `json:"id,omitempty"`
 | 
						|
	Name  string `json:"name,omitempty"`
 | 
						|
	Email string `json:"email,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// Sets the severity of the error on Bugsnag. These values can be
 | 
						|
// passed to Notify, Recover or AutoNotify as rawData.
 | 
						|
var (
 | 
						|
	SeverityError   = severity{"error"}
 | 
						|
	SeverityWarning = severity{"warning"}
 | 
						|
	SeverityInfo    = severity{"info"}
 | 
						|
)
 | 
						|
 | 
						|
// The severity tag type, private so that people can only use Error,Warning,Info
 | 
						|
type severity struct {
 | 
						|
	String string
 | 
						|
}
 | 
						|
 | 
						|
// The form of stacktrace that Bugsnag expects
 | 
						|
type stackFrame struct {
 | 
						|
	Method     string `json:"method"`
 | 
						|
	File       string `json:"file"`
 | 
						|
	LineNumber int    `json:"lineNumber"`
 | 
						|
	InProject  bool   `json:"inProject,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// Event represents a payload of data that gets sent to Bugsnag.
 | 
						|
// This is passed to each OnBeforeNotify hook.
 | 
						|
type Event struct {
 | 
						|
 | 
						|
	// The original error that caused this event, not sent to Bugsnag.
 | 
						|
	Error *errors.Error
 | 
						|
 | 
						|
	// The rawData affecting this error, not sent to Bugsnag.
 | 
						|
	RawData []interface{}
 | 
						|
 | 
						|
	// The error class to be sent to Bugsnag. This defaults to the type name of the Error, for
 | 
						|
	// example *error.String
 | 
						|
	ErrorClass string
 | 
						|
	// The error message to be sent to Bugsnag. This defaults to the return value of Error.Error()
 | 
						|
	Message string
 | 
						|
	// The stacktrrace of the error to be sent to Bugsnag.
 | 
						|
	Stacktrace []stackFrame
 | 
						|
 | 
						|
	// The context to be sent to Bugsnag. This should be set to the part of the app that was running,
 | 
						|
	// e.g. for http requests, set it to the path.
 | 
						|
	Context string
 | 
						|
	// The severity of the error. Can be SeverityError, SeverityWarning or SeverityInfo.
 | 
						|
	Severity severity
 | 
						|
	// The grouping hash is used to override Bugsnag's grouping. Set this if you'd like all errors with
 | 
						|
	// the same grouping hash to group together in the dashboard.
 | 
						|
	GroupingHash string
 | 
						|
 | 
						|
	// User data to send to Bugsnag. This is searchable on the dashboard.
 | 
						|
	User *User
 | 
						|
	// Other MetaData to send to Bugsnag. Appears as a set of tabbed tables in the dashboard.
 | 
						|
	MetaData MetaData
 | 
						|
}
 | 
						|
 | 
						|
func newEvent(err *errors.Error, rawData []interface{}, notifier *Notifier) (*Event, *Configuration) {
 | 
						|
 | 
						|
	config := notifier.Config
 | 
						|
	event := &Event{
 | 
						|
		Error:   err,
 | 
						|
		RawData: append(notifier.RawData, rawData...),
 | 
						|
 | 
						|
		ErrorClass: err.TypeName(),
 | 
						|
		Message:    err.Error(),
 | 
						|
		Stacktrace: make([]stackFrame, len(err.StackFrames())),
 | 
						|
 | 
						|
		Severity: SeverityWarning,
 | 
						|
 | 
						|
		MetaData: make(MetaData),
 | 
						|
	}
 | 
						|
 | 
						|
	for _, datum := range event.RawData {
 | 
						|
		switch datum := datum.(type) {
 | 
						|
		case severity:
 | 
						|
			event.Severity = datum
 | 
						|
 | 
						|
		case Context:
 | 
						|
			event.Context = datum.String
 | 
						|
 | 
						|
		case Configuration:
 | 
						|
			config = config.merge(&datum)
 | 
						|
 | 
						|
		case MetaData:
 | 
						|
			event.MetaData.Update(datum)
 | 
						|
 | 
						|
		case User:
 | 
						|
			event.User = &datum
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	for i, frame := range err.StackFrames() {
 | 
						|
		file := frame.File
 | 
						|
		inProject := config.isProjectPackage(frame.Package)
 | 
						|
 | 
						|
		// remove $GOROOT and $GOHOME from other frames
 | 
						|
		if idx := strings.Index(file, frame.Package); idx > -1 {
 | 
						|
			file = file[idx:]
 | 
						|
		}
 | 
						|
		if inProject {
 | 
						|
			file = config.stripProjectPackages(file)
 | 
						|
		}
 | 
						|
 | 
						|
		event.Stacktrace[i] = stackFrame{
 | 
						|
			Method:     frame.Name,
 | 
						|
			File:       file,
 | 
						|
			LineNumber: frame.LineNumber,
 | 
						|
			InProject:  inProject,
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return event, config
 | 
						|
}
 |