fix: redis's pipeline logs are not printed completely (#2538)
* fix: redis's pipeline logs are not printed completely * add unit test Signed-off-by: liaoshiwei <liaoshiwei@uniontech.com> Signed-off-by: liaoshiwei <liaoshiwei@uniontech.com>
This commit is contained in:
@@ -56,7 +56,7 @@ func (h hook) AfterProcess(ctx context.Context, cmd red.Cmder) error {
|
|||||||
|
|
||||||
duration := timex.Since(start)
|
duration := timex.Since(start)
|
||||||
if duration > slowThreshold.Load() {
|
if duration > slowThreshold.Load() {
|
||||||
logDuration(ctx, cmd, duration)
|
logDuration(ctx, []red.Cmder{cmd}, duration)
|
||||||
}
|
}
|
||||||
|
|
||||||
metricReqDur.Observe(int64(duration/time.Millisecond), cmd.Name())
|
metricReqDur.Observe(int64(duration/time.Millisecond), cmd.Name())
|
||||||
@@ -103,7 +103,7 @@ func (h hook) AfterProcessPipeline(ctx context.Context, cmds []red.Cmder) error
|
|||||||
|
|
||||||
duration := timex.Since(start)
|
duration := timex.Since(start)
|
||||||
if duration > slowThreshold.Load()*time.Duration(len(cmds)) {
|
if duration > slowThreshold.Load()*time.Duration(len(cmds)) {
|
||||||
logDuration(ctx, cmds[0], duration)
|
logDuration(ctx, cmds, duration)
|
||||||
}
|
}
|
||||||
|
|
||||||
metricReqDur.Observe(int64(duration/time.Millisecond), "Pipeline")
|
metricReqDur.Observe(int64(duration/time.Millisecond), "Pipeline")
|
||||||
@@ -136,13 +136,20 @@ func formatError(err error) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func logDuration(ctx context.Context, cmd red.Cmder, duration time.Duration) {
|
func logDuration(ctx context.Context, cmds []red.Cmder, duration time.Duration) {
|
||||||
var buf strings.Builder
|
var buf strings.Builder
|
||||||
for i, arg := range cmd.Args() {
|
for k, cmd := range cmds {
|
||||||
if i > 0 {
|
if k > 0 {
|
||||||
buf.WriteByte(' ')
|
buf.WriteByte('\n')
|
||||||
}
|
}
|
||||||
buf.WriteString(mapping.Repr(arg))
|
var build strings.Builder
|
||||||
|
for i, arg := range cmd.Args() {
|
||||||
|
if i > 0 {
|
||||||
|
build.WriteByte(' ')
|
||||||
|
}
|
||||||
|
build.WriteString(mapping.Repr(arg))
|
||||||
|
}
|
||||||
|
buf.WriteString(mapping.Repr(build.String()))
|
||||||
}
|
}
|
||||||
logx.WithContext(ctx).WithDuration(duration).Slowf("[REDIS] slowcall on executing: %s", buf.String())
|
logx.WithContext(ctx).WithDuration(duration).Slowf("[REDIS] slowcall on executing: %s", buf.String())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,6 +163,17 @@ func TestHookProcessPipelineCase5(t *testing.T) {
|
|||||||
assert.True(t, buf.Len() == 0)
|
assert.True(t, buf.Len() == 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLogDuration(t *testing.T) {
|
||||||
|
w, restore := injectLog()
|
||||||
|
defer restore()
|
||||||
|
|
||||||
|
logDuration(context.Background(), []red.Cmder{red.NewCmd(context.Background(), "get", "foo")}, 1*time.Second)
|
||||||
|
assert.True(t, strings.Contains(w.String(), "get foo"))
|
||||||
|
|
||||||
|
logDuration(context.Background(), []red.Cmder{red.NewCmd(context.Background(), "get", "foo"), red.NewCmd(context.Background(), "set", "bar", 0)}, 1*time.Second)
|
||||||
|
assert.True(t, strings.Contains(w.String(), "get foo\\nset bar 0"))
|
||||||
|
}
|
||||||
|
|
||||||
func injectLog() (r *strings.Builder, restore func()) {
|
func injectLog() (r *strings.Builder, restore func()) {
|
||||||
var buf strings.Builder
|
var buf strings.Builder
|
||||||
w := logx.NewWriter(&buf)
|
w := logx.NewWriter(&buf)
|
||||||
|
|||||||
Reference in New Issue
Block a user