implement redis key ttl
All checks were successful
Build and Publish / check-chart (push) Successful in 12s
Build and Publish / helm-release (push) Has been skipped
Build and Publish / release (push) Successful in 3m52s

This commit is contained in:
Ryan McGuire 2025-04-03 15:51:52 -04:00
parent 15dd74d6ab
commit 21a4165489
4 changed files with 25 additions and 2 deletions

View File

@ -121,6 +121,10 @@
"default": "127.0.0.1",
"type": "string"
},
"redisKeyTTL": {
"default": "24h",
"type": "string"
},
"redisPassword": {
"type": "string"
},

View File

@ -22,4 +22,5 @@ type RedisConfig struct {
RedisDB int `yaml:"redisDB" env:"REDIS_DB" default:"0" json:"redisDB,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"`
RedisKeyTTL string `yaml:"redisKeyTTL" env:"REDIS_KEY_TTL" default:"24h" json:"redisKeyTTL,omitempty"`
}

View File

@ -5,6 +5,7 @@ import (
"crypto/tls"
"fmt"
"sync"
"time"
"gitea.libretechconsulting.com/rmcguire/go-app/pkg/otel"
"go.opentelemetry.io/otel/attribute"
@ -20,6 +21,7 @@ import (
)
const (
DEF_TTL = "24h"
DEF_RETAIN = 120
UPDATES_KEY = "weatherUpdates"
NAME = "redis recorder"
@ -27,6 +29,7 @@ const (
type RedisRecorder struct {
baseCtx context.Context
keyTTL time.Duration
tracer trace.Tracer
redis *redis.Client
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) {
r.log = zerolog.Ctx(r.baseCtx)
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 {
@ -54,7 +59,18 @@ func (r *RedisRecorder) Init(ctx context.Context, opts *recorders.RecorderOpts)
r.keep = opts.RetainLast
r.RWMutex = &sync.RWMutex{}
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")
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("redisPort", opts.AppConfig.RecorderConfig.RedisConfig.RedisPort),
attribute.Bool("tls", opts.AppConfig.RecorderConfig.RedisConfig.RedisTLS),
attribute.String("keyTTL", r.keyTTL.String()),
))
defer span.End()

View File

@ -48,6 +48,7 @@ func (r *RedisRecorder) set(ctx context.Context, data []byte) error {
pipe.LPush(ctx, r.Key(), data)
pipe.LTrim(ctx, r.Key(), 0, int64(r.keep)-1)
count = pipe.LLen(ctx, r.Key())
pipe.Expire(ctx, r.Key(), r.keyTTL)
return nil
})
if err != nil {