# HG changeset patch
# User Christophe de Vienne <christophe@cdevienne.info>
# Date 1600251029 -7200
#      Wed Sep 16 12:10:29 2020 +0200
# Node ID 46674693735b36d2c5706fee66a6594dcd132c2e
# Parent  847537d7ade0a5afa9c8081159eccf962352dee3
Add sentry support

diff --git a/sentry.go b/sentry.go
--- a/sentry.go
+++ b/sentry.go
@@ -3,29 +3,39 @@
 import (
 	"bytes"
 	"io"
-	"time"
 
 	"github.com/getsentry/sentry-go"
 	jsoniter "github.com/json-iterator/go"
-	"github.com/rs/zerolog/log"
 )
 
 // SentryOptions ...
 type SentryOptions struct {
 	SentryDSN func(string) `long:"dsn" env:"DSN" ini-name:"dsn" description:"Sentry DSN"`
-
-	client *sentry.Client
-	hub    *sentry.Hub
 }
 
-// GetClient returns the sentry client
-func (o SentryOptions) GetClient() *sentry.Client {
-	return o.client
-}
+// NewSentryOptions ...
+func NewSentryOptions(loggingOptions *LoggingOptions) *SentryOptions {
+	sentryOptions := SentryOptions{}
+	sentryOptions.SentryDSN = func(dsn string) {
+		log := loggingOptions.Logger()
+		client, err := sentry.NewClient(sentry.ClientOptions{
+			Dsn: dsn,
+		})
+		if err != nil {
+			log.Err(err).Msg("Could not initialize sentry")
+			return
+		}
+		hub := sentry.NewHub(client, sentry.NewScope())
 
-// GetHub returns the sentry hub
-func (o SentryOptions) GetHub() *sentry.Hub {
-	return o.hub
+		loggingOptions.AddLogWrapper(
+			func(next io.Writer) io.Writer {
+				return SentryLogger{hub, next}
+			})
+		//OnShutdown(func() {
+		//hub.Flush(time.Second)
+		//})
+	}
+	return &sentryOptions
 }
 
 // SentryLogger ...
@@ -117,31 +127,3 @@
 	}
 	return l.next.Write(p)
 }
-
-// Setup ...
-func (o *SentryOptions) Setup(loggingOptions *LoggingOptions, environment *string) {
-	o.SentryDSN = func(dsn string) {
-		client, err := sentry.NewClient(sentry.ClientOptions{
-			Environment: *environment,
-			Dsn:         dsn,
-		})
-		if err != nil {
-			log.Err(err).Msg("Could not initialize sentry")
-			return
-		}
-		o.client = client
-		o.hub = sentry.NewHub(client, sentry.NewScope())
-		loggingOptions.AddLogWrapper(func(next io.Writer) io.Writer {
-			return SentryLogger{o.hub, next}
-		})
-	}
-}
-
-// Shutdown ...
-func (o SentryOptions) Shutdown() {
-	if o.hub != nil {
-		o.hub.Flush(time.Second)
-		o.hub = nil
-		o.client = nil
-	}
-}
diff --git a/templates/server/cmd.gotmpl b/templates/server/cmd.gotmpl
--- a/templates/server/cmd.gotmpl
+++ b/templates/server/cmd.gotmpl
@@ -17,6 +17,7 @@
 	LoggingOptions  = orusapi.MustLoggingOptions(orusapi.NewLoggingOptions(&Logger, os.Stdout))
 	DatabaseOptions = &database.Options{}
 	ConfigFileOption = &ConfigFile{}
+	SentryOptions = orusapi.NewSentryOptions(LoggingOptions)
 
 	parser = flags.NewNamedParser("{{ dasherize (pascalize .Name) }}", flags.HelpFlag|flags.PassDoubleDash)
 	bootstrapParser = flags.NewNamedParser("{{ dasherize (pascalize .Name) }}", flags.IgnoreUnknown)
@@ -67,6 +68,7 @@
 	}
 	g.Namespace="log"
 	g.EnvNamespace="LOG"
+
 	g, err = parser.AddGroup("Database", "Database options", DatabaseOptions)
 	if err != nil {
 		panic(err)
@@ -74,6 +76,13 @@
 	g.Namespace="db"
 	g.EnvNamespace="DB"
 
+	g, err = parser.AddGroup("Sentry", "Sentry options", SentryOptions)
+	if err != nil {
+		panic(err)
+	}
+	g.Namespace="sentry"
+	g.EnvNamespace="SENTRY"
+
 	parser.AddCommand("generate-config", "Generate a configuration file", "", orusapi.NewGenerateConfigCmd(parser))
 
 	bootstrapParser.NamespaceDelimiter = "-"