github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/log/driver.go (about)

     1  package log
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/kv"
     8  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/secret"
     9  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xerrors"
    10  	"github.com/ydb-platform/ydb-go-sdk/v3/trace"
    11  )
    12  
    13  // Driver makes trace.Driver with logging events from details
    14  func Driver(l Logger, d trace.Detailer, opts ...Option) (t trace.Driver) {
    15  	return internalDriver(wrapLogger(l, opts...), d)
    16  }
    17  
    18  //nolint:gocyclo,funlen
    19  func internalDriver(l Logger, d trace.Detailer) trace.Driver {
    20  	return trace.Driver{
    21  		OnResolve: func(
    22  			info trace.DriverResolveStartInfo,
    23  		) func(
    24  			trace.DriverResolveDoneInfo,
    25  		) {
    26  			if d.Details()&trace.DriverResolverEvents == 0 {
    27  				return nil
    28  			}
    29  			ctx := with(context.Background(), TRACE, "ydb", "driver", "resolver", "update")
    30  			target := info.Target
    31  			addresses := info.Resolved
    32  			l.Log(ctx, "start",
    33  				kv.String("target", target),
    34  				kv.Strings("resolved", addresses),
    35  			)
    36  
    37  			return func(info trace.DriverResolveDoneInfo) {
    38  				if info.Error == nil {
    39  					l.Log(ctx, "done",
    40  						kv.String("target", target),
    41  						kv.Strings("resolved", addresses),
    42  					)
    43  				} else {
    44  					l.Log(WithLevel(ctx, WARN), "failed",
    45  						kv.Error(info.Error),
    46  						kv.String("target", target),
    47  						kv.Strings("resolved", addresses),
    48  						kv.Version(),
    49  					)
    50  				}
    51  			}
    52  		},
    53  		OnInit: func(info trace.DriverInitStartInfo) func(trace.DriverInitDoneInfo) {
    54  			if d.Details()&trace.DriverEvents == 0 {
    55  				return nil
    56  			}
    57  			endpoint := info.Endpoint
    58  			database := info.Database
    59  			secure := info.Secure
    60  			ctx := with(*info.Context, DEBUG, "ydb", "driver", "resolver", "init")
    61  			l.Log(ctx, "start",
    62  				kv.String("endpoint", endpoint),
    63  				kv.String("database", database),
    64  				kv.Bool("secure", secure),
    65  			)
    66  			start := time.Now()
    67  
    68  			return func(info trace.DriverInitDoneInfo) {
    69  				if info.Error == nil {
    70  					l.Log(ctx, "done",
    71  						kv.String("endpoint", endpoint),
    72  						kv.String("database", database),
    73  						kv.Bool("secure", secure),
    74  						kv.Latency(start),
    75  					)
    76  				} else {
    77  					l.Log(WithLevel(ctx, ERROR), "failed",
    78  						kv.Error(info.Error),
    79  						kv.String("endpoint", endpoint),
    80  						kv.String("database", database),
    81  						kv.Bool("secure", secure),
    82  						kv.Latency(start),
    83  						kv.Version(),
    84  					)
    85  				}
    86  			}
    87  		},
    88  		OnClose: func(info trace.DriverCloseStartInfo) func(trace.DriverCloseDoneInfo) {
    89  			if d.Details()&trace.DriverEvents == 0 {
    90  				return nil
    91  			}
    92  			ctx := with(*info.Context, TRACE, "ydb", "driver", "resolver", "close")
    93  			l.Log(ctx, "start")
    94  			start := time.Now()
    95  
    96  			return func(info trace.DriverCloseDoneInfo) {
    97  				if info.Error == nil {
    98  					l.Log(ctx, "done",
    99  						kv.Latency(start),
   100  					)
   101  				} else {
   102  					l.Log(WithLevel(ctx, WARN), "failed",
   103  						kv.Error(info.Error),
   104  						kv.Latency(start),
   105  						kv.Version(),
   106  					)
   107  				}
   108  			}
   109  		},
   110  		OnConnDial: func(info trace.DriverConnDialStartInfo) func(trace.DriverConnDialDoneInfo) {
   111  			if d.Details()&trace.DriverConnEvents == 0 {
   112  				return nil
   113  			}
   114  			ctx := with(*info.Context, TRACE, "ydb", "driver", "conn", "dial")
   115  			endpoint := info.Endpoint
   116  			l.Log(ctx, "start",
   117  				kv.Stringer("endpoint", endpoint),
   118  			)
   119  			start := time.Now()
   120  
   121  			return func(info trace.DriverConnDialDoneInfo) {
   122  				if info.Error == nil {
   123  					l.Log(ctx, "done",
   124  						kv.Stringer("endpoint", endpoint),
   125  						kv.Latency(start),
   126  					)
   127  				} else {
   128  					l.Log(WithLevel(ctx, WARN), "failed",
   129  						kv.Error(info.Error),
   130  						kv.Stringer("endpoint", endpoint),
   131  						kv.Latency(start),
   132  						kv.Version(),
   133  					)
   134  				}
   135  			}
   136  		},
   137  		OnConnStateChange: func(info trace.DriverConnStateChangeStartInfo) func(trace.DriverConnStateChangeDoneInfo) {
   138  			if d.Details()&trace.DriverConnEvents == 0 {
   139  				return nil
   140  			}
   141  			ctx := with(context.Background(), TRACE, "ydb", "driver", "conn", "state", "change")
   142  			endpoint := info.Endpoint
   143  			l.Log(ctx, "start",
   144  				kv.Stringer("endpoint", endpoint),
   145  				kv.Stringer("state", info.State),
   146  			)
   147  			start := time.Now()
   148  
   149  			return func(info trace.DriverConnStateChangeDoneInfo) {
   150  				l.Log(ctx, "done",
   151  					kv.Stringer("endpoint", endpoint),
   152  					kv.Latency(start),
   153  					kv.Stringer("state", info.State),
   154  				)
   155  			}
   156  		},
   157  		OnConnClose: func(info trace.DriverConnCloseStartInfo) func(trace.DriverConnCloseDoneInfo) {
   158  			if d.Details()&trace.DriverConnEvents == 0 {
   159  				return nil
   160  			}
   161  			ctx := with(*info.Context, TRACE, "ydb", "driver", "conn", "close")
   162  			endpoint := info.Endpoint
   163  			l.Log(ctx, "start",
   164  				kv.Stringer("endpoint", endpoint),
   165  			)
   166  			start := time.Now()
   167  
   168  			return func(info trace.DriverConnCloseDoneInfo) {
   169  				if info.Error == nil {
   170  					l.Log(ctx, "done",
   171  						kv.Stringer("endpoint", endpoint),
   172  						kv.Latency(start),
   173  					)
   174  				} else {
   175  					l.Log(WithLevel(ctx, WARN), "failed",
   176  						kv.Error(info.Error),
   177  						kv.Stringer("endpoint", endpoint),
   178  						kv.Latency(start),
   179  						kv.Version(),
   180  					)
   181  				}
   182  			}
   183  		},
   184  		OnConnInvoke: func(info trace.DriverConnInvokeStartInfo) func(trace.DriverConnInvokeDoneInfo) {
   185  			if d.Details()&trace.DriverConnEvents == 0 {
   186  				return nil
   187  			}
   188  			ctx := with(*info.Context, TRACE, "ydb", "driver", "conn", "invoke")
   189  			endpoint := info.Endpoint
   190  			method := string(info.Method)
   191  			l.Log(ctx, "start",
   192  				kv.Stringer("endpoint", endpoint),
   193  				kv.String("method", method),
   194  			)
   195  			start := time.Now()
   196  
   197  			return func(info trace.DriverConnInvokeDoneInfo) {
   198  				if info.Error == nil {
   199  					l.Log(ctx, "done",
   200  						kv.Stringer("endpoint", endpoint),
   201  						kv.String("method", method),
   202  						kv.Latency(start),
   203  						kv.Stringer("metadata", kv.Metadata(info.Metadata)),
   204  					)
   205  				} else {
   206  					l.Log(WithLevel(ctx, WARN), "failed",
   207  						kv.Error(info.Error),
   208  						kv.Stringer("endpoint", endpoint),
   209  						kv.String("method", method),
   210  						kv.Latency(start),
   211  						kv.Stringer("metadata", kv.Metadata(info.Metadata)),
   212  						kv.Version(),
   213  					)
   214  				}
   215  			}
   216  		},
   217  		OnConnNewStream: func(
   218  			info trace.DriverConnNewStreamStartInfo,
   219  		) func(
   220  			trace.DriverConnNewStreamDoneInfo,
   221  		) {
   222  			if d.Details()&trace.DriverConnStreamEvents == 0 {
   223  				return nil
   224  			}
   225  			ctx := with(*info.Context, TRACE, "ydb", "driver", "conn", "stream", "New")
   226  			endpoint := info.Endpoint
   227  			method := string(info.Method)
   228  			l.Log(ctx, "start",
   229  				kv.Stringer("endpoint", endpoint),
   230  				kv.String("method", method),
   231  			)
   232  			start := time.Now()
   233  
   234  			return func(info trace.DriverConnNewStreamDoneInfo) {
   235  				if info.Error == nil {
   236  					l.Log(ctx, "done",
   237  						kv.Stringer("endpoint", endpoint),
   238  						kv.String("method", method),
   239  						kv.Latency(start),
   240  					)
   241  				} else {
   242  					l.Log(WithLevel(ctx, WARN), "failed",
   243  						kv.Error(info.Error),
   244  						kv.Stringer("endpoint", endpoint),
   245  						kv.String("method", method),
   246  						kv.Latency(start),
   247  						kv.Version(),
   248  					)
   249  				}
   250  			}
   251  		},
   252  		OnConnStreamCloseSend: func(info trace.DriverConnStreamCloseSendStartInfo) func(
   253  			trace.DriverConnStreamCloseSendDoneInfo,
   254  		) {
   255  			if d.Details()&trace.DriverConnStreamEvents == 0 {
   256  				return nil
   257  			}
   258  			ctx := with(*info.Context, TRACE, "ydb", "driver", "conn", "stream", "CloseSend")
   259  			l.Log(ctx, "start")
   260  			start := time.Now()
   261  
   262  			return func(info trace.DriverConnStreamCloseSendDoneInfo) {
   263  				if info.Error == nil {
   264  					l.Log(ctx, "done",
   265  						kv.Latency(start),
   266  					)
   267  				} else {
   268  					l.Log(WithLevel(ctx, WARN), "failed",
   269  						kv.Error(info.Error),
   270  						kv.Latency(start),
   271  						kv.Version(),
   272  					)
   273  				}
   274  			}
   275  		},
   276  		OnConnStreamSendMsg: func(info trace.DriverConnStreamSendMsgStartInfo) func(trace.DriverConnStreamSendMsgDoneInfo) {
   277  			if d.Details()&trace.DriverConnStreamEvents == 0 {
   278  				return nil
   279  			}
   280  			ctx := with(*info.Context, TRACE, "ydb", "driver", "conn", "stream", "SendMsg")
   281  			l.Log(ctx, "start")
   282  			start := time.Now()
   283  
   284  			return func(info trace.DriverConnStreamSendMsgDoneInfo) {
   285  				if info.Error == nil {
   286  					l.Log(ctx, "done",
   287  						kv.Latency(start),
   288  					)
   289  				} else {
   290  					l.Log(WithLevel(ctx, WARN), "failed",
   291  						kv.Error(info.Error),
   292  						kv.Latency(start),
   293  						kv.Version(),
   294  					)
   295  				}
   296  			}
   297  		},
   298  		OnConnStreamRecvMsg: func(info trace.DriverConnStreamRecvMsgStartInfo) func(trace.DriverConnStreamRecvMsgDoneInfo) {
   299  			if d.Details()&trace.DriverConnStreamEvents == 0 {
   300  				return nil
   301  			}
   302  			ctx := with(*info.Context, TRACE, "ydb", "driver", "conn", "stream", "RecvMsg")
   303  			l.Log(ctx, "start")
   304  			start := time.Now()
   305  
   306  			return func(info trace.DriverConnStreamRecvMsgDoneInfo) {
   307  				if xerrors.HideEOF(info.Error) == nil {
   308  					l.Log(ctx, "done",
   309  						kv.Latency(start),
   310  					)
   311  				} else {
   312  					l.Log(WithLevel(ctx, WARN), "failed",
   313  						kv.Error(info.Error),
   314  						kv.Latency(start),
   315  						kv.Version(),
   316  					)
   317  				}
   318  			}
   319  		},
   320  		OnConnBan: func(info trace.DriverConnBanStartInfo) func(trace.DriverConnBanDoneInfo) {
   321  			if d.Details()&trace.DriverConnEvents == 0 {
   322  				return nil
   323  			}
   324  			ctx := with(*info.Context, TRACE, "ydb", "driver", "conn", "ban")
   325  			endpoint := info.Endpoint
   326  			cause := info.Cause
   327  			l.Log(ctx, "start",
   328  				kv.Stringer("endpoint", endpoint),
   329  				kv.NamedError("cause", cause),
   330  			)
   331  			start := time.Now()
   332  
   333  			return func(info trace.DriverConnBanDoneInfo) {
   334  				l.Log(WithLevel(ctx, WARN), "done",
   335  					kv.Stringer("endpoint", endpoint),
   336  					kv.Latency(start),
   337  					kv.Stringer("state", info.State),
   338  					kv.NamedError("cause", cause),
   339  					kv.Version(),
   340  				)
   341  			}
   342  		},
   343  		OnConnAllow: func(info trace.DriverConnAllowStartInfo) func(trace.DriverConnAllowDoneInfo) {
   344  			if d.Details()&trace.DriverConnEvents == 0 {
   345  				return nil
   346  			}
   347  			ctx := with(*info.Context, TRACE, "ydb", "driver", "conn", "allow")
   348  			endpoint := info.Endpoint
   349  			l.Log(ctx, "start",
   350  				kv.Stringer("endpoint", endpoint),
   351  			)
   352  			start := time.Now()
   353  
   354  			return func(info trace.DriverConnAllowDoneInfo) {
   355  				l.Log(ctx, "done",
   356  					kv.Stringer("endpoint", endpoint),
   357  					kv.Latency(start),
   358  					kv.Stringer("state", info.State),
   359  				)
   360  			}
   361  		},
   362  		OnRepeaterWakeUp: func(info trace.DriverRepeaterWakeUpStartInfo) func(trace.DriverRepeaterWakeUpDoneInfo) {
   363  			if d.Details()&trace.DriverRepeaterEvents == 0 {
   364  				return nil
   365  			}
   366  			ctx := with(*info.Context, TRACE, "ydb", "driver", "repeater", "wake", "up")
   367  			name := info.Name
   368  			event := info.Event
   369  			l.Log(ctx, "start",
   370  				kv.String("name", name),
   371  				kv.String("event", event),
   372  			)
   373  			start := time.Now()
   374  
   375  			return func(info trace.DriverRepeaterWakeUpDoneInfo) {
   376  				if info.Error == nil {
   377  					l.Log(ctx, "done",
   378  						kv.String("name", name),
   379  						kv.String("event", event),
   380  						kv.Latency(start),
   381  					)
   382  				} else {
   383  					l.Log(WithLevel(ctx, ERROR), "failed",
   384  						kv.Error(info.Error),
   385  						kv.String("name", name),
   386  						kv.String("event", event),
   387  						kv.Latency(start),
   388  						kv.Version(),
   389  					)
   390  				}
   391  			}
   392  		},
   393  		OnBalancerInit: func(info trace.DriverBalancerInitStartInfo) func(trace.DriverBalancerInitDoneInfo) {
   394  			if d.Details()&trace.DriverBalancerEvents == 0 {
   395  				return nil
   396  			}
   397  			ctx := with(*info.Context, TRACE, "ydb", "driver", "balancer", "init")
   398  			l.Log(ctx, "start")
   399  			start := time.Now()
   400  
   401  			return func(info trace.DriverBalancerInitDoneInfo) {
   402  				l.Log(WithLevel(ctx, INFO), "done",
   403  					kv.Latency(start),
   404  				)
   405  			}
   406  		},
   407  		OnBalancerClose: func(info trace.DriverBalancerCloseStartInfo) func(trace.DriverBalancerCloseDoneInfo) {
   408  			if d.Details()&trace.DriverBalancerEvents == 0 {
   409  				return nil
   410  			}
   411  			ctx := with(*info.Context, TRACE, "ydb", "driver", "balancer", "close")
   412  			l.Log(ctx, "start")
   413  			start := time.Now()
   414  
   415  			return func(info trace.DriverBalancerCloseDoneInfo) {
   416  				if info.Error == nil {
   417  					l.Log(ctx, "done",
   418  						kv.Latency(start),
   419  					)
   420  				} else {
   421  					l.Log(WithLevel(ctx, WARN), "failed",
   422  						kv.Error(info.Error),
   423  						kv.Latency(start),
   424  						kv.Version(),
   425  					)
   426  				}
   427  			}
   428  		},
   429  		OnBalancerChooseEndpoint: func(
   430  			info trace.DriverBalancerChooseEndpointStartInfo,
   431  		) func(
   432  			trace.DriverBalancerChooseEndpointDoneInfo,
   433  		) {
   434  			if d.Details()&trace.DriverBalancerEvents == 0 {
   435  				return nil
   436  			}
   437  			ctx := with(*info.Context, TRACE, "ydb", "driver", "balancer", "choose", "endpoint")
   438  			l.Log(ctx, "start")
   439  			start := time.Now()
   440  
   441  			return func(info trace.DriverBalancerChooseEndpointDoneInfo) {
   442  				if info.Error == nil {
   443  					l.Log(ctx, "done",
   444  						kv.Latency(start),
   445  						kv.Stringer("endpoint", info.Endpoint),
   446  					)
   447  				} else {
   448  					l.Log(WithLevel(ctx, ERROR), "failed",
   449  						kv.Error(info.Error),
   450  						kv.Latency(start),
   451  						kv.Version(),
   452  					)
   453  				}
   454  			}
   455  		},
   456  		OnBalancerUpdate: func(
   457  			info trace.DriverBalancerUpdateStartInfo,
   458  		) func(
   459  			trace.DriverBalancerUpdateDoneInfo,
   460  		) {
   461  			if d.Details()&trace.DriverBalancerEvents == 0 {
   462  				return nil
   463  			}
   464  			ctx := with(*info.Context, TRACE, "ydb", "driver", "balancer", "update")
   465  			l.Log(ctx, "start",
   466  				kv.Bool("needLocalDC", info.NeedLocalDC),
   467  				kv.String("database", info.Database),
   468  			)
   469  			start := time.Now()
   470  
   471  			return func(info trace.DriverBalancerUpdateDoneInfo) {
   472  				l.Log(ctx, "done",
   473  					kv.Latency(start),
   474  					kv.Stringer("endpoints", kv.Endpoints(info.Endpoints)),
   475  					kv.Stringer("added", kv.Endpoints(info.Added)),
   476  					kv.Stringer("dropped", kv.Endpoints(info.Dropped)),
   477  					kv.String("detectedLocalDC", info.LocalDC),
   478  				)
   479  			}
   480  		},
   481  		OnGetCredentials: func(info trace.DriverGetCredentialsStartInfo) func(trace.DriverGetCredentialsDoneInfo) {
   482  			if d.Details()&trace.DriverCredentialsEvents == 0 {
   483  				return nil
   484  			}
   485  			ctx := with(*info.Context, TRACE, "ydb", "driver", "credentials", "get")
   486  			l.Log(ctx, "start")
   487  			start := time.Now()
   488  
   489  			return func(info trace.DriverGetCredentialsDoneInfo) {
   490  				if info.Error == nil {
   491  					l.Log(ctx, "done",
   492  						kv.Latency(start),
   493  						kv.String("token", secret.Token(info.Token)),
   494  					)
   495  				} else {
   496  					l.Log(WithLevel(ctx, ERROR), "done",
   497  						kv.Error(info.Error),
   498  						kv.Latency(start),
   499  						kv.String("token", secret.Token(info.Token)),
   500  						kv.Version(),
   501  					)
   502  				}
   503  			}
   504  		},
   505  	}
   506  }