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 }