11package metrics
22
33import (
4+ "github.com/ydb-platform/ydb-go-sdk/v3/internal/xsync"
45 "time"
56
67 "github.com/ydb-platform/ydb-go-sdk/v3/trace"
@@ -9,174 +10,136 @@ import (
910// databaseSQL makes trace.DatabaseSQL with measuring `database/sql` events
1011//
1112//nolint:funlen
12- func databaseSQL (config Config ) ( t trace.DatabaseSQL ) {
13+ func databaseSQL (config Config ) trace.DatabaseSQL {
1314 config = config .WithSystem ("database" ).WithSystem ("sql" )
15+
1416 conns := config .GaugeVec ("conns" )
15- inflight := config . WithSystem ( "conns" ). GaugeVec ( "inflight" )
17+
1618 query := config .CounterVec ("query" , "status" , "query_mode" )
1719 queryLatency := config .WithSystem ("query" ).TimerVec ("latency" , "query_mode" )
20+
1821 exec := config .CounterVec ("exec" , "status" , "query_mode" )
1922 execLatency := config .WithSystem ("exec" ).TimerVec ("latency" , "query_mode" )
2023
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 )
24+ txs := config .GaugeVec ("tx" )
25+ txLatency := config .WithSystem ("tx" ).TimerVec ("latency" )
26+ txStart := xsync.Map [string , time.Time ]{}
27+
28+ return trace.DatabaseSQL {
29+ OnConnectorConnect : func (info trace.DatabaseSQLConnectorConnectStartInfo ) func (
30+ trace.DatabaseSQLConnectorConnectDoneInfo ,
31+ ) {
32+ if config .Details ()& trace .DatabaseSQLConnectorEvents != 0 {
33+ return func (info trace.DatabaseSQLConnectorConnectDoneInfo ) {
34+ if info .Error == nil {
35+ conns .With (nil ).Add (1 )
36+ }
3937 }
4038 }
41- }
4239
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 )
40+ return nil
41+ },
42+ OnConnClose : func (info trace.DatabaseSQLConnCloseStartInfo ) func (trace.DatabaseSQLConnCloseDoneInfo ) {
43+ if config .Details ()& trace .DatabaseSQLConnectorEvents != 0 {
44+ return func (info trace.DatabaseSQLConnCloseDoneInfo ) {
45+ conns .With (nil ).Add (- 1 )
46+ }
4947 }
50- }
5148
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 ))
49+ return nil
50+ },
51+ OnConnBegin : func (info trace.DatabaseSQLConnBeginStartInfo ) func (trace.DatabaseSQLConnBeginDoneInfo ) {
52+ if config . Details () & trace . DatabaseSQLTxEvents != 0 {
53+ return func ( info trace.DatabaseSQLConnBeginDoneInfo ) {
54+ if info . Error == nil {
55+ txs .With (nil ). Add ( 1 )
56+ txStart . Set (info .Tx . ID (), time . Now ())
57+ }
58+ }
6259 }
63- }
6460
65- return nil
66- }
67- t . OnConnBeginTx = func (info trace.DatabaseSQLConnBeginTxStartInfo ) func (trace.DatabaseSQLConnBeginTxDoneInfo ) {
68- start := time . Now ()
69- if config . Details () & trace .DatabaseSQLTxEvents != 0 {
70- return func ( info trace. DatabaseSQLConnBeginTxDoneInfo ) {
71- txBegin .With (map [ string ] string {
72- "status" : errorBrief (info .Error ),
73- }). Inc ()
74- txBeginLatency . With ( nil ). Record ( time . Since ( start ))
61+ return nil
62+ },
63+ OnConnBeginTx : func (info trace.DatabaseSQLConnBeginTxStartInfo ) func (trace.DatabaseSQLConnBeginTxDoneInfo ) {
64+ if config . Details () & trace . DatabaseSQLTxEvents != 0 {
65+ return func ( info trace.DatabaseSQLConnBeginTxDoneInfo ) {
66+ if info . Error == nil {
67+ txs .With (nil ). Add ( 1 )
68+ txStart . Set (info .Tx . ID (), time . Now ())
69+ }
70+ }
7571 }
76- }
7772
78- return nil
79- }
80- t . OnTxCommit = func (info trace.DatabaseSQLTxCommitStartInfo ) func (trace.DatabaseSQLTxCommitDoneInfo ) {
81- start := time . Now ( )
73+ return nil
74+ },
75+ OnTxCommit : func (info trace.DatabaseSQLTxCommitStartInfo ) func (trace.DatabaseSQLTxCommitDoneInfo ) {
76+ txs . With ( nil ). Add ( - 1 )
8277
83- return func (info trace.DatabaseSQLTxCommitDoneInfo ) {
84- if config .Details ()& trace .DatabaseSQLTxEvents != 0 {
85- txCommit .With (map [string ]string {
86- "status" : errorBrief (info .Error ),
87- }).Inc ()
88- txCommitLatency .With (nil ).Record (time .Since (start ))
78+ if start , has := txStart .Extract (info .Tx .ID ()); has {
79+ txLatency .With (nil ).Record (time .Since (start ))
8980 }
90- }
91- }
92- t .OnTxExec = func (info trace.DatabaseSQLTxExecStartInfo ) func (trace.DatabaseSQLTxExecDoneInfo ) {
93- start := time .Now ()
9481
95- return func (info trace.DatabaseSQLTxExecDoneInfo ) {
96- if config .Details ()& trace .DatabaseSQLTxEvents != 0 {
97- status := errorBrief (info .Error )
98- txExec .With (map [string ]string {
99- "status" : status ,
100- }).Inc ()
101- txExecLatency .With (nil ).Record (time .Since (start ))
102- }
103- }
104- }
105- t .OnTxQuery = func (info trace.DatabaseSQLTxQueryStartInfo ) func (trace.DatabaseSQLTxQueryDoneInfo ) {
106- start := time .Now ()
82+ return nil
83+ },
84+ OnTxRollback : func (info trace.DatabaseSQLTxRollbackStartInfo ) func (trace.DatabaseSQLTxRollbackDoneInfo ) {
85+ txs .With (nil ).Add (- 1 )
10786
108- return func (info trace.DatabaseSQLTxQueryDoneInfo ) {
109- if config .Details ()& trace .DatabaseSQLTxEvents != 0 {
110- status := errorBrief (info .Error )
111- txQuery .With (map [string ]string {
112- "status" : status ,
113- }).Inc ()
114- txQueryLatency .With (nil ).Record (time .Since (start ))
87+ if start , has := txStart .Extract (info .Tx .ID ()); has {
88+ txLatency .With (nil ).Record (time .Since (start ))
11589 }
116- }
117- }
118- t .OnTxRollback = func (info trace.DatabaseSQLTxRollbackStartInfo ) func (trace.DatabaseSQLTxRollbackDoneInfo ) {
119- start := time .Now ()
12090
121- return func (info trace.DatabaseSQLTxRollbackDoneInfo ) {
122- if config .Details ()& trace .DatabaseSQLTxEvents != 0 {
123- txRollback .With (map [string ]string {
124- "status" : errorBrief (info .Error ),
125- }).Inc ()
126- txRollbackLatency .With (nil ).Record (time .Since (start ))
127- }
128- }
129- }
130- t .OnConnExec = func (info trace.DatabaseSQLConnExecStartInfo ) func (trace.DatabaseSQLConnExecDoneInfo ) {
131- if config .Details ()& trace .DatabaseSQLEvents != 0 {
132- inflight .With (nil ).Add (1 )
133- }
134- var (
135- mode = info .Mode
136- start = time .Now ()
137- )
138-
139- return func (info trace.DatabaseSQLConnExecDoneInfo ) {
140- if config .Details ()& trace .DatabaseSQLEvents != 0 {
141- inflight .With (nil ).Add (- 1 )
142- }
143- if config .Details ()& trace .DatabaseSQLConnEvents != 0 {
144- status := errorBrief (info .Error )
145- exec .With (map [string ]string {
146- "status" : status ,
147- "query_mode" : mode ,
148- }).Inc ()
149- execLatency .With (map [string ]string {
150- "query_mode" : mode ,
151- }).Record (time .Since (start ))
152- }
153- }
154- }
155- t .OnConnQuery = func (info trace.DatabaseSQLConnQueryStartInfo ) func (trace.DatabaseSQLConnQueryDoneInfo ) {
156- if config .Details ()& trace .DatabaseSQLEvents != 0 {
157- inflight .With (nil ).Add (1 )
158- }
159- var (
160- mode = info .Mode
161- start = time .Now ()
162- )
163-
164- return func (info trace.DatabaseSQLConnQueryDoneInfo ) {
165- if config .Details ()& trace .DatabaseSQLEvents != 0 {
166- inflight .With (nil ).Add (- 1 )
91+ return nil
92+ },
93+ OnConnExec : func (info trace.DatabaseSQLConnExecStartInfo ) func (trace.DatabaseSQLConnExecDoneInfo ) {
94+ var (
95+ mode = info .Mode
96+ start = time .Now ()
97+ )
98+
99+ return func (info trace.DatabaseSQLConnExecDoneInfo ) {
100+ if config .Details ()& trace .DatabaseSQLConnEvents != 0 {
101+ status := errorBrief (info .Error )
102+ exec .With (map [string ]string {
103+ "status" : status ,
104+ "query_mode" : mode ,
105+ }).Inc ()
106+ execLatency .With (map [string ]string {
107+ "query_mode" : mode ,
108+ }).Record (time .Since (start ))
109+ }
167110 }
168- if config .Details ()& trace .DatabaseSQLConnEvents != 0 {
169- status := errorBrief (info .Error )
170- query .With (map [string ]string {
171- "status" : status ,
172- "query_mode" : mode ,
173- }).Inc ()
174- queryLatency .With (map [string ]string {
175- "query_mode" : mode ,
176- }).Record (time .Since (start ))
111+ },
112+ OnConnQuery : func (info trace.DatabaseSQLConnQueryStartInfo ) func (trace.DatabaseSQLConnQueryDoneInfo ) {
113+ var (
114+ mode = info .Mode
115+ start = time .Now ()
116+ )
117+
118+ return func (info trace.DatabaseSQLConnQueryDoneInfo ) {
119+ if config .Details ()& trace .DatabaseSQLConnEvents != 0 {
120+ status := errorBrief (info .Error )
121+ query .With (map [string ]string {
122+ "status" : status ,
123+ "query_mode" : mode ,
124+ }).Inc ()
125+ queryLatency .With (map [string ]string {
126+ "query_mode" : mode ,
127+ }).Record (time .Since (start ))
128+ }
177129 }
178- }
130+ },
131+ OnConnPing : nil ,
132+ OnConnPrepare : nil ,
133+ OnConnCheckNamedValue : nil ,
134+ OnConnIsTableExists : nil ,
135+ OnConnIsColumnExists : nil ,
136+ OnConnGetIndexColumns : nil ,
137+ OnTxExec : nil ,
138+ OnTxQuery : nil ,
139+ OnTxPrepare : nil ,
140+ OnStmtQuery : nil ,
141+ OnStmtExec : nil ,
142+ OnStmtClose : nil ,
143+ OnDoTx : nil ,
179144 }
180-
181- return t
182145}
0 commit comments