github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/log/scripting.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/trace"
     8  )
     9  
    10  // Scripting returns trace.Scripting with logging events from details
    11  func Scripting(l Logger, d trace.Detailer, opts ...Option) (t trace.Scripting) {
    12  	return internalScripting(wrapLogger(l, opts...), d)
    13  }
    14  
    15  //nolint:funlen
    16  func internalScripting(l *wrapper, d trace.Detailer) (t trace.Scripting) {
    17  	t.OnExecute = func(info trace.ScriptingExecuteStartInfo) func(trace.ScriptingExecuteDoneInfo) {
    18  		if d.Details()&trace.ScriptingEvents == 0 {
    19  			return nil
    20  		}
    21  		ctx := with(*info.Context, TRACE, "ydb", "scripting", "execute")
    22  		l.Log(ctx, "start")
    23  		start := time.Now()
    24  
    25  		return func(info trace.ScriptingExecuteDoneInfo) {
    26  			if info.Error == nil {
    27  				l.Log(ctx, "done",
    28  					kv.Latency(start),
    29  					kv.Int("resultSetCount", info.Result.ResultSetCount()),
    30  					kv.NamedError("resultSetError", info.Result.Err()),
    31  				)
    32  			} else {
    33  				l.Log(WithLevel(ctx, ERROR), "failed",
    34  					kv.Error(info.Error),
    35  					kv.Latency(start),
    36  					kv.Version(),
    37  				)
    38  			}
    39  		}
    40  	}
    41  	t.OnExplain = func(info trace.ScriptingExplainStartInfo) func(trace.ScriptingExplainDoneInfo) {
    42  		if d.Details()&trace.ScriptingEvents == 0 {
    43  			return nil
    44  		}
    45  		ctx := with(*info.Context, TRACE, "ydb", "scripting", "explain")
    46  		l.Log(ctx, "start")
    47  		start := time.Now()
    48  
    49  		return func(info trace.ScriptingExplainDoneInfo) {
    50  			if info.Error == nil {
    51  				l.Log(ctx, "done",
    52  					kv.Latency(start),
    53  					kv.String("plan", info.Plan),
    54  				)
    55  			} else {
    56  				l.Log(WithLevel(ctx, ERROR), "failed",
    57  					kv.Error(info.Error),
    58  					kv.Latency(start),
    59  					kv.Version(),
    60  				)
    61  			}
    62  		}
    63  	}
    64  	t.OnStreamExecute = func(
    65  		info trace.ScriptingStreamExecuteStartInfo,
    66  	) func(
    67  		trace.ScriptingStreamExecuteIntermediateInfo,
    68  	) func(
    69  		trace.ScriptingStreamExecuteDoneInfo,
    70  	) {
    71  		if d.Details()&trace.ScriptingEvents == 0 {
    72  			return nil
    73  		}
    74  		ctx := with(*info.Context, TRACE, "ydb", "scripting", "stream", "execute")
    75  		query := info.Query
    76  		l.Log(ctx, "start",
    77  			appendFieldByCondition(l.logQuery,
    78  				kv.String("query", query),
    79  			)...,
    80  		)
    81  		start := time.Now()
    82  
    83  		return func(
    84  			info trace.ScriptingStreamExecuteIntermediateInfo,
    85  		) func(
    86  			trace.ScriptingStreamExecuteDoneInfo,
    87  		) {
    88  			if info.Error == nil {
    89  				l.Log(ctx, "intermediate")
    90  			} else {
    91  				l.Log(WithLevel(ctx, WARN), "intermediate failed",
    92  					kv.Error(info.Error),
    93  					kv.Version(),
    94  				)
    95  			}
    96  
    97  			return func(info trace.ScriptingStreamExecuteDoneInfo) {
    98  				if info.Error == nil {
    99  					l.Log(ctx, "done",
   100  						appendFieldByCondition(l.logQuery,
   101  							kv.String("query", query),
   102  							kv.Latency(start),
   103  						)...,
   104  					)
   105  				} else {
   106  					l.Log(WithLevel(ctx, ERROR), "failed",
   107  						appendFieldByCondition(l.logQuery,
   108  							kv.String("query", query),
   109  							kv.Error(info.Error),
   110  							kv.Latency(start),
   111  							kv.Version(),
   112  						)...,
   113  					)
   114  				}
   115  			}
   116  		}
   117  	}
   118  	t.OnClose = func(info trace.ScriptingCloseStartInfo) func(trace.ScriptingCloseDoneInfo) {
   119  		if d.Details()&trace.ScriptingEvents == 0 {
   120  			return nil
   121  		}
   122  		ctx := with(*info.Context, TRACE, "ydb", "scripting", "close")
   123  		l.Log(ctx, "start")
   124  		start := time.Now()
   125  
   126  		return func(info trace.ScriptingCloseDoneInfo) {
   127  			if info.Error == nil {
   128  				l.Log(ctx, "done",
   129  					kv.Latency(start),
   130  				)
   131  			} else {
   132  				l.Log(WithLevel(ctx, WARN), "failed",
   133  					kv.Error(info.Error),
   134  					kv.Latency(start),
   135  					kv.Version(),
   136  				)
   137  			}
   138  		}
   139  	}
   140  
   141  	return t
   142  }