implement redis key ttl
This commit is contained in:
		| @@ -121,6 +121,10 @@ | |||||||
|           "default": "127.0.0.1", |           "default": "127.0.0.1", | ||||||
|           "type": "string" |           "type": "string" | ||||||
|         }, |         }, | ||||||
|  |         "redisKeyTTL": { | ||||||
|  |           "default": "24h", | ||||||
|  |           "type": "string" | ||||||
|  |         }, | ||||||
|         "redisPassword": { |         "redisPassword": { | ||||||
|           "type": "string" |           "type": "string" | ||||||
|         }, |         }, | ||||||
|   | |||||||
| @@ -22,4 +22,5 @@ type RedisConfig struct { | |||||||
| 	RedisDB          int    `yaml:"redisDB" env:"REDIS_DB" default:"0" json:"redisDB,omitempty"` | 	RedisDB          int    `yaml:"redisDB" env:"REDIS_DB" default:"0" json:"redisDB,omitempty"` | ||||||
| 	RedisTLS         bool   `yaml:"redisTLS" env:"REDIS_TLS" default:"false" json:"redisTLS,omitempty"` | 	RedisTLS         bool   `yaml:"redisTLS" env:"REDIS_TLS" default:"false" json:"redisTLS,omitempty"` | ||||||
| 	RedisTLSInsecure bool   `yaml:"redisTLSInsecure" env:"REDIS_TLS_INSECURE" default:"false" json:"redisTLSInsecure,omitempty"` | 	RedisTLSInsecure bool   `yaml:"redisTLSInsecure" env:"REDIS_TLS_INSECURE" default:"false" json:"redisTLSInsecure,omitempty"` | ||||||
|  | 	RedisKeyTTL      string `yaml:"redisKeyTTL" env:"REDIS_KEY_TTL" default:"24h" json:"redisKeyTTL,omitempty"` | ||||||
| } | } | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ import ( | |||||||
| 	"crypto/tls" | 	"crypto/tls" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"sync" | 	"sync" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"gitea.libretechconsulting.com/rmcguire/go-app/pkg/otel" | 	"gitea.libretechconsulting.com/rmcguire/go-app/pkg/otel" | ||||||
| 	"go.opentelemetry.io/otel/attribute" | 	"go.opentelemetry.io/otel/attribute" | ||||||
| @@ -20,6 +21,7 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
|  | 	DEF_TTL     = "24h" | ||||||
| 	DEF_RETAIN  = 120 | 	DEF_RETAIN  = 120 | ||||||
| 	UPDATES_KEY = "weatherUpdates" | 	UPDATES_KEY = "weatherUpdates" | ||||||
| 	NAME        = "redis recorder" | 	NAME        = "redis recorder" | ||||||
| @@ -27,6 +29,7 @@ const ( | |||||||
|  |  | ||||||
| type RedisRecorder struct { | type RedisRecorder struct { | ||||||
| 	baseCtx context.Context | 	baseCtx context.Context | ||||||
|  | 	keyTTL  time.Duration | ||||||
| 	tracer  trace.Tracer | 	tracer  trace.Tracer | ||||||
| 	redis   *redis.Client | 	redis   *redis.Client | ||||||
| 	config  *config.AmbientLocalExporterConfig | 	config  *config.AmbientLocalExporterConfig | ||||||
| @@ -42,8 +45,10 @@ func (r *RedisRecorder) Ping(ctx context.Context) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (r *RedisRecorder) Init(ctx context.Context, opts *recorders.RecorderOpts) { | func (r *RedisRecorder) Init(ctx context.Context, opts *recorders.RecorderOpts) { | ||||||
|  | 	r.log = zerolog.Ctx(r.baseCtx) | ||||||
|  |  | ||||||
| 	if opts.AppConfig.RecorderConfig.RedisConfig == nil { | 	if opts.AppConfig.RecorderConfig.RedisConfig == nil { | ||||||
| 		panic("refusing to init redis recorder with no redisConfig") | 		r.log.Panic().Msg("refusing to init redis recorder with no redisConfig") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if opts.RetainLast < 1 { | 	if opts.RetainLast < 1 { | ||||||
| @@ -54,7 +59,18 @@ func (r *RedisRecorder) Init(ctx context.Context, opts *recorders.RecorderOpts) | |||||||
| 	r.keep = opts.RetainLast | 	r.keep = opts.RetainLast | ||||||
| 	r.RWMutex = &sync.RWMutex{} | 	r.RWMutex = &sync.RWMutex{} | ||||||
| 	r.baseCtx = opts.BaseCtx | 	r.baseCtx = opts.BaseCtx | ||||||
| 	r.log = zerolog.Ctx(r.baseCtx) |  | ||||||
|  | 	keyTTL := opts.AppConfig.RecorderConfig.RedisConfig.RedisKeyTTL | ||||||
|  | 	if keyTTL == "" { | ||||||
|  | 		keyTTL = DEF_TTL | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var err error | ||||||
|  | 	r.keyTTL, err = time.ParseDuration(keyTTL) | ||||||
|  | 	if err != nil { | ||||||
|  | 		r.log.Panic().Str("redisKeyTTL", keyTTL).Err(err). | ||||||
|  | 			Msg("invalid redis key ttl provided") | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	r.tracer = otel.GetTracer(r.baseCtx, "redisRecorder") | 	r.tracer = otel.GetTracer(r.baseCtx, "redisRecorder") | ||||||
| 	ctx, span := r.tracer.Start(ctx, "redisRecorder.init", trace.WithAttributes( | 	ctx, span := r.tracer.Start(ctx, "redisRecorder.init", trace.WithAttributes( | ||||||
| @@ -62,6 +78,7 @@ func (r *RedisRecorder) Init(ctx context.Context, opts *recorders.RecorderOpts) | |||||||
| 		attribute.Int("retainLast", opts.RetainLast), | 		attribute.Int("retainLast", opts.RetainLast), | ||||||
| 		attribute.Int("redisPort", opts.AppConfig.RecorderConfig.RedisConfig.RedisPort), | 		attribute.Int("redisPort", opts.AppConfig.RecorderConfig.RedisConfig.RedisPort), | ||||||
| 		attribute.Bool("tls", opts.AppConfig.RecorderConfig.RedisConfig.RedisTLS), | 		attribute.Bool("tls", opts.AppConfig.RecorderConfig.RedisConfig.RedisTLS), | ||||||
|  | 		attribute.String("keyTTL", r.keyTTL.String()), | ||||||
| 	)) | 	)) | ||||||
| 	defer span.End() | 	defer span.End() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,6 +48,7 @@ func (r *RedisRecorder) set(ctx context.Context, data []byte) error { | |||||||
| 		pipe.LPush(ctx, r.Key(), data) | 		pipe.LPush(ctx, r.Key(), data) | ||||||
| 		pipe.LTrim(ctx, r.Key(), 0, int64(r.keep)-1) | 		pipe.LTrim(ctx, r.Key(), 0, int64(r.keep)-1) | ||||||
| 		count = pipe.LLen(ctx, r.Key()) | 		count = pipe.LLen(ctx, r.Key()) | ||||||
|  | 		pipe.Expire(ctx, r.Key(), r.keyTTL) | ||||||
| 		return nil | 		return nil | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user