diff --git a/cmd/gogstash.go b/cmd/gogstash.go index ac0d4cf..3465ee6 100644 --- a/cmd/gogstash.go +++ b/cmd/gogstash.go @@ -3,8 +3,11 @@ package cmd import ( "context" "net/http" + "os" "runtime" + "time" + "github.com/getsentry/sentry-go" "github.com/sirupsen/logrus" "github.com/tsaikd/KDGoLib/futil" @@ -24,7 +27,36 @@ func gogstash( debug bool, pprofAddress string, workerMode bool, -) error { +) (err error) { + defer func() { + if err != nil { + hub := sentry.CurrentHub().Clone() + hub.ConfigureScope(func(scope *sentry.Scope) { + scope.SetLevel(sentry.LevelError) + }) + hub.CaptureException(err) + } + }() + + dsn := os.Getenv("GS_SENTRY_DSN") + + if dsn != "" { + sentrySyncTransport := sentry.NewHTTPSyncTransport() + sentrySyncTransport.Timeout = time.Second * 3 + + err := sentry.Init(sentry.ClientOptions{ + Dsn: dsn, + TracesSampleRate: 1.0, + Transport: sentrySyncTransport, + }) + + if err != nil { + return err + } + } + + goglog.NewLogger() + if debug { goglog.Logger.SetLevel(logrus.DebugLevel) } diff --git a/config/goglog/goglog.go b/config/goglog/goglog.go index 87ef8df..2d7ba59 100644 --- a/config/goglog/goglog.go +++ b/config/goglog/goglog.go @@ -1,16 +1,22 @@ package goglog import ( + "fmt" "os" "strings" + "sync" + "github.com/getsentry/sentry-go" "github.com/sirupsen/logrus" "github.com/tsaikd/KDGoLib/logrusutil" "github.com/tsaikd/KDGoLib/runtimecaller" ) // Logger app logger -var Logger = newLogger() +var ( + initOnce sync.Once + Logger *LoggerType +) const timestampFormat = "2006/01/02 15:04:05" @@ -24,27 +30,50 @@ func filterGoglogRuntimeCaller(callinfo runtimecaller.CallInfo) (valid bool, sto return !strings.Contains(callinfo.PackageName(), "github.com/tsaikd/gogstash/config/goglog"), false } -func newLogger() *LoggerType { - return &LoggerType{ - stdout: &logrus.Logger{ - Out: os.Stdout, - Formatter: logrusFormatter, - Hooks: make(logrus.LevelHooks), - Level: logrus.InfoLevel, - }, - stderr: &logrus.Logger{ - Out: os.Stderr, - Formatter: logrusFormatter, - Hooks: make(logrus.LevelHooks), - Level: logrus.InfoLevel, - }, - } +func NewLogger() *LoggerType { + initOnce.Do(func() { + warnHub := sentry.CurrentHub().Clone() + warnHub.ConfigureScope(func(scope *sentry.Scope) { + scope.SetLevel(sentry.LevelWarning) + }) + + errorHub := sentry.CurrentHub().Clone() + errorHub.ConfigureScope(func(scope *sentry.Scope) { + scope.SetLevel(sentry.LevelError) + }) + + fatalHub := sentry.CurrentHub().Clone() + fatalHub.ConfigureScope(func(scope *sentry.Scope) { + scope.SetLevel(sentry.LevelFatal) + }) + + Logger = &LoggerType{ + stdout: &logrus.Logger{ + Out: os.Stdout, + Formatter: logrusFormatter, + Hooks: make(logrus.LevelHooks), + Level: logrus.InfoLevel, + }, + stderr: &logrus.Logger{ + Out: os.Stderr, + Formatter: logrusFormatter, + Hooks: make(logrus.LevelHooks), + Level: logrus.InfoLevel, + }, + warnHub: warnHub, + errorHub: errorHub, + fatalHub: fatalHub, + } + }) + return Logger } -// LoggerType wrap logrus.Logger type type LoggerType struct { - stdout *logrus.Logger - stderr *logrus.Logger + stdout *logrus.Logger + stderr *logrus.Logger + warnHub *sentry.Hub + errorHub *sentry.Hub + fatalHub *sentry.Hub } // WithField wrap logrus function @@ -79,26 +108,36 @@ func (t LoggerType) Printf(format string, args ...any) { // Warnf wrap logrus function func (t LoggerType) Warnf(format string, args ...any) { + t.warnHub.CaptureException(fmt.Errorf(format, args...)) + // t.captureWithSentry(sentry.LevelWarning, format, args...) t.stdout.Warnf(format, args...) } // Warningf wrap logrus function func (t LoggerType) Warningf(format string, args ...any) { + t.warnHub.CaptureException(fmt.Errorf(format, args...)) + // t.captureWithSentry(sentry.LevelWarning, format, args...) t.stdout.Warningf(format, args...) } // Errorf wrap logrus function -func (t LoggerType) Errorf(format string, args ...any) { +func (t *LoggerType) Errorf(format string, args ...any) { + t.errorHub.CaptureException(fmt.Errorf(format, args...)) + // t.captureWithSentry(sentry.LevelError, format, args...) t.stderr.Errorf(format, args...) } // Fatalf wrap logrus function func (t LoggerType) Fatalf(format string, args ...any) { + t.fatalHub.CaptureException(fmt.Errorf(format, args...)) + // t.captureWithSentry(sentry.LevelFatal, format, args...) t.stderr.Fatalf(format, args...) } // Panicf wrap logrus function func (t LoggerType) Panicf(format string, args ...any) { + t.fatalHub.CaptureException(fmt.Errorf(format, args...)) + // t.captureWithSentry(sentry.LevelFatal, format, args...) t.stderr.Panicf(format, args...) } diff --git a/go.mod b/go.mod index 8ab9802..9abfd49 100644 --- a/go.mod +++ b/go.mod @@ -51,6 +51,7 @@ require ( ) require ( + github.com/getsentry/sentry-go v0.28.0 github.com/samber/lo v1.38.1 github.com/shirou/gopsutil/v3 v3.21.11 ) @@ -87,7 +88,7 @@ require ( github.com/jmoiron/sqlx v1.2.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.7 // indirect github.com/lib/pq v1.3.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.1 // indirect @@ -138,7 +139,7 @@ require ( golang.org/x/tools v0.7.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect - gopkg.in/ini.v1 v1.55.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect gopkg.in/jcmturner/dnsutils.v1 v1.0.1 // indirect gopkg.in/jcmturner/gokrb5.v7 v7.5.0 // indirect diff --git a/go.sum b/go.sum index 30cc374..bbe48b3 100644 --- a/go.sum +++ b/go.sum @@ -139,7 +139,10 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsouza/go-dockerclient v1.9.7 h1:FlIrT71E62zwKgRvCvWGdxRD+a/pIy+miY/n3MXgfuw= github.com/fsouza/go-dockerclient v1.9.7/go.mod h1:vx9C32kE2D15yDSOMCDaAEIARZpDQDFBHeqL3MgQy/U= +github.com/getsentry/sentry-go v0.28.0 h1:7Rqx9M3ythTKy2J6uZLHmc8Sz9OGgIlseuO1iBX/s0M= +github.com/getsentry/sentry-go v0.28.0/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -227,7 +230,7 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= @@ -285,8 +288,8 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -361,8 +364,8 @@ github.com/nlopes/slack v0.6.0/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE= github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olivere/elastic/v7 v7.0.12/go.mod h1:14rWX28Pnh3qCKYRVnSGXWLf9MbLonYS/4FDCY3LAPo= github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E= @@ -393,6 +396,7 @@ github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.5.1+incompatible h1:Yq0up0149Hh5Ekhm/91lgkZuD1ZDnXNM26bycpTzYBM= github.com/pierrec/lz4 v2.5.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -872,8 +876,8 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.55.0 h1:E8yzL5unfpW3M6fz/eB7Cb5MQAYSZ7GKo4Qth+N2sgQ= -gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= diff --git a/main.go b/main.go index 15bf654..e25ab5d 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,8 @@ package main -import "github.com/tsaikd/gogstash/cmd" +import ( + "github.com/tsaikd/gogstash/cmd" +) func main() { cmd.Module.MustMainRun()