From 45cf9d11462d0a04bc19984ebb99175c7ad35c19 Mon Sep 17 00:00:00 2001 From: RunsTp Date: Tue, 14 Mar 2023 08:43:40 +0800 Subject: [PATCH] [feature] #38 add sentry release --- config/config.template.yml | 5 ++++ internal/app/api/provide.go | 3 ++- internal/pkg/iversion/file.go | 29 ++++++++++++++++++++++ internal/pkg/log/sentry.go | 45 +++++++++++++++++++++++++++++++---- 4 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 internal/pkg/iversion/file.go diff --git a/config/config.template.yml b/config/config.template.yml index 2fb3e03..a25fb7c 100644 --- a/config/config.template.yml +++ b/config/config.template.yml @@ -26,6 +26,11 @@ db: cache: defaultExpiration: 0 # 默认缓存过期时间 单位 秒 0 永不过期 cleanupInterval: 600 # 清理过期缓存间隔 单位 秒 0 不自动清理 +sentry: + level: "error" # debug info warn error panic fatal, default: error + dsn: "" + enable_tracing: true + traces_sample_rate: 1.0 log: filename: /tmp/open.log maxSize: 500 diff --git a/internal/app/api/provide.go b/internal/app/api/provide.go index 3da08ec..edce402 100644 --- a/internal/app/api/provide.go +++ b/internal/app/api/provide.go @@ -7,6 +7,7 @@ import ( "vlink.dev/eoefans/internal/app/api/service" "vlink.dev/eoefans/internal/app/api/util/password" "vlink.dev/eoefans/internal/pkg/cache" + "vlink.dev/eoefans/internal/pkg/iversion" "vlink.dev/eoefans/internal/pkg/log" "vlink.dev/eoefans/internal/pkg/smsclient" ) @@ -21,7 +22,7 @@ func Provide() fx.Option { fx.Provide(cache.NewGoCache), fx.Provide(smsclient.NewRandomNumberCodeGenerator), fx.Provide(password.NewDefaultPasswordHandler), - fx.Provide(log.NewSentryConfig, log.NewSentry), + fx.Provide(iversion.NewFileVersion, log.NewSentryConfig, log.NewSentry), ) } diff --git a/internal/pkg/iversion/file.go b/internal/pkg/iversion/file.go new file mode 100644 index 0000000..b8abf28 --- /dev/null +++ b/internal/pkg/iversion/file.go @@ -0,0 +1,29 @@ +package iversion + +import ( + "os" + "strings" +) + +type Version interface { + Version() string +} + +type FileVersion struct { + version string +} + +func NewFileVersion() (Version, error) { + b, err := os.ReadFile("config/version") + if err != nil { + return &FileVersion{version: "Not Set Version"}, nil + } + + v := strings.Replace(string(b), "\r\n", "", -1) + v = strings.Replace(v, "\n", "", -1) + return &FileVersion{version: v}, nil +} + +func (v FileVersion) Version() string { + return v.version +} diff --git a/internal/pkg/log/sentry.go b/internal/pkg/log/sentry.go index aa94ebd..a78c8bf 100644 --- a/internal/pkg/log/sentry.go +++ b/internal/pkg/log/sentry.go @@ -4,21 +4,44 @@ import ( "github.com/TheZeroSlave/zapsentry" "github.com/getsentry/sentry-go" "github.com/pkg/errors" + "github.com/rogpeppe/go-internal/semver" "github.com/spf13/viper" "go.uber.org/zap" "go.uber.org/zap/zapcore" + "vlink.dev/eoefans/internal/pkg/iversion" ) type SentryConfig struct { + Level string `json:"level" yaml:"level" env:"SENTRY_LEVEL"` DSN string `json:"dsn" yaml:"dsn" env:"SENTRY_DSN"` EnableTracing bool `json:"enable_tracing" yaml:"enable_tracing" env:"SENTRY_ENABLE_TRACING"` + Release string `json:"release" yaml:"release" env:"SENTRY_RELEASE"` // Set TracesSampleRate to 1.0 to capture 100% // of transactions for performance monitoring. // We recommend adjusting this value in production, TracesSampleRate float64 `json:"traces_sample_rate" yaml:"traces_sample_rate" env:"SENTRY_TRACES_SAMPLE_RATE"` } -func NewSentryConfig(v *viper.Viper, logger *zap.Logger) (*SentryConfig, error) { +func (cfg SentryConfig) GetLevel() zapcore.Level { + switch cfg.Level { + case "debug": + return zapcore.DebugLevel + case "info": + return zapcore.InfoLevel + case "warn": + return zapcore.WarnLevel + case "error": + return zapcore.ErrorLevel + case "panic": + return zapcore.PanicLevel + case "fatal": + return zapcore.FatalLevel + default: + return zapcore.ErrorLevel + } +} + +func NewSentryConfig(v *viper.Viper, iVersion iversion.Version, logger *zap.Logger) (*SentryConfig, error) { var err error o := &SentryConfig{} if err = v.UnmarshalKey("sentry", o); err != nil { @@ -27,6 +50,9 @@ func NewSentryConfig(v *viper.Viper, logger *zap.Logger) (*SentryConfig, error) logger.Info("load sentry config success") + if semver.IsValid(iVersion.Version()) { + o.Release = iVersion.Version() + } return o, err } @@ -43,11 +69,20 @@ func NewSentry(sentryCfg *SentryConfig) (*sentry.Client, error) { return client, nil } -func ModifyToSentryLogger(logger *zap.Logger, client *sentry.Client) *zap.Logger { +func ModifyToSentryLogger( + logger *zap.Logger, + sentryCfg *SentryConfig, + client *sentry.Client, +) *zap.Logger { + // skip + if sentryCfg.DSN == "" { + return logger + } + cfg := zapsentry.Configuration{ - Level: zapcore.ErrorLevel, //when to send message to sentry - EnableBreadcrumbs: true, // enable sending breadcrumbs to Sentry - BreadcrumbLevel: zapcore.InfoLevel, // at what level should we sent breadcrumbs to sentry + Level: sentryCfg.GetLevel(), //when to send message to sentry + EnableBreadcrumbs: true, // enable sending breadcrumbs to Sentry + BreadcrumbLevel: zapcore.InfoLevel, // at what level should we sent breadcrumbs to sentry Tags: map[string]string{ "component": "system", },