NewEvent creates a new Sentry event for the given error.
(err error)
| 24 | |
| 25 | // NewEvent creates a new Sentry event for the given error. |
| 26 | func NewEvent(err error) *sentry.Event { |
| 27 | evt := sentry.NewEvent() |
| 28 | if err == nil { |
| 29 | return evt |
| 30 | } |
| 31 | |
| 32 | evt.Level = sentry.LevelError |
| 33 | |
| 34 | errStack := errors.Stack(err) |
| 35 | |
| 36 | messages := make([]string, 0, len(errStack)) |
| 37 | |
| 38 | for i, err := range errStack { |
| 39 | messages = append(messages, err.Error()) |
| 40 | exception := sentry.Exception{Value: err.Error()} |
| 41 | if ttnErr, ok := errors.From(err); ok && ttnErr != nil { |
| 42 | exception.Module = ttnErr.Namespace() |
| 43 | exception.Type = ttnErr.Name() |
| 44 | if i == 0 { // We set the namespace, name and ID from the first error in the chain. |
| 45 | evt.Tags["error.namespace"] = ttnErr.Namespace() |
| 46 | evt.Tags["error.name"] = ttnErr.Name() |
| 47 | if correlationID := ttnErr.CorrelationID(); correlationID != "" { |
| 48 | evt.EventID = sentry.EventID(correlationID) |
| 49 | } |
| 50 | } |
| 51 | evt.Contexts[ttnErr.FullName()+" attributes"] = ttnErr.Attributes() |
| 52 | if stackTrace := sentry.ExtractStacktrace(err); stackTrace != nil { |
| 53 | exception.Stacktrace = stackTrace |
| 54 | } |
| 55 | } |
| 56 | evt.Exception = append(evt.Exception, exception) |
| 57 | } |
| 58 | |
| 59 | evt.Message = strings.Join(messages, "\n--- ") |
| 60 | |
| 61 | return evt |
| 62 | } |
nothing calls this directly
no test coverage detected