Files
poseidon/pkg/logging/sentry_hook.go
Maximilian Paß e7df777db4 Always log Runner and Environment ID.
Systematically log the runner id and the environment id by adding the information at the findRunnerMiddleware.
2023-07-15 21:46:56 +02:00

59 lines
1.6 KiB
Go

package logging
import (
"context"
"github.com/getsentry/sentry-go"
"github.com/openHPI/poseidon/pkg/dto"
"github.com/sirupsen/logrus"
)
// SentryHook is a simple adapter that converts logrus entries into Sentry events.
// Consider replacing this with a more feature rich, additional dependency: https://github.com/evalphobia/logrus_sentry
type SentryHook struct{}
// 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
event.Extra = entry.Data
var hub *sentry.Hub
if entry.Context != nil {
hub = sentry.GetHubFromContext(entry.Context)
// This might overwrite valid data when not the request context is passed.
entry.Data[dto.KeyRunnerID] = entry.Context.Value(dto.ContextKey(dto.KeyRunnerID))
entry.Data[dto.KeyEnvironmentID] = entry.Context.Value(dto.ContextKey(dto.KeyEnvironmentID))
}
if hub == nil {
hub = sentry.CurrentHub()
}
hub.CaptureEvent(event)
return nil
}
// Levels returns all levels this hook should be registered to.
func (hook *SentryHook) Levels() []logrus.Level {
return []logrus.Level{
logrus.PanicLevel,
logrus.FatalLevel,
logrus.ErrorLevel,
logrus.WarnLevel,
}
}
func StartSpan(op, description string, ctx context.Context, callback func(context.Context)) {
span := sentry.StartSpan(ctx, op)
span.Description = description
defer span.Finish()
callback(span.Context())
}