Skip to content

Commit 43cd76c

Browse files
committed
refactored metrics/sql
1 parent 3c730ab commit 43cd76c

File tree

1 file changed

+108
-145
lines changed

1 file changed

+108
-145
lines changed

metrics/sql.go

Lines changed: 108 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package metrics
22

33
import (
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

Comments
 (0)