From edc66625baf4ef8a12d3ba7cb77766205ad57a29 Mon Sep 17 00:00:00 2001 From: hhs <386998068@qq.com> Date: Sun, 21 Jun 2026 23:08:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=20redis=5Fbucket.go=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=99=90=E6=B5=81=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 trace-aware 日志: - Error: Redis 限流检查失败(fail-open 降级) - Warn: 限流触发,记录 key 和 retry_after_sec --- backend/internal/ratelimit/redis_bucket.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/internal/ratelimit/redis_bucket.go b/backend/internal/ratelimit/redis_bucket.go index eb1e606..6b00759 100644 --- a/backend/internal/ratelimit/redis_bucket.go +++ b/backend/internal/ratelimit/redis_bucket.go @@ -7,6 +7,7 @@ import ( "time" "github.com/hhs/camtalk/internal/config" + "github.com/hhs/camtalk/internal/trace" "github.com/redis/go-redis/v9" ) @@ -72,6 +73,7 @@ func NewRedisLimiter(client *redis.Client, cfg config.RateLimitConfig) *RedisLim // Allow 实现 Limiter 接口。 func (l *RedisLimiter) Allow(ctx context.Context, key string) (bool, time.Duration) { + log := trace.FromContext(ctx) cfg := l.getBucketConfig(key) now := float64(time.Now().UnixNano()) / 1e9 // 秒,浮点 @@ -81,6 +83,7 @@ func (l *RedisLimiter) Allow(ctx context.Context, key string) (bool, time.Durati cfg.Capacity, cfg.Rate, now, ttl).Result() if err != nil { + log.Errorw("rate limit check failed", "key", key, "error", err) // Redis 错误时降级:允许请求(fail-open 策略) return true, 0 } @@ -100,6 +103,7 @@ func (l *RedisLimiter) Allow(ctx context.Context, key string) (bool, time.Durati } retryAfter := time.Duration(retryAfterSec*1000) * time.Millisecond + log.Warnw("rate limit triggered", "key", key, "retry_after_sec", retryAfterSec) return false, retryAfter }