Skip to content

Commit

Permalink
feat: provides logging and hook support for redis
Browse files Browse the repository at this point in the history
  • Loading branch information
mutezebra committed Nov 4, 2024
1 parent 19a9f12 commit 6df6365
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 0 deletions.
4 changes: 4 additions & 0 deletions pkg/base/client/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/redis/go-redis/v9"

"github.com/west2-online/fzuhelper-server/config"
"github.com/west2-online/fzuhelper-server/pkg/logger"
)

// NewRedisClient 传入dbName,具体参考 constants 包
Expand All @@ -36,6 +37,9 @@ func NewRedisClient(db int) (*redis.Client, error) {
Password: config.Redis.Password,
DB: db,
})
l := logger.GetRedisLogger()
redis.SetLogger(l)
client.AddHook(l)
_, err := client.Ping(context.TODO()).Result()
if err != nil {
return nil, fmt.Errorf("client.NewRedisClient: ping redis failed: %w", err)
Expand Down
1 change: 1 addition & 0 deletions pkg/constants/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ const (
ClassroomKeyExpire = 2 * 24 * time.Hour
LaunchScreenKeyExpire = 2 * 24 * time.Hour
LastLaunchScreenIdKey = "last_launch_screen_id"
RedisSlowQuery = 10 // ms redis默认的慢查询时间

SnowflakeWorkerID = 0
SnowflakeDatacenterID = 0
Expand Down
69 changes: 69 additions & 0 deletions pkg/logger/redis.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
Copyright 2024 The west2-online Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package logger

import (
"context"
"net"
"time"

kitexzap "github.com/kitex-contrib/obs-opentelemetry/logging/zap"
"github.com/redis/go-redis/v9"

"github.com/west2-online/fzuhelper-server/pkg/constants"
)

type RedisLogger struct {
*kitexzap.Logger
}

func (l *RedisLogger) Printf(ctx context.Context, template string, args ...interface{}) {
l.Infof(template, args...)
}

func (l *RedisLogger) DialHook(next redis.DialHook) redis.DialHook {
return func(ctx context.Context, network, addr string) (net.Conn, error) {
return next(ctx, network, addr)
}
}

func (l *RedisLogger) ProcessHook(next redis.ProcessHook) redis.ProcessHook {
return func(ctx context.Context, cmd redis.Cmder) error {
start := time.Now().UnixMilli()

if err := next(ctx, cmd); err != nil {
return err
}

consume := time.Now().UnixMilli() - start
if consume >= constants.RedisSlowQuery {
Warnf("slowly redis query. consume %d microsecond, query: %s", consume, cmd.String())
}

return nil
}
}

func (l *RedisLogger) ProcessPipelineHook(next redis.ProcessPipelineHook) redis.ProcessPipelineHook {
return func(ctx context.Context, cmds []redis.Cmder) error {
return next(ctx, cmds)
}
}

func GetRedisLogger() *RedisLogger {
return &RedisLogger{loggerObj}
}

0 comments on commit 6df6365

Please sign in to comment.