// Package redisadapter provides the Redis client helpers used by Notification // Service runtime wiring. The helpers wrap `pkg/redisconn` so the runtime // keeps the same construction surface across the Stage 5 migration. package redisadapter import ( "context" "fmt" "galaxy/notification/internal/config" "galaxy/notification/internal/telemetry" "galaxy/redisconn" "github.com/redis/go-redis/extra/redisotel/v9" "github.com/redis/go-redis/v9" ) // NewClient constructs one Redis client from cfg using the shared // `pkg/redisconn` helper, which enforces the master/replica/password env-var // shape. func NewClient(cfg config.RedisConfig) *redis.Client { return redisconn.NewMasterClient(cfg.Conn) } // InstrumentClient attaches Redis tracing and metrics exporters to client // when telemetryRuntime is available. func InstrumentClient(client *redis.Client, telemetryRuntime *telemetry.Runtime) error { if client == nil { return fmt.Errorf("instrument redis client: nil client") } if telemetryRuntime == nil { return nil } if err := redisotel.InstrumentTracing( client, redisotel.WithTracerProvider(telemetryRuntime.TracerProvider()), redisotel.WithDBStatement(false), ); err != nil { return fmt.Errorf("instrument redis client tracing: %w", err) } if err := redisotel.InstrumentMetrics( client, redisotel.WithMeterProvider(telemetryRuntime.MeterProvider()), ); err != nil { return fmt.Errorf("instrument redis client metrics: %w", err) } return nil } // Ping performs the startup Redis connectivity check bounded by // cfg.Conn.OperationTimeout. func Ping(ctx context.Context, cfg config.RedisConfig, client *redis.Client) error { if client == nil { return fmt.Errorf("ping redis: nil client") } pingCtx, cancel := context.WithTimeout(ctx, cfg.Conn.OperationTimeout) defer cancel() if err := client.Ping(pingCtx).Err(); err != nil { return fmt.Errorf("ping redis: %w", err) } return nil }