升级trace逻辑

This commit is contained in:
白茶清欢 2025-04-12 17:53:07 +08:00
parent 7b668e2e2f
commit 26e2419eba
2 changed files with 42 additions and 22 deletions

View File

@ -26,7 +26,9 @@ type Behavior struct {
Action string `json:"action"` // 行为 Action string `json:"action"` // 行为
Type string `json:"type"` // 行为记录类型 Type string `json:"type"` // 行为记录类型
Timestamp int64 `json:"timestamp"` // 触发行为的时间,纳秒时间戳 Timestamp int64 `json:"timestamp"` // 触发行为的时间,纳秒时间戳
Data map[string]interface{} `json:"data"` // 本次行为附带的数据 CostNano int64 `json:"cost_nano"` // 行为耗时,纳秒
CostMs int64 `json:"cost_ms"` // 行为耗时,毫秒
Data map[string]any `json:"data"` // 本次行为附带的数据
} }
// CallStack 调用堆栈 // CallStack 调用堆栈
@ -38,3 +40,5 @@ type CallStack struct {
FilePath string `json:"file_path"` // 文件路径 FilePath string `json:"file_path"` // 文件路径
LineNo int `json:"line_no"` // 所在行号 LineNo int `json:"line_no"` // 所在行号
} }
type LogicFunc func() error

View File

@ -53,9 +53,9 @@ type Runtime struct {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 23:41 2022/10/14 // Date : 23:41 2022/10/14
func (r *Runtime) StartBehavior(action string, data map[string]interface{}) int { func (r *Runtime) StartBehavior(action string, data map[string]any) *Behavior {
if nil == data { if nil == data {
data = make(map[string]interface{}) data = make(map[string]any)
} }
r.lock.Lock() r.lock.Lock()
defer r.lock.Unlock() defer r.lock.Unlock()
@ -68,7 +68,7 @@ func (r *Runtime) StartBehavior(action string, data map[string]interface{}) int
Data: data, Data: data,
} }
r.behaviorList = append(r.behaviorList, b) r.behaviorList = append(r.behaviorList, b)
return b.ID return &b
} }
// FinishBehavior 结束某一个行为 // FinishBehavior 结束某一个行为
@ -76,22 +76,25 @@ func (r *Runtime) StartBehavior(action string, data map[string]interface{}) int
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 23:53 2022/10/14 // Date : 23:53 2022/10/14
func (r *Runtime) FinishBehavior(behaviorID int, data map[string]interface{}) { func (r *Runtime) FinishBehavior(b *Behavior, data map[string]any) {
if nil == data { if nil == data {
data = make(map[string]interface{}) data = make(map[string]any)
} }
r.lock.Lock() r.lock.Lock()
defer r.lock.Unlock() defer r.lock.Unlock()
b := Behavior{ finishTimestamp := time.Now().UnixNano()
fb := Behavior{
ID: len(r.behaviorList), ID: len(r.behaviorList),
StartBehaviorID: behaviorID, StartBehaviorID: b.StartBehaviorID,
Stack: GetTraceFileInfo(r.stackOffset), Stack: GetTraceFileInfo(r.stackOffset),
Action: r.behaviorList[behaviorID].Action, Action: b.Action,
Type: BehaviorActionTypeFinish, Type: BehaviorActionTypeFinish,
Timestamp: time.Now().UnixNano(), Timestamp: finishTimestamp,
CostNano: finishTimestamp - b.Timestamp,
CostMs: (finishTimestamp - b.Timestamp) / 1e6,
Data: data, Data: data,
} }
r.behaviorList = append(r.behaviorList, b) r.behaviorList = append(r.behaviorList, fb)
} }
// WrapRun ... // WrapRun ...
@ -99,14 +102,27 @@ func (r *Runtime) FinishBehavior(behaviorID int, data map[string]interface{}) {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 00:17 2022/10/15 // Date : 00:17 2022/10/15
func (r *Runtime) WrapRun(action string, startData map[string]interface{}, logic func()) { func (r *Runtime) WrapRun(action string, startData map[string]any, logic LogicFunc) error {
if nil == logic { if nil == logic {
return return nil
} }
behaviorID := r.StartBehavior(action, startData) var (
err error
)
b := r.StartBehavior(action, startData)
// 执行逻辑 // 执行逻辑
logic() err = logic()
defer r.FinishBehavior(behaviorID, nil) finishData := map[string]any{}
if nil != err {
finishData["error"] = err.Error()
finishData["success"] = false
} else {
finishData["success"] = true
finishData["error"] = "success"
}
r.FinishBehavior(b, finishData)
return err
} }
// GetTraceID 获取 trace id // GetTraceID 获取 trace id