# trace组件工作流程

## 正常流程

1. Trace Server的Task Manager的页面会展示出从Falcon server获取到的节点列表
2. 选中1个或多个节点，创建trace任务，任务参数包含任务id，任务名，开始时间，结束时间，交易hash等条件
3. 创建任务通过调用TraceServer的接口实现，创建成功后Trace Server返回结果，Task Manager将任务信息写入数据库。
4. Trace Server通过RPC方式与Trace Client通信，进而控制Trace Plugin的开启和关闭，以及获取Trace Plugin上报的数据并存储到对应任务目录的文件中。
5. Trace Server还提供任务内容的查询接口，以便前端展示内容。

![模块调用图](./resources/module_call.png)

## 异常流程

在出现任务相关节点异常退出或网络断开等情况时，一旦恢复正常，能够及时更新节点trace状态。

1.某个任务正在执行，该任务中的一个或多个节点异常退出，一段时间后恢复，Trace Server检测到Trace Client启动后，恢复上报功能。

2.某个任务正在执行，该任务中的一个或多个节点网络连接断开，收到停止任务命令，网络恢复后，停止对应节点的上报功能。

3.某个节点网络连接断开，创建包含该节点的trace任务，网络恢复后，启动上报功能。

## 详细设计
### 任务状态和任务类型定义

```go
type TaskStatus int
type TaskType int

const (
   TSCreated TaskStatus = 1 + iota //已创建未执行
   TSRunning                   //正在执行
   TSStopped                   //已停止
   //TSRemoved                   //已删除
)

const (
   TTTransaction TaskType = 1 + iota //交易
)
```

### 接口定义
#### Task Server

```go
type ReplyTraceList struct {
	Partion   int64
	Index     int64
	Node      string
	TraceList []*TraceInfo 
}
//创建任务
func CreateTask(ctx context.Context,taskId string, ty TaskType, taskName string, nodeList []string, condition map[string]string) error
//开始任务
func StartTask(ctx context.Context,taskId string) error
//停止任务
func StopTask(ctx context.Context,taskId string) error
//删除任务
func DeleteTask(ctx context.Context,taskId string) error
//查询任务状态
func QueryTaskStatus(ctx context.Context,taskId string) TaskStatus
//查询任务列表，返回任务id及对应状态
func QueryTaskList(ctx context.Context) map[string]TaskStatus
//查询跟踪信息
func QueryTraceList(ctx context.Context, taskId string) *ReplyTraceList
```

#### Trace Plugin

```go
type TaskDictionary struct {
	hashMap map[int64]string
}
//开始任务
func StartTask(ctx context.Context, taskId string, condition map[string]string) error
//停止任务
func StopTask(ctx context.Context, taskId string) error
//删除任务
func DeleteTask(ctx context.Context, taskId string) error
//查询任务，返回该任务对应的字典
func QueryTask(ctx context.Context, taskId string) TaskDictionary
```

map参数为过滤条件，比如只需要某个交易hash的信息，参数就可以是（"Txhash"，“xxxxxxxxx”）；或者只要打印mempool模块的信息，参数就可以是（“module”，“mempool”）；两个条件同时满足（"Txhash"，“xxxxxxxxx”，“module”，“mempool”）；目前一个任务的条件是"与"的关系，如果要创建"或"关系的条件，需要创建新任务。