diff --git a/define.go b/define.go index d186cb3..458fed8 100644 --- a/define.go +++ b/define.go @@ -20,13 +20,15 @@ const ( // // Date : 23:10 2022/10/14 type Behavior struct { - ID int `json:"id"` // 行为ID - StartBehaviorID int `json:"start_behavior_id"` // 开始行为的ID,仅对 finish 类型的行为有效 - Stack CallStack `json:"stack"` // 调用堆栈信息 - Action string `json:"action"` // 行为 - Type string `json:"type"` // 行为记录类型 - Timestamp int64 `json:"timestamp"` // 触发行为的时间,纳秒时间戳 - Data map[string]interface{} `json:"data"` // 本次行为附带的数据 + ID int `json:"id"` // 行为ID + StartBehaviorID int `json:"start_behavior_id"` // 开始行为的ID,仅对 finish 类型的行为有效 + Stack CallStack `json:"stack"` // 调用堆栈信息 + Action string `json:"action"` // 行为 + Type string `json:"type"` // 行为记录类型 + Timestamp int64 `json:"timestamp"` // 触发行为的时间,纳秒时间戳 + CostNano int64 `json:"cost_nano"` // 行为耗时,纳秒 + CostMs int64 `json:"cost_ms"` // 行为耗时,毫秒 + Data map[string]any `json:"data"` // 本次行为附带的数据 } // CallStack 调用堆栈 @@ -38,3 +40,5 @@ type CallStack struct { FilePath string `json:"file_path"` // 文件路径 LineNo int `json:"line_no"` // 所在行号 } + +type LogicFunc func() error diff --git a/runtime.go b/runtime.go index 4cb11fd..4ffd8f9 100644 --- a/runtime.go +++ b/runtime.go @@ -53,9 +53,9 @@ type Runtime struct { // Author : go_developer@163.com<白茶清欢> // // 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 { - data = make(map[string]interface{}) + data = make(map[string]any) } r.lock.Lock() defer r.lock.Unlock() @@ -68,7 +68,7 @@ func (r *Runtime) StartBehavior(action string, data map[string]interface{}) int Data: data, } r.behaviorList = append(r.behaviorList, b) - return b.ID + return &b } // FinishBehavior 结束某一个行为 @@ -76,22 +76,25 @@ func (r *Runtime) StartBehavior(action string, data map[string]interface{}) int // Author : go_developer@163.com<白茶清欢> // // 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 { - data = make(map[string]interface{}) + data = make(map[string]any) } r.lock.Lock() defer r.lock.Unlock() - b := Behavior{ + finishTimestamp := time.Now().UnixNano() + fb := Behavior{ ID: len(r.behaviorList), - StartBehaviorID: behaviorID, + StartBehaviorID: b.StartBehaviorID, Stack: GetTraceFileInfo(r.stackOffset), - Action: r.behaviorList[behaviorID].Action, + Action: b.Action, Type: BehaviorActionTypeFinish, - Timestamp: time.Now().UnixNano(), + Timestamp: finishTimestamp, + CostNano: finishTimestamp - b.Timestamp, + CostMs: (finishTimestamp - b.Timestamp) / 1e6, Data: data, } - r.behaviorList = append(r.behaviorList, b) + r.behaviorList = append(r.behaviorList, fb) } // WrapRun ... @@ -99,14 +102,27 @@ func (r *Runtime) FinishBehavior(behaviorID int, data map[string]interface{}) { // Author : go_developer@163.com<白茶清欢> // // 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 { - return + return nil } - behaviorID := r.StartBehavior(action, startData) + var ( + err error + ) + + b := r.StartBehavior(action, startData) // 执行逻辑 - logic() - defer r.FinishBehavior(behaviorID, nil) + err = logic() + 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