github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/metrics/sql.go (about)

     1  package metrics
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/ydb-platform/ydb-go-sdk/v3/trace"
     7  )
     8  
     9  // databaseSQL makes trace.DatabaseSQL with measuring `database/sql` events
    10  //
    11  //nolint:funlen
    12  func databaseSQL(config Config) (t trace.DatabaseSQL) {
    13  	config = config.WithSystem("database").WithSystem("sql")
    14  	conns := config.GaugeVec("conns")
    15  	inflight := config.WithSystem("conns").GaugeVec("inflight")
    16  	query := config.CounterVec("query", "status", "query_mode")
    17  	queryLatency := config.WithSystem("query").TimerVec("latency", "query_mode")
    18  	exec := config.CounterVec("exec", "status", "query_mode")
    19  	execLatency := config.WithSystem("exec").TimerVec("latency", "query_mode")
    20  
    21  	config = config.WithSystem("tx")
    22  	txBegin := config.CounterVec("begin", "status")
    23  	txBeginLatency := config.WithSystem("begin").TimerVec("latency")
    24  	txExec := config.CounterVec("exec", "status")
    25  	txExecLatency := config.WithSystem("exec").TimerVec("latency")
    26  	txQuery := config.CounterVec("query", "status")
    27  	txQueryLatency := config.WithSystem("query").TimerVec("latency")
    28  	txCommit := config.CounterVec("commit", "status")
    29  	txCommitLatency := config.WithSystem("commit").TimerVec("latency")
    30  	txRollback := config.CounterVec("rollback", "status")
    31  	txRollbackLatency := config.WithSystem("rollback").TimerVec("latency")
    32  	t.OnConnectorConnect = func(info trace.DatabaseSQLConnectorConnectStartInfo) func(
    33  		trace.DatabaseSQLConnectorConnectDoneInfo,
    34  	) {
    35  		if config.Details()&trace.DatabaseSQLConnectorEvents != 0 {
    36  			return func(info trace.DatabaseSQLConnectorConnectDoneInfo) {
    37  				if info.Error == nil {
    38  					conns.With(nil).Add(1)
    39  				}
    40  			}
    41  		}
    42  
    43  		return nil
    44  	}
    45  	t.OnConnClose = func(info trace.DatabaseSQLConnCloseStartInfo) func(trace.DatabaseSQLConnCloseDoneInfo) {
    46  		if config.Details()&trace.DatabaseSQLConnectorEvents != 0 {
    47  			return func(info trace.DatabaseSQLConnCloseDoneInfo) {
    48  				conns.With(nil).Add(-1)
    49  			}
    50  		}
    51  
    52  		return nil
    53  	}
    54  	t.OnConnBegin = func(info trace.DatabaseSQLConnBeginStartInfo) func(trace.DatabaseSQLConnBeginDoneInfo) {
    55  		start := time.Now()
    56  		if config.Details()&trace.DatabaseSQLTxEvents != 0 {
    57  			return func(info trace.DatabaseSQLConnBeginDoneInfo) {
    58  				txBegin.With(map[string]string{
    59  					"status": errorBrief(info.Error),
    60  				}).Inc()
    61  				txBeginLatency.With(nil).Record(time.Since(start))
    62  			}
    63  		}
    64  
    65  		return nil
    66  	}
    67  	t.OnTxCommit = func(info trace.DatabaseSQLTxCommitStartInfo) func(trace.DatabaseSQLTxCommitDoneInfo) {
    68  		start := time.Now()
    69  
    70  		return func(info trace.DatabaseSQLTxCommitDoneInfo) {
    71  			if config.Details()&trace.DatabaseSQLTxEvents != 0 {
    72  				txCommit.With(map[string]string{
    73  					"status": errorBrief(info.Error),
    74  				}).Inc()
    75  				txCommitLatency.With(nil).Record(time.Since(start))
    76  			}
    77  		}
    78  	}
    79  	t.OnTxExec = func(info trace.DatabaseSQLTxExecStartInfo) func(trace.DatabaseSQLTxExecDoneInfo) {
    80  		start := time.Now()
    81  
    82  		return func(info trace.DatabaseSQLTxExecDoneInfo) {
    83  			if config.Details()&trace.DatabaseSQLTxEvents != 0 {
    84  				status := errorBrief(info.Error)
    85  				txExec.With(map[string]string{
    86  					"status": status,
    87  				}).Inc()
    88  				txExecLatency.With(nil).Record(time.Since(start))
    89  			}
    90  		}
    91  	}
    92  	t.OnTxQuery = func(info trace.DatabaseSQLTxQueryStartInfo) func(trace.DatabaseSQLTxQueryDoneInfo) {
    93  		start := time.Now()
    94  
    95  		return func(info trace.DatabaseSQLTxQueryDoneInfo) {
    96  			if config.Details()&trace.DatabaseSQLTxEvents != 0 {
    97  				status := errorBrief(info.Error)
    98  				txQuery.With(map[string]string{
    99  					"status": status,
   100  				}).Inc()
   101  				txQueryLatency.With(nil).Record(time.Since(start))
   102  			}
   103  		}
   104  	}
   105  	t.OnTxRollback = func(info trace.DatabaseSQLTxRollbackStartInfo) func(trace.DatabaseSQLTxRollbackDoneInfo) {
   106  		start := time.Now()
   107  
   108  		return func(info trace.DatabaseSQLTxRollbackDoneInfo) {
   109  			if config.Details()&trace.DatabaseSQLTxEvents != 0 {
   110  				txRollback.With(map[string]string{
   111  					"status": errorBrief(info.Error),
   112  				}).Inc()
   113  				txRollbackLatency.With(nil).Record(time.Since(start))
   114  			}
   115  		}
   116  	}
   117  	t.OnConnExec = func(info trace.DatabaseSQLConnExecStartInfo) func(trace.DatabaseSQLConnExecDoneInfo) {
   118  		if config.Details()&trace.DatabaseSQLEvents != 0 {
   119  			inflight.With(nil).Add(1)
   120  		}
   121  		var (
   122  			mode  = info.Mode
   123  			start = time.Now()
   124  		)
   125  
   126  		return func(info trace.DatabaseSQLConnExecDoneInfo) {
   127  			if config.Details()&trace.DatabaseSQLEvents != 0 {
   128  				inflight.With(nil).Add(-1)
   129  			}
   130  			if config.Details()&trace.DatabaseSQLConnEvents != 0 {
   131  				status := errorBrief(info.Error)
   132  				exec.With(map[string]string{
   133  					"status":     status,
   134  					"query_mode": mode,
   135  				}).Inc()
   136  				execLatency.With(map[string]string{
   137  					"query_mode": mode,
   138  				}).Record(time.Since(start))
   139  			}
   140  		}
   141  	}
   142  	t.OnConnQuery = func(info trace.DatabaseSQLConnQueryStartInfo) func(trace.DatabaseSQLConnQueryDoneInfo) {
   143  		if config.Details()&trace.DatabaseSQLEvents != 0 {
   144  			inflight.With(nil).Add(1)
   145  		}
   146  		var (
   147  			mode  = info.Mode
   148  			start = time.Now()
   149  		)
   150  
   151  		return func(info trace.DatabaseSQLConnQueryDoneInfo) {
   152  			if config.Details()&trace.DatabaseSQLEvents != 0 {
   153  				inflight.With(nil).Add(-1)
   154  			}
   155  			if config.Details()&trace.DatabaseSQLConnEvents != 0 {
   156  				status := errorBrief(info.Error)
   157  				query.With(map[string]string{
   158  					"status":     status,
   159  					"query_mode": mode,
   160  				}).Inc()
   161  				queryLatency.With(map[string]string{
   162  					"query_mode": mode,
   163  				}).Record(time.Since(start))
   164  			}
   165  		}
   166  	}
   167  
   168  	return t
   169  }