From 9e2df8f7c7e8ac2aed48467b23152a1b7ff1b17c Mon Sep 17 00:00:00 2001 From: rinfx Date: Mon, 10 Mar 2025 17:10:53 +0800 Subject: [PATCH] add redis init status log (#1867) Co-authored-by: Kent Dong --- .../wasm-go/extensions/ai-cache/cache/provider.go | 6 +++--- plugins/wasm-go/extensions/ai-cache/cache/redis.go | 12 ++++++++++-- plugins/wasm-go/extensions/ai-cache/config/config.go | 2 +- .../wasm-go/extensions/ai-token-ratelimit/config.go | 10 ++++++++-- .../wasm-go/extensions/ai-token-ratelimit/main.go | 2 +- plugins/wasm-go/pkg/wrapper/redis_wrapper.go | 6 ++++++ 6 files changed, 29 insertions(+), 9 deletions(-) diff --git a/plugins/wasm-go/extensions/ai-cache/cache/provider.go b/plugins/wasm-go/extensions/ai-cache/cache/provider.go index 9afca2c12..9521978f2 100644 --- a/plugins/wasm-go/extensions/ai-cache/cache/provider.go +++ b/plugins/wasm-go/extensions/ai-cache/cache/provider.go @@ -15,7 +15,7 @@ const ( type providerInitializer interface { ValidateConfig(ProviderConfig) error - CreateProvider(ProviderConfig) (Provider, error) + CreateProvider(ProviderConfig, wrapper.Log) (Provider, error) } var ( @@ -128,12 +128,12 @@ func (c *ProviderConfig) Validate() error { return nil } -func CreateProvider(pc ProviderConfig) (Provider, error) { +func CreateProvider(pc ProviderConfig, log wrapper.Log) (Provider, error) { initializer, has := providerInitializers[pc.typ] if !has { return nil, errors.New("unknown provider type: " + pc.typ) } - return initializer.CreateProvider(pc) + return initializer.CreateProvider(pc, log) } type Provider interface { diff --git a/plugins/wasm-go/extensions/ai-cache/cache/redis.go b/plugins/wasm-go/extensions/ai-cache/cache/redis.go index b4a116ab8..caa75c5ca 100644 --- a/plugins/wasm-go/extensions/ai-cache/cache/redis.go +++ b/plugins/wasm-go/extensions/ai-cache/cache/redis.go @@ -16,13 +16,14 @@ func (r *redisProviderInitializer) ValidateConfig(cf ProviderConfig) error { return nil } -func (r *redisProviderInitializer) CreateProvider(cf ProviderConfig) (Provider, error) { +func (r *redisProviderInitializer) CreateProvider(cf ProviderConfig, log wrapper.Log) (Provider, error) { rp := redisProvider{ config: cf, client: wrapper.NewRedisClusterClient(wrapper.FQDNCluster{ FQDN: cf.serviceName, Host: cf.serviceHost, Port: int64(cf.servicePort)}), + log: log, } err := rp.Init(cf.username, cf.password, cf.timeout) return &rp, err @@ -31,6 +32,7 @@ func (r *redisProviderInitializer) CreateProvider(cf ProviderConfig) (Provider, type redisProvider struct { config ProviderConfig client wrapper.RedisClient + log wrapper.Log } func (rp *redisProvider) GetProviderType() string { @@ -38,7 +40,13 @@ func (rp *redisProvider) GetProviderType() string { } func (rp *redisProvider) Init(username string, password string, timeout uint32) error { - return rp.client.Init(rp.config.username, rp.config.password, int64(rp.config.timeout), wrapper.WithDataBase(rp.config.database)) + err := rp.client.Init(rp.config.username, rp.config.password, int64(rp.config.timeout), wrapper.WithDataBase(rp.config.database)) + if rp.client.Ready() { + rp.log.Info("redis init successfully") + } else { + rp.log.Error("redis init failed, will try later") + } + return err } func (rp *redisProvider) Get(key string, cb wrapper.RedisResponseCallback) error { diff --git a/plugins/wasm-go/extensions/ai-cache/config/config.go b/plugins/wasm-go/extensions/ai-cache/config/config.go index bc1093a56..878567983 100644 --- a/plugins/wasm-go/extensions/ai-cache/config/config.go +++ b/plugins/wasm-go/extensions/ai-cache/config/config.go @@ -154,7 +154,7 @@ func (c *PluginConfig) Complete(log wrapper.Log) error { } if c.cacheProviderConfig.GetProviderType() != "" { log.Debugf("cache provider is set to %s", c.cacheProviderConfig.GetProviderType()) - c.cacheProvider, err = cache.CreateProvider(*c.cacheProviderConfig) + c.cacheProvider, err = cache.CreateProvider(*c.cacheProviderConfig, log) if err != nil { return err } diff --git a/plugins/wasm-go/extensions/ai-token-ratelimit/config.go b/plugins/wasm-go/extensions/ai-token-ratelimit/config.go index 743f2925f..d9b3482c0 100644 --- a/plugins/wasm-go/extensions/ai-token-ratelimit/config.go +++ b/plugins/wasm-go/extensions/ai-token-ratelimit/config.go @@ -82,7 +82,7 @@ type LimitConfigItem struct { timeWindow int64 // 时间窗口大小 } -func initRedisClusterClient(json gjson.Result, config *ClusterKeyRateLimitConfig) error { +func initRedisClusterClient(json gjson.Result, config *ClusterKeyRateLimitConfig, log wrapper.Log) error { redisConfig := json.Get("redis") if !redisConfig.Exists() { return errors.New("missing redis in config") @@ -111,7 +111,13 @@ func initRedisClusterClient(json gjson.Result, config *ClusterKeyRateLimitConfig Port: int64(servicePort), }) database := int(redisConfig.Get("database").Int()) - return config.redisClient.Init(username, password, int64(timeout), wrapper.WithDataBase(database)) + err := config.redisClient.Init(username, password, int64(timeout), wrapper.WithDataBase(database)) + if config.redisClient.Ready() { + log.Info("redis init successfully") + } else { + log.Error("redis init failed, will try later") + } + return err } func parseClusterKeyRateLimitConfig(json gjson.Result, config *ClusterKeyRateLimitConfig) error { diff --git a/plugins/wasm-go/extensions/ai-token-ratelimit/main.go b/plugins/wasm-go/extensions/ai-token-ratelimit/main.go index 6877ae5c2..3ebec532c 100644 --- a/plugins/wasm-go/extensions/ai-token-ratelimit/main.go +++ b/plugins/wasm-go/extensions/ai-token-ratelimit/main.go @@ -80,7 +80,7 @@ type LimitRedisContext struct { } func parseConfig(json gjson.Result, config *ClusterKeyRateLimitConfig, log wrapper.Log) error { - err := initRedisClusterClient(json, config) + err := initRedisClusterClient(json, config, log) if err != nil { return err } diff --git a/plugins/wasm-go/pkg/wrapper/redis_wrapper.go b/plugins/wasm-go/pkg/wrapper/redis_wrapper.go index d2cd0f5d4..a134d2486 100644 --- a/plugins/wasm-go/pkg/wrapper/redis_wrapper.go +++ b/plugins/wasm-go/pkg/wrapper/redis_wrapper.go @@ -30,6 +30,8 @@ type RedisResponseCallback func(response resp.Value) type RedisClient interface { Init(username, password string, timeout int64, opts ...optionFunc) error + // return whether redis client is ready + Ready() bool // with this function, you can call redis as if you are using redis-cli Command(cmds []interface{}, callback RedisResponseCallback) error Eval(script string, numkeys int, keys, args []interface{}, callback RedisResponseCallback) error @@ -183,6 +185,10 @@ func respString(args []interface{}) []byte { return buf.Bytes() } +func (c *RedisClusterClient[C]) Ready() bool { + return c.ready +} + func (c *RedisClusterClient[C]) Init(username, password string, timeout int64, opts ...optionFunc) error { for _, opt := range opts { opt(&c.option)