From 75f2f9b29015f1be760331d07dbea31815adb7bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Pa=C3=9F?= <22845248+mpass99@users.noreply.github.com> Date: Fri, 21 Jul 2023 13:19:05 +0100 Subject: [PATCH] Add Sentry Stack Traces and exceptions for logs containing errors. --- internal/config/config.go | 4 +++- pkg/logging/sentry_hook.go | 36 +++++++++++++++++++++--------------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 61a469e..876211c 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -53,7 +53,9 @@ var ( Logger: logger{ Level: "INFO", }, - Sentry: sentry.ClientOptions{}, + Sentry: sentry.ClientOptions{ + AttachStacktrace: true, + }, InfluxDB: InfluxDB{ URL: "", Token: "", diff --git a/pkg/logging/sentry_hook.go b/pkg/logging/sentry_hook.go index f0afc4d..06b22db 100644 --- a/pkg/logging/sentry_hook.go +++ b/pkg/logging/sentry_hook.go @@ -2,6 +2,7 @@ package logging import ( "context" + "errors" "github.com/getsentry/sentry-go" "github.com/openHPI/poseidon/pkg/dto" "github.com/sirupsen/logrus" @@ -11,20 +12,10 @@ import ( // Consider replacing this with a more feature rich, additional dependency: https://github.com/evalphobia/logrus_sentry type SentryHook struct{} +var ErrorHubInvalid = errors.New("the hub is invalid") + // Fire is triggered on new log entries. func (hook *SentryHook) Fire(entry *logrus.Entry) error { - if data, ok := entry.Data["error"]; ok { - err, ok := data.(error) - if ok { - entry.Data["error"] = err.Error() - } - } - - event := sentry.NewEvent() - event.Timestamp = entry.Time - event.Level = sentry.Level(entry.Level.String()) - event.Message = entry.Message - var hub *sentry.Hub if entry.Context != nil { hub = sentry.GetHubFromContext(entry.Context) @@ -35,15 +26,30 @@ func (hook *SentryHook) Fire(entry *logrus.Entry) error { if hub == nil { hub = sentry.CurrentHub() } + client, scope := hub.Client(), hub.Scope() + if client == nil || scope == nil { + return ErrorHubInvalid + } - hub.Scope().SetContext("Poseidon Details", entry.Data) + scope.SetContext("Poseidon Details", entry.Data) if runnerID, ok := entry.Data[dto.KeyRunnerID].(string); ok { - hub.Scope().SetTag(dto.KeyRunnerID, runnerID) + scope.SetTag(dto.KeyRunnerID, runnerID) } if environmentID, ok := entry.Data[dto.KeyEnvironmentID].(string); ok { - hub.Scope().SetTag(dto.KeyEnvironmentID, environmentID) + scope.SetTag(dto.KeyEnvironmentID, environmentID) } + event := client.EventFromMessage(entry.Message, sentry.Level(entry.Level.String())) + event.Timestamp = entry.Time + // Add Exception when an error was passed. + if data, ok := entry.Data["error"]; ok { + err, ok := data.(error) + if ok { + entry.Data["error"] = err.Error() + const maxErrorDepth = 10 + event.SetException(err, maxErrorDepth) + } + } hub.CaptureEvent(event) return nil }