golang 通用指标框架之数据展示-代码约束
2022-09-29
golang and metric
1. 任务定义
通过对任务属性抽象和集合, 将任务定义分为, meta信息, 任务周期信息, 插件信息,任务执行动态信息
- meta信息: 主要就是任务名字,状态
- 任务周期信息: 周期类型,周期计算方式,需要计算的周期数
- 插架信息: 任务需要使用到插件及插件的配置
- 任务执行动态信息: 任务开始周期,最后一次执行完成时间
type MetricTask struct {
// 任务的名字,同时也是指标名字
TaskName string `json:"task_name" gorm:"column:task_name"`
// 指标周期(1年,2季,3月,4周,5日,6时)(接口必须)
TaskCycle int8 `json:"task_cycle" gorm:"column:task_cycle"`
// 周期执行方式,1 周期结束后执行,2周期中每天计算一次
CycleMode CycleModeType `json:"cycle_mode" gorm:"column:cycle_mode"`
CalculateCycle uint8 `json:"calculate_cycle" gorm:"column:calculate_cycle"`
// 任务状态, 1 正常,可以允许, 2. 暂停,不被执行 3. 待删除
TaskStatus StatusEnumType `json:"task_status" gorm:"column:task_status"`
// TaskStart 任务采集数据的开始时间, 有start+cycle 可以得到结束时间
TaskStart uint64 `json:"task_start" gorm:"column:task_start"`
Collect MetricTaskPluginCollectConfig `json:"collect" gorm:"column:collect"`
Filters MetricTaskPluginConfigArr `json:"filters" gorm:"column:filters"`
Aggregators MetricTaskPluginAggregatorConfigArr `json:"aggregators" gorm:"column:aggregators"`
// Output 使用到output 插件
Output MetricTaskPluginOutputConfig `json:"output" gorm:"column:output"`
//Power MetricPower `json:"power" gorm:"column:power"`
// LastFinishTime 任务上一次完成时间
LastFinishTime uint64 `json:"last_finish_time" gorm:"column:last_finish_time"`
// OutputIndexName 存储output 插件返回存储的信息
OutputIndexName string `json:"output_index_name" gorm:"column:output_index_name"`
}
2. 插架之间数据交换约束
将任务执行分为数据处理和存储两个阶段。
- 数据处理:包含获取周期内数据,数据过滤,数据聚合
- 存储结果:将指标和符合指标数据持久化
2.1 数据处理约束-Record
用来约束collect,filter,aggregator之间数据交换。
- Data() 是用来做数据对比的数据
- Update() 用来提供对原始更新,设计上是留给filter来做数据处理
- Field() 用来做统计的数据
- UUID() 框架中用来做数据去重使用
type Record interface {
Data() map[string]string
Update(key, value string) error
Field() map[string]float64
UUID() string
}
2.2 存储结果约束-MetricData
传给output 插件的数据,计算的结果数据
// MetricData 计算产生的数据
type MetricData struct {
MetricKey string
Value map[string]float64 `json:"value"`
Extra map[string]interface{} `json:"extra"`
}
3. 插架约束
代码位置 define.go 实现自定义插件的时候,需要实现的代码约束
// Collect 收集数据插件
type Collect interface {
// Name 插件的名字,必须全局唯一
Name() string
// Keys 用做计算的维度,可以任务是group by 中分组的名字
Keys(ctx context.Context) ([]string, error)
// Run 执行统计任务, 这个有框架控制并发执行的
Run(ctx context.Context, key string, start, end uint64, input chan Record) error
// SetConfig 修改配置
SetConfig(ctx context.Context, config []byte) error
// Description 用来描述配置
Description() string
// GetHooks 获取注入插件,用来放到流程不同流程执行
//GetHooks() Hooks
}
// Filter data transform
type Filter interface {
// Name 插件的名字,必须全局唯一
Name() string
// Run 执行
Run(ctx context.Context, key string, data Record) error
// SetConfig 初始化的时候,用来放入配置
SetConfig(ctx context.Context, config []byte) error
// Description 用来描述配置
Description() string
}
// Aggregator calculate metric
type Aggregator interface {
// Name 插件的名字,必须全局唯一
Name() string
// Run 执行
Run(ctx context.Context, key string, data Record) error
// SetConfig 初始化的时候,用来放入配置
SetConfig(ctx context.Context, config []byte) error
// Description 用来描述配置
Description() string
// Metric 存储的时候,获取当前插件计算的值
Metric(ctx context.Context) (string, float64)
MetricExtra(ctx context.Context) (string, interface{}, bool)
SetMetricMetadata(ctx context.Context, data MetricMetadata) error
}
// Output record to storage
type Output interface {
// Name 插件的名字,必须全局唯一
Name() string
// Write 输出数据到目标
Write(ctx context.Context, data OutputData) error
// Exists 判断key 在周期内是否已经执行过,任务分片后,判断是否需要跳过的依据
Exists(ctx context.Context, metricKey string) (bool, error)
// Description 用来描述配置
Description() string
// IndexName string
IndexName(ctx context.Context) (string, error)
SetMetricMetadata(ctx context.Context, data MetricMetadata) error
}