/
todb.go
104 lines (92 loc) · 2.47 KB
/
todb.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
102
103
104
package db
import (
"time"
"github.com/asaskevich/EventBus"
"github.com/techquest-tech/gin-shared/pkg/core"
"github.com/techquest-tech/gin-shared/pkg/orm"
"github.com/techquest-tech/monitor"
"go.uber.org/zap"
"gorm.io/gorm"
)
type FullRequestDetails struct {
gorm.Model
Optionname string `gorm:"size:64"`
Operator string `gorm:"size:64"`
Uri string `gorm:"size:256"`
Method string `gorm:"size:16"`
Body []byte
Durtion time.Duration
Status int
TargetID uint
Resp []byte
ClientIP string `gorm:"size:64"`
UserAgent string `gorm:"size:256"`
Device string `gorm:"size:64"`
}
type TracingRequestServiceDBImpl struct {
DB *gorm.DB
Logger *zap.Logger
}
func NewTracingRequestService(db *gorm.DB, logger *zap.Logger) (*TracingRequestServiceDBImpl, error) {
tr := &TracingRequestServiceDBImpl{
DB: db,
Logger: logger,
}
// orm.AppendEntity(&FullRequestDetails{})
return tr, nil
}
func SubEventToDB(tr *TracingRequestServiceDBImpl, bus EventBus.Bus) {
bus.SubscribeAsync(core.EventTracing, tr.doLogRequestBody, false)
}
func (tr *TracingRequestServiceDBImpl) doLogRequestBody(req *monitor.TracingDetails) {
if req.Body == nil && req.Resp == nil {
tr.Logger.Debug("both req & resp is emtpy, ignored.")
return
}
if bts, ok := req.Body.([]byte); ok {
if resp, ok := req.Resp.([]byte); ok {
if len(bts) == 0 && len(resp) == 0 {
tr.Logger.Debug("request body is empty, ignored.")
return
}
}
}
if body, ok := req.Body.(string); ok {
if body == "" {
if resp, ok := req.Resp.(string); ok {
if resp == "" {
tr.Logger.Debug("request body is empty, ignored.")
return
}
}
}
}
model := FullRequestDetails{
Optionname: req.Optionname,
Operator: req.Operator,
Uri: req.Uri,
Method: req.Method,
Body: monitor.ToByte(req.Body),
Durtion: req.Durtion,
Status: req.Status,
TargetID: req.TargetID,
Resp: monitor.ToByte(req.Resp),
ClientIP: req.ClientIP,
UserAgent: req.UserAgent,
Device: req.Device,
}
err := tr.DB.Save(&model).Error
if err != nil {
tr.Logger.Error("save reqest failed", zap.Error(err))
return
}
tr.Logger.Info("save request details done.", zap.Uint("targetID", req.TargetID))
}
func EnableDBMonitor() {
orm.AppendEntity(&FullRequestDetails{})
core.Provide(NewTracingRequestService)
core.ProvideStartup(func(dbm *TracingRequestServiceDBImpl, bus EventBus.Bus) core.Startup {
SubEventToDB(dbm, bus)
return nil
})
}