forked from SpectatorNan/gorm-zero
-
Notifications
You must be signed in to change notification settings - Fork 0
/
metrics_plugin.go
101 lines (79 loc) · 2.45 KB
/
metrics_plugin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package gormc
import (
"github.com/zeromicro/go-zero/core/metric"
"gorm.io/gorm"
"time"
)
const metricsTimeKey = "metricsTime"
const metricsNamespace = "db"
type MetricsPlugin struct {
queryTimeHistogram metric.HistogramVec
errCount metric.CounterVec
sqlCount metric.CounterVec
}
func (o *MetricsPlugin) Name() string {
return "gorm_metrics"
}
func (o *MetricsPlugin) Initialize(db *gorm.DB) (err error) {
o.sqlCount = metric.NewCounterVec(&metric.CounterVecOpts{
Namespace: metricsNamespace,
Name: "sql_count",
Help: "sql request counter",
Labels: []string{"table"},
})
o.queryTimeHistogram = metric.NewHistogramVec(&metric.HistogramVecOpts{
Namespace: metricsNamespace,
Name: "sql_duration_ms",
Help: "sql request duration ms",
Labels: []string{"table"},
Buckets: []float64{5, 10, 20, 50, 100, 200, 500, 1000, 2000},
})
o.errCount = metric.NewCounterVec(&metric.CounterVecOpts{
Namespace: metricsNamespace,
Name: "sql_err_count",
Help: "sql err counter",
Labels: []string{"table"},
})
if err = db.Callback().Query().Before("*").Register("query_metrics_before", o.Before); err != nil {
return err
}
if err = db.Callback().Query().After("*").Register("query_metrics_after", o.After); err != nil {
return err
}
if err = db.Callback().Create().Before("*").Register("create_metrics_before", o.Before); err != nil {
return err
}
if err = db.Callback().Create().After("*").Register("create_metrics_after", o.After); err != nil {
return err
}
if err = db.Callback().Update().Before("*").Register("update_metrics_before", o.Before); err != nil {
return err
}
if err = db.Callback().Update().After("*").Register("update_metrics_after", o.After); err != nil {
return err
}
if err = db.Callback().Delete().Before("*").Register("delete_metrics_before", o.Before); err != nil {
return err
}
if err = db.Callback().Delete().After("*").Register("delete_metrics_after", o.After); err != nil {
return err
}
return
}
func (o *MetricsPlugin) Before(db *gorm.DB) {
now := time.Now()
db.InstanceSet(metricsTimeKey, now)
}
func (o *MetricsPlugin) After(db *gorm.DB) {
value, ok := db.InstanceGet(metricsTimeKey)
if !ok {
return
}
startTime := value.(time.Time)
sqlTime := time.Since(startTime).Milliseconds()
o.queryTimeHistogram.Observe(sqlTime, db.Statement.Table)
o.sqlCount.Inc(db.Statement.Table)
if db.Error != nil {
o.errCount.Inc(db.Statement.Table)
}
}