github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/log/retry.go (about) 1 package log 2 3 import ( 4 "time" 5 6 "github.com/ydb-platform/ydb-go-sdk/v3/internal/kv" 7 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors" 8 "github.com/ydb-platform/ydb-go-sdk/v3/retry" 9 "github.com/ydb-platform/ydb-go-sdk/v3/trace" 10 ) 11 12 // Retry returns trace.Retry with logging events from details 13 func Retry(l Logger, d trace.Detailer, opts ...Option) (t trace.Retry) { 14 return internalRetry(wrapLogger(l, opts...), d) 15 } 16 17 func internalRetry(l Logger, d trace.Detailer) (t trace.Retry) { 18 t.OnRetry = func(info trace.RetryLoopStartInfo) func(trace.RetryLoopDoneInfo) { 19 if d.Details()&trace.RetryEvents == 0 { 20 return nil 21 } 22 ctx := with(*info.Context, TRACE, "ydb", "retry") 23 label := info.Label 24 idempotent := info.Idempotent 25 l.Log(ctx, "start", 26 kv.String("label", label), 27 kv.Bool("idempotent", idempotent), 28 ) 29 start := time.Now() 30 31 return func(info trace.RetryLoopDoneInfo) { 32 if info.Error == nil { 33 l.Log(ctx, "done", 34 kv.String("label", label), 35 kv.Latency(start), 36 kv.Int("attempts", info.Attempts), 37 ) 38 } else { 39 lvl := ERROR 40 if !xerrors.IsYdb(info.Error) { 41 lvl = DEBUG 42 } 43 m := retry.Check(info.Error) 44 l.Log(WithLevel(ctx, lvl), "failed", 45 kv.Error(info.Error), 46 kv.String("label", label), 47 kv.Latency(start), 48 kv.Int("attempts", info.Attempts), 49 kv.Bool("retryable", m.MustRetry(idempotent)), 50 kv.Int64("code", m.StatusCode()), 51 kv.Bool("deleteSession", m.IsRetryObjectValid()), 52 kv.Version(), 53 ) 54 } 55 } 56 } 57 58 return t 59 }