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  }