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 }