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 }