From 7d2787c3a6896bd9bc047c87463fc330d23a67a1 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Fri, 1 Sep 2023 14:48:57 +0300 Subject: [PATCH] updates from testing --- common.go | 2 +- conn.go | 38 ++++++++---------- go.mod | 5 ++- go.sum | 6 ++- options.go | 12 +++--- stats.go | 2 +- stmt.go | 26 ++++++------- wrap.go | 112 ----------------------------------------------------- 8 files changed, 45 insertions(+), 158 deletions(-) diff --git a/common.go b/common.go index a0ee11a..4c3d5ce 100644 --- a/common.go +++ b/common.go @@ -39,7 +39,7 @@ func namedValueToLabels(named []driver.NamedValue) []interface{} { // getCallerName get the name of the function A where A() -> B() -> GetFunctionCallerName() func getCallerName() string { - pc, _, _, ok := runtime.Caller(2) + pc, _, _, ok := runtime.Caller(3) details := runtime.FuncForPC(pc) var callerName string if ok && details != nil { diff --git a/conn.go b/conn.go index 10e36d5..f599de1 100644 --- a/conn.go +++ b/conn.go @@ -6,6 +6,7 @@ import ( "fmt" "time" + requestid "go.unistack.org/micro-wrapper-requestid/v4" "go.unistack.org/micro/v4/tracer" ) @@ -99,12 +100,11 @@ func (w *wrapperConn) Begin() (driver.Tx, error) { // BeginTx implements driver.ConnBeginTx BeginTx func (w *wrapperConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { nctx, span := w.opts.Tracer.Start(ctx, "sdk.database", tracer.WithSpanKind(tracer.SpanKindClient)) - span.AddLabels("method", "BeginTx") + span.AddLabels("db.method", "BeginTx") name := getQueryName(ctx) - if name != "" { - span.AddLabels("db.query", name) - } else { - name = getCallerName() + span.AddLabels("db.statement", name) + if id, ok := ctx.Value(requestid.XRequestIDKey).(string); ok { + span.AddLabels("x-request-id", id) } labels := []string{labelMethod, "BeginTx", labelQuery, name} @@ -178,14 +178,12 @@ func (w *wrapperConn) PrepareContext(ctx context.Context, query string) (driver. } else { nctx, span = w.opts.Tracer.Start(ctx, "sdk.database", tracer.WithSpanKind(tracer.SpanKindClient)) } - span.AddLabels("method", "PrepareContext") + span.AddLabels("db.method", "PrepareContext") name := getQueryName(ctx) - if name != "" { - span.AddLabels("db.query", name) - } else { - name = getCallerName() + span.AddLabels("db.statement", name) + if id, ok := ctx.Value(requestid.XRequestIDKey).(string); ok { + span.AddLabels("x-request-id", id) } - labels := []string{labelMethod, "PrepareContext", labelQuery, name} conn, ok := w.conn.(driver.ConnPrepareContext) if !ok { @@ -259,12 +257,11 @@ func (w *wrapperConn) ExecContext(ctx context.Context, query string, args []driv } else { nctx, span = w.opts.Tracer.Start(ctx, "sdk.database", tracer.WithSpanKind(tracer.SpanKindClient)) } - span.AddLabels("method", "ExecContext") + span.AddLabels("db.method", "ExecContext") name := getQueryName(ctx) - if name != "" { - span.AddLabels("db.query", name) - } else { - name = getCallerName() + span.AddLabels("db.statement", name) + if id, ok := ctx.Value(requestid.XRequestIDKey).(string); ok { + span.AddLabels("x-request-id", id) } defer span.Finish() if len(args) > 0 { @@ -382,12 +379,11 @@ func (w *wrapperConn) QueryContext(ctx context.Context, query string, args []dri } else { nctx, span = w.opts.Tracer.Start(ctx, "sdk.database", tracer.WithSpanKind(tracer.SpanKindClient)) } - span.AddLabels("method", "QueryContext") + span.AddLabels("db.method", "QueryContext") name := getQueryName(ctx) - if name != "" { - span.AddLabels("db.statement", name) - } else { - name = getCallerName() + span.AddLabels("db.statement", name) + if id, ok := ctx.Value(requestid.XRequestIDKey).(string); ok { + span.AddLabels("x-request-id", id) } defer span.Finish() if len(args) > 0 { diff --git a/go.mod b/go.mod index 504960d..3b802a8 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module go.unistack.org/micro-wrapper-sql/v4 go 1.20 -require go.unistack.org/micro/v4 v4.0.3 +require ( + go.unistack.org/micro-wrapper-requestid/v4 v4.0.3 + go.unistack.org/micro/v4 v4.0.8 +) diff --git a/go.sum b/go.sum index 4793360..ac08c61 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,4 @@ -go.unistack.org/micro/v4 v4.0.3 h1:AFr21ua3IrkuxH26kNYVrs7Kpsrm+4aylE/PfjLdCWM= -go.unistack.org/micro/v4 v4.0.3/go.mod h1:+wBa98rSf+mRXb/MuSVFPXtDrqN0k8rzPQiC8wRCwCo= +go.unistack.org/micro-wrapper-requestid/v4 v4.0.3 h1:LhloK8yLLsov4XiKw9i20wdBUfvWCG1TaBNgNVtNa8Q= +go.unistack.org/micro-wrapper-requestid/v4 v4.0.3/go.mod h1:vRIkCMyhbBVus1xQlr/Fef65n07znrBGkpSCpjkEiqk= +go.unistack.org/micro/v4 v4.0.8 h1:D5n18+fhyRjJkKSPdIcW1ratWUuzy9TzrS5ud/qImWg= +go.unistack.org/micro/v4 v4.0.8/go.mod h1:QT3gOIE4qGgBiQGm2Pad/62Sl5R53QfrgYHD448aX14= diff --git a/options.go b/options.go index 73571f1..46b5bee 100644 --- a/options.go +++ b/options.go @@ -17,7 +17,7 @@ var ( DefaultMeterMetricPrefix = "micro_sql_" // DefaultLoggerObserver used to prepare labels for logger DefaultLoggerObserver = func(ctx context.Context, method string, query string, td time.Duration, err error) []interface{} { - labels := []interface{}{"method", method, "took", fmt.Sprintf("%v", td)} + labels := []interface{}{"db.method", method, "took", fmt.Sprintf("%v", td)} if err != nil { labels = append(labels, "error", err.Error()) } @@ -44,13 +44,13 @@ var ( meterRequestDurationSeconds = "request_duration_seconds" labelUnknown = "unknown" - labelQuery = "query" - labelMethod = "method" + labelQuery = "db.statement" + labelMethod = "db.method" labelStatus = "status" labelSuccess = "success" labelFailure = "failure" - labelHost = "db_host" - labelDatabase = "db_name" + labelHost = "db.host" + labelDatabase = "db.name" ) // Options struct holds wrapper options @@ -180,5 +180,5 @@ func getQueryName(ctx context.Context) string { if v, ok := ctx.Value(queryNameKey{}).(string); ok && v != labelUnknown { return v } - return "" + return getCallerName() } diff --git a/stats.go b/stats.go index 85f5207..f606e82 100644 --- a/stats.go +++ b/stats.go @@ -1,4 +1,4 @@ -package wrapper // import "go.unistack.org/micro-wrapper-sql-1/v3" +package wrapper // import "go.unistack.org/micro-wrapper-sql/v4" import ( "context" diff --git a/stmt.go b/stmt.go index d7597f4..09117b3 100644 --- a/stmt.go +++ b/stmt.go @@ -6,6 +6,7 @@ import ( "fmt" "time" + requestid "go.unistack.org/micro-wrapper-requestid/v4" "go.unistack.org/micro/v4/tracer" ) @@ -75,8 +76,7 @@ func (w *wrapperStmt) Exec(args []driver.Value) (driver.Result, error) { } labels := []string{labelMethod, "Exec"} ts := time.Now() - // nolint:staticcheck - res, err := w.stmt.Exec(args) + res, err := w.stmt.Exec(args) // nolint:staticcheck td := time.Since(ts) te := td.Seconds() if err != nil { @@ -141,17 +141,16 @@ func (w *wrapperStmt) ExecContext(ctx context.Context, args []driver.NamedValue) } else { nctx, span = w.opts.Tracer.Start(ctx, "sdk.database", tracer.WithSpanKind(tracer.SpanKindClient)) } - span.AddLabels("method", "ExecContext") + span.AddLabels("db.method", "ExecContext") name := getQueryName(ctx) - if name != "" { - span.AddLabels("db.query", name) - } else { - name = getCallerName() - } + span.AddLabels("db.statement", name) defer span.Finish() if len(args) > 0 { span.AddLabels("db.args", fmt.Sprintf("%v", namedValueToLabels(args))) } + if id, ok := ctx.Value(requestid.XRequestIDKey).(string); ok { + span.AddLabels("x-request-id", id) + } labels := []string{labelMethod, "ExecContext", labelQuery, name} if conn, ok := w.stmt.(driver.StmtExecContext); ok { @@ -215,17 +214,16 @@ func (w *wrapperStmt) QueryContext(ctx context.Context, args []driver.NamedValue } else { nctx, span = w.opts.Tracer.Start(ctx, "sdk.database", tracer.WithSpanKind(tracer.SpanKindClient)) } - span.AddLabels("method", "QueryContext") + span.AddLabels("db.method", "QueryContext") name := getQueryName(ctx) - if name != "" { - span.AddLabels("db.query", name) - } else { - name = getCallerName() - } + span.AddLabels("db.statement", name) defer span.Finish() if len(args) > 0 { span.AddLabels("db.args", fmt.Sprintf("%v", namedValueToLabels(args))) } + if id, ok := ctx.Value(requestid.XRequestIDKey).(string); ok { + span.AddLabels("x-request-id", id) + } labels := []string{labelMethod, "QueryContext", labelQuery, name} if conn, ok := w.stmt.(driver.StmtQueryContext); ok { ts := time.Now() diff --git a/wrap.go b/wrap.go index ec4ec4f..527b135 100644 --- a/wrap.go +++ b/wrap.go @@ -11,118 +11,6 @@ func wrapDriver(d driver.Driver, opts Options) driver.Driver { return struct{ driver.Driver }{&wrapperDriver{driver: d, opts: opts}} } -/* -func wrapStmt(stmt driver.Stmt, query string, opts Options) driver.Stmt { - var ( - _, hasExeCtx = stmt.(driver.StmtExecContext) - _, hasQryCtx = stmt.(driver.StmtQueryContext) - wc, hasColConv = stmt.(driver.ColumnConverter) //nolint:staticcheck - wn, hasNamValChk = stmt.(driver.NamedValueChecker) - ) - - ws := &wrapperStmt{stmt: stmt, query: query, opts: opts} - switch { - case !hasExeCtx && !hasQryCtx && !hasColConv && !hasNamValChk: - return struct { - driver.Stmt - }{ws} - case !hasExeCtx && hasQryCtx && !hasColConv && !hasNamValChk: - return struct { - driver.Stmt - driver.StmtQueryContext - }{ws, ws} - case hasExeCtx && !hasQryCtx && !hasColConv && !hasNamValChk: - return struct { - driver.Stmt - driver.StmtExecContext - }{ws, ws} - case hasExeCtx && hasQryCtx && !hasColConv && !hasNamValChk: - return struct { - driver.Stmt - driver.StmtExecContext - driver.StmtQueryContext - }{ws, ws, ws} - case !hasExeCtx && !hasQryCtx && hasColConv && !hasNamValChk: - return struct { - driver.Stmt - driver.ColumnConverter - }{ws, wc} - case !hasExeCtx && hasQryCtx && hasColConv && !hasNamValChk: - return struct { - driver.Stmt - driver.StmtQueryContext - driver.ColumnConverter - }{ws, ws, wc} - case hasExeCtx && !hasQryCtx && hasColConv && !hasNamValChk: - return struct { - driver.Stmt - driver.StmtExecContext - driver.ColumnConverter - }{ws, ws, wc} - case hasExeCtx && hasQryCtx && hasColConv && !hasNamValChk: - return struct { - driver.Stmt - driver.StmtExecContext - driver.StmtQueryContext - driver.ColumnConverter - }{ws, ws, ws, wc} - case !hasExeCtx && !hasQryCtx && !hasColConv && hasNamValChk: - return struct { - driver.Stmt - driver.NamedValueChecker - }{ws, wn} - case !hasExeCtx && hasQryCtx && !hasColConv && hasNamValChk: - return struct { - driver.Stmt - driver.StmtQueryContext - driver.NamedValueChecker - }{ws, ws, wn} - case hasExeCtx && !hasQryCtx && !hasColConv && hasNamValChk: - return struct { - driver.Stmt - driver.StmtExecContext - driver.NamedValueChecker - }{ws, ws, wn} - case hasExeCtx && hasQryCtx && !hasColConv && hasNamValChk: - return struct { - driver.Stmt - driver.StmtExecContext - driver.StmtQueryContext - driver.NamedValueChecker - }{ws, ws, ws, wn} - case !hasExeCtx && !hasQryCtx && hasColConv && hasNamValChk: - return struct { - driver.Stmt - driver.ColumnConverter - driver.NamedValueChecker - }{ws, wc, wn} - case !hasExeCtx && hasQryCtx && hasColConv && hasNamValChk: - return struct { - driver.Stmt - driver.StmtQueryContext - driver.ColumnConverter - driver.NamedValueChecker - }{ws, ws, wc, wn} - case hasExeCtx && !hasQryCtx && hasColConv && hasNamValChk: - return struct { - driver.Stmt - driver.StmtExecContext - driver.ColumnConverter - driver.NamedValueChecker - }{ws, ws, wc, wn} - case hasExeCtx && hasQryCtx && hasColConv && hasNamValChk: - return struct { - driver.Stmt - driver.StmtExecContext - driver.StmtQueryContext - driver.ColumnConverter - driver.NamedValueChecker - }{ws, ws, ws, wc, wn} - } - panic("unreachable") -} -*/ - // WrapConn allows an existing driver.Conn to be wrapped. func WrapConn(c driver.Conn, opts ...Option) driver.Conn { return wrapConn(c, NewOptions(opts...))