升级trace追踪 #1
18
define.go
18
define.go
@ -20,13 +20,15 @@ const (
|
|||||||
//
|
//
|
||||||
// Date : 23:10 2022/10/14
|
// Date : 23:10 2022/10/14
|
||||||
type Behavior struct {
|
type Behavior struct {
|
||||||
ID int `json:"id"` // 行为ID
|
ID int `json:"id"` // 行为ID
|
||||||
StartBehaviorID int `json:"start_behavior_id"` // 开始行为的ID,仅对 finish 类型的行为有效
|
StartBehaviorID int `json:"start_behavior_id"` // 开始行为的ID,仅对 finish 类型的行为有效
|
||||||
Stack CallStack `json:"stack"` // 调用堆栈信息
|
Stack CallStack `json:"stack"` // 调用堆栈信息
|
||||||
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
|
||||||
|
46
runtime.go
46
runtime.go
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user